python爬虫,处理POST请求

我们在python爬虫写脚本时,往往会遇到些问题,小编前几天也遇到了个小问题。在这里想跟大家分享下,以免大家走更多的弯路
列如我要去有道翻译,去爬取我们自己所翻译的东西。

import urllib.request
import urllib.parse

url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"}
formdata={
"i":" 加油",
"from":" AUTO",
"to": "AUTO",
"smartresult":"dict",
"client": "fanyideskweb",
"salt":" 15687710834733",
"sign": "d0b955f562cc4dfa3d33448f438b09b1",
"ts": "1568771083473",
"bv": "53850875da92527c18a78e804f4c65b4",
"doctype":"json",
"version":" 2.1",
"keyfrom": "fanyi.web",
"action":" FY_BY_CLICKBUTTION",
"typoResult": "true"}
data=bytes(urllib.parse.urlencode(formdata).encode('utf-8'))
request=urllib.request.Request(url,data=data,headers=headers)
response=urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

脚本其实大家都会,但是随着脚本和反爬虫的机制也在更新。
问题1,大家写完脚本会出现{"errorCode":50}这样的错误。原因是我们给的Request URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
只需要将改成Request URL: http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule即可解决
问题2,有的同学看质料上写,会出现以下类似问题。
python爬虫,处理POST请求_第1张图片
其实,你写的代码根本就没有这么多,但它给我报错以下多少多少行出错。这个问题大多数都是那个地方少标识符
还是以上题为列

headers={"User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"}

改成

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"}

如果你用Chrome浏览器,点击右键“检查", 再点击"network", 你就会发现真正处理翻译并返回翻译结果的url是http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule。你还会了解发送请求的方式是POST,返回的相应数据是JSON格式。如果请求方式是POST,我们一定还要了解POST什么数据,服务器才会返回正确的响应(Response)。
如果你继续下拉Headers页面,你就会发现需要POST的数据Form Data里不仅包含了我们需要翻译的词(i), 还包括其它加密用的salt和签名字符串sign。我们在请求里必需把这些data加进去,有道才会返回翻译结果。这就是明显的反爬机制啊。当然高人无处不在,弄清了salt和sign的生成原理,就可以轻易破解有道的反爬机制了。

你可能感兴趣的:(POST)