小白日志:python爬有道遇到的一些问题

 本人小白一只。开始学习Python已经几个月了,但是之前一直没有时间研究。最近学爬虫,拿有道试手(之前看小甲鱼的课爬过,感觉不是很难,这回自己上手试试),正好碰到一些问题,想拿出来分享一下,也作一个学习过程的记录。
 因为不是很懂,所以在写代码的时候就把data和headers基本都写上了。有道的网站是有salt和sign的反爬虫机制的,我在写这串代码的时候其实并不是很了解,也运行出来了,我怀疑我遇到的这几个问题应该就和没有考虑反爬虫机制有关系吧。


import urllib.request as r
import urllib.parse as p
import json

url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
i=input("翻译内容:")

#定义data包
data={} 
data['i']='%s'%i
data['from']='AUTO'
data['to']='AUTO'
data['smartresult']='dict'
data['client']='fanyideskweb'
data['doctype']='json'
data['version']='2.1'
data['keyfro']='fanuyi.web'
data['action']='FY_BY_REALTIME'
data['typoResult']='true'
 #转码
j=p.urlencode(data).encode('utf-8')

#定义请求头
headers={}
headers['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
headers['Accept-Language']='zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7'
headers['Accept']='application/json, text/javascript, */*; q=0.01'
headers['Connection']='keep-alive'
headers['Cookie']='OUTFOX_SEARCH_USER_ID=570876224@10.168.8.63; JSESSIONID=aaa0S6NxijegF_juonayw; OUTFOX_SEARCH_USER_ID_NCOO=1020010596.3231378; ___rl__test__cookies=1537601781793'
headers['Origin']='http://fanyi.youdao.com'
headers['Referer']='http://fanyi.youdao.com/'
headers['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
headers['X-Requested-With']='XMLHttpRequest'
headers['Host']='fanyi.youdao.com'

#加了这句就不能汉译英了
#headers['Content-Type']='application/x-www-form-urlencoded; charset=UTF-8'

获取相应
request=r.Request(url,data=j,headers=headers)
response=r.urlopen(request)
html=json.loads(response.read())
print(html)
#整理输出
print(html['translateResult'][0][0]['tgt'])

遇到的问题

请求网址不正确

一开始使用的是网页查看器上给出的网址:

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

结果是

{'errorCode': 50}

 后来看网上说要把网址中的***"_o"***删掉才行,我试了一下确实如此。
 于是就很奇怪了,这个网址不是网站把信息发过去的网址吗,既然爬虫就是通过模拟浏览器来获取相应的,为什么我们用这个浏览器发请求的网址会是错的呢,以后爬别的网站的时候又改怎么分辨呢?

英译汉成功,但是汉译英返回“???”

 我一开始以为是英译汉和汉译英的时候发送的请求包不一样导致的,我反复比对网页上英译汉和汉译英时候发送的请求和收到的响应,发现不同的其实只有4个

  • i(翻译的内容)
  • salt(加密信息)
  • sign(加密信息)
  • Content-Length
      我把下面三项就全部删了,发现英译汉还是可以实现于是也就没有管太多。找不到问题头很大,觉得很奇怪,因为之前用小甲鱼给的办法实现过一次,觉得没有那么复杂。后来我又想会不会是在转码的时候出了问题,我其实并没有把汉字发送出去。结果我查看我***responce.data***发现我发送出去的包里面是包括了汉字信息的。所以肯定是在服务器端处理数据的时候出了问题。
     然后我就开始看别人写的代码,我发现其实和我都大同小异,而且好多代码现在已经跑不起来了,能跑的要不是加了反爬虫要不是相应头写的比我少。前前后后弄了一两个小时,最后我也就试着只写一个***User-Agent***,居然就成功了。最后再一个个加上去,发现是请求头里的***Content-Type***这个key除了问题,把它注释了程序就能正常运行。

    最后

     忙活了三四个小时,终于整出来了。虽然不难,但是刚接触还是遇到了一些麻烦的事情,幸亏网上有不少例子可以参考。
     最后还是有一个问题,既然我不需要反爬虫就可以爬取到有道翻译,那有道的反爬虫机制是干什么用的呢,我遇到的第二个问题是不是跟这个反爬虫的机制有关系呢?
     PS:按大神 南窗客斯黄给的反爬虫破解方法,我没有找到相应的js文件(应该是网站升级用别的方法隐藏起来了吧)。

用Python破解有道翻译反爬虫机制:https://blog.csdn.net/nunchakushuang/article/details/75294947

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值