美文网首页
如何让requests不做urlencode

如何让requests不做urlencode

作者: 小温侯 | 来源:发表于2018-09-11 19:57 被阅读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, 个人不建议爬虫这么写,毕竟爬虫要尽量和真实情况下的报文保持一致。

    相关文章

      网友评论

          本文标题:如何让requests不做urlencode

          本文链接:https://www.haomeiwen.com/subject/tfqpgftx.html