如何让requests不做urlencode
2018-09-11 本文已影响351人
小温侯
今天遇到一个很蛋疼的事情,在爬某个网站的时候它的访问参数中带有sign字段,靠着9分运气1分实力终于找到了sign的计算方法,但是还是访问不成功。
最后实在没办法,去抓了个包和正常时候访问的包比对了一下,发现关键词被做了两次urlencode。
因为这个是个搜索页面,一般当搜索关键词是中文或者某些特殊字符,同时又使用了params作为requests.get的参数时,requests会对其进行一次urlencode。这里出问题的原因是在计算sign时用了urlencode之后的关键词,因此才会有urlecode两次的情况出现。
于是我去查了一下,如果在requests.get的不进行urlencode操作。其实requests.post也有类似的问题,官网中所述的解决方法是用字符串代替字典来作为payload的值;回到requests.get,有几种方法:
- 用curl来发送,然后用
os.system('curl .....')
来进行访问。(不推荐) - requests.get只会对params参数的值进行urlencode,因此不使用params参数,直接自己构造url,但这种方法有个不好的地方就是一旦关键词里带如'&', '='的字符就会出错。我这里只有一个关键词字段有可能出现这个问题,所以我在对其进行了特殊处理后,用了这个方法:
query_string = '&'.join(["{}={}".format(k, v) for k, v in params.items()])
url = "old_url?{}".format(query_string)
rep = requests.get(url)
- 还有一种方法是在headers中加上
"Content-Type": "application/x-www-form-urlencoded
, 个人不建议爬虫这么写,毕竟爬虫要尽量和真实情况下的报文保持一致。