【问题标题】:Facing urlencoding issue while processing request处理请求时面临 urlencoding 问题
【发布时间】:2017-10-24 07:15:00
【问题描述】:

我用 python 编写了一个脚本来从网页中抓取一些信息。该站点需要get 请求方法。我现在面临的问题是parameters 需要与url 合并,所以它应该是urlencoded。这就是我卡住的地方。我无法正确对其进行编码以获得有效响应。我试了一下,没有任何效果

我正在尝试的脚本:

import requests
import urllib.parse

fields ={
'/API/api/v1/Search/Properties/?f':'319 lizzie','ty':'2018','pvty':'2017','pn':'1','st':'9','so':'1','pt':'RP;PP;MH;NR','take':'20','skip':'0','page':'1','pageSize':'20'
}
payload = urllib.parse.quote_plus(fields, safe='', encoding=None, errors=None)

headers={
"User-Agent":"Mozilla/5.0"
}

page = requests.get("http://search.wcad.org/Proxy/APIProxy.ashx?", params=payload, headers=headers)
print(page.json())

上面的网址应该是这样的:

http://search.wcad.org/Proxy/APIProxy.ashx?/API/api/v1/Search/Properties/?f=319%20LIZZIE&ty=2018&pvty=2017&pn=1&st=9&so=1&pt=RP%3BPP%3BMH%3BNR&take=20&skip=0&page=1&pageSize=20

得到响应。

顺便说一句,这是我在现有脚本中遇到的错误:

Traceback (most recent call last):
  File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\Social.py", line 9, in <module>
    payload = urllib.parse.quote_plus(fields, safe='', encoding=None, errors=None)
  File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\lib\urllib\parse.py", line 728, in quote_plus
    string = quote(string, safe + space, encoding, errors)
  File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\lib\urllib\parse.py", line 712, in quote
    return quote_from_bytes(string, safe)
  File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\lib\urllib\parse.py", line 737, in quote_from_bytes
    raise TypeError("quote_from_bytes() expected bytes")
TypeError: quote_from_bytes() expected bytes

【问题讨论】:

  • 你不需要手动连接你的参数。只需将字典放入paramsrequests.get(url, params=&lt;your params' dict&gt;).
  • @Sraw,我在发布这个问题之前首先做到了。事实上,我检查了page.url 以找出我的脚本产生的url。当我发现它产生了错误的网址时,我想出了上面的尝试。一切都在上面,所以请不要给出任何假设的解决方案。
  • 只要给我们你想要的整个网址。

标签: python python-3.x web-scraping get urlencode


【解决方案1】:

这行得通。正如the documentation 所指出的,不需要自己进行任何 URL 编码。

关键是查询字符串从最后一个问号开始,而不是从第一个问号开始。在 URL 中包含第二个问号是强制性的,因为requests 只会在没有问号时添加一个。

import requests

url = "http://search.wcad.org/Proxy/APIProxy.ashx?/API/api/v1/Search/Properties/?"
params = {'f':'319 lizzie','ty':'2018','pvty':'2017','pn':'1','st':'9','so':'1','pt':'RP;PP;MH;NR','take':'20','skip':'0','page':'1','pageSize':'20'}

response = requests.get(url, params)

response.json()

结果

{ “结果列表”:[{ 'PropertyQuickRefID': 'R016698', 'PartyQuickRefID': 'O0485204', 'OwnerQuickRefID': 'R016698', 'LegacyID':无, 'PropertyNumber': 'R-13-0410-0620-50000', 'OwnerName': 'GOOCH, PHILIP L', 'SitusAddress':'319 LIZZIE ST,TAYLOR,TX 76574', “属性值”:46785.0, 'LegalDescription': 'DOAK 添加,第 62 块,第 5 批', 'NeighborhoodCode': 'T541', “摘要”:无, '细分': 'S3564 - Doak 加法', 'PropertyType':'真实', “身份证”:0, “文本”:无, “纳税年度”:2018 年, 'PropertyValueTaxYear':2017 }], “有更多数据”:错误, “总页数”:1, “当前页面”:1, '记录计数':1, 'SearchText': '319 莉齐', 'PagingHandledByCaller':错误, “纳税年度”:2018 年, 'PropertyValueTaxYear':0 }

【讨论】:

  • 我很不高兴我无法为您的解决方案投票数百万次。这确实是一个很大的解脱。感谢一万亿。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多