在我们进行爬虫操作的时候,网站为了防止自己的服务器不要那么被频繁访问或者保护自己的数据信息不被别人获取,通常会采用一系列的反爬虫的操作。
1、验证UserAgent
2、验证Cookie
3、查看Referer跳转信息
4、js提交信息加密
一、打开有道翻译,右键审查元素,并选择Netword
二、在有道网页中输入要翻译的内容,然后检查netword下面的每一条URL信息。我们会找到提交信息的URL。
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
该URL的请求内容如下:
Response Headers
Request URL:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
Request Method:POST
Status Code:200 OK
Remote Address:220.181.76.84:80
Referrer Policy:no-referrer-when-downgrade
Request Headers
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.9
Connection:keep-alive
Content-Length:251
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:OUTFOX_SEARCH_USER_ID=-309913466@113.94.26.152; OUTFOX_SEARCH_USER_ID_NCOO=620396314.2138592; _ntes_nnid=918a7bef39e595b95828b86f71f865d9,1539393519413; P_INFO=hjh1343084642; JSESSIONID=aaafD5iFIPcLle1m-Iv4w; __guid=204659719.4275793267214428700.1572319520374.8025; monitor_count=4; ___rl__test__cookies=1572320930125
Host:fanyi.youdao.com
Origin:http://fanyi.youdao.com
Referer:http://fanyi.youdao.com/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
X-Requested-With:XMLHttpRequest
Form Data
i:我们
from:AUTO
to:AUTO
smartresult:dict
client:fanyideskweb
salt:15723209301300
sign:518e51662cfef4b0bbea5b5f5b09ad21
ts:1572320930130
bv:bbb3ed55971873051bc2ff740579bb49
doctype:json
version:2.1
keyfrom:fanyi.web
action:FY_BY_REALTlME
我们可以看到URL是采用Post请求的,在请求的信息Form Data中,我么可以看到有很多请求参数,我们还不知道这些信息是怎么生成的,这个时候,我们可以将这些数据去查询它们的出处,通过查询sign,我们可以发现它出现在http://shared.ydstatic.com/fanyi/newweb/v1.0.20/scripts/newweb/fanyi.min.js
从内容上看,是采用MD5对数据进行加密的,i为salt,e为要翻译的内容。
salt是采用时间戳生成的,而ts则是salt少一位。sign则是MD5加密生成,其他的参数可以照写,因为它们一般是不变。
1、salt参数
def get_salt(self):
return (int(time.time()*10000))
2、ts参数
ts=str(int(salt/10))
3、sign参数
def get_md5(self,v):
md5=hashlib.md5()
md5.update(v.encode('utf-8'))
value=md5.hexdigest()
return value
def get_sign(self,key,salt):
sign="fanyideskweb" + key+ str(salt) + "n%A-rKaT5fb[Gy?;N5@Tj"
sign=self.get_md5(sign)
#print(sign)
return sign
三、完整代码
具体的参数我们已经全部获得
import time,requests
from urllib import parse
import re,urllib
import hashlib
#有道
class youdao(object):
def get_salt(self):
return (int(time.time()*10000))
def get_md5(self,v):
md5=hashlib.md5()
md5.update(v.encode('utf-8'))
value=md5.hexdigest()
return value
def get_sign(self,key,salt):
sign="fanyideskweb" + key+ str(salt) + "n%A-rKaT5fb[Gy?;N5@Tj"
sign=self.get_md5(sign)
#print(sign)
return sign
def translates(self,key):
salt=self.get_salt()
url='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers={'Cookie': 'OUTFOX_SEARCH_USER_ID=-1834148294@10.169.0.83; JSESSIONID=aaavu7Re42fb883tdAqJw; OUTFOX_SEARCH_USER_ID_NCOO=172793743.55574614; ___rl__test__cookies='+str(int(salt/10)),
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data={'i':key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': self.get_sign(key,str(salt)),
'ts':str(int(salt/10)) ,
'bv':'bbb3ed55971873051bc2ff740579bb49',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
'typoResult': 'false'
}
#data=parse.urlencode(data).encode()
r=requests.post(url,headers=headers,data=data)
text=r.json()["translateResult"][0][0]["tgt"]
return text
print(youdao.translate("我们"));
为防止网站进行反爬虫,我们可以在headers中加入一些字段。Python有提供对应的库,对于MD5加密技术可以自己去了解。