python爬虫实战案例,python爬虫百度文库
学习笔记
备注:本博客也是part14。
取之有道,写个案例。我想破解有道翻译(http://fanyi.youdao.com/)接口,抓取翻译结果。
一开始我觉得写这个不是很麻烦,因为两年前我玩网上抓取的时候,我写的第一个小案例就是抓取翻译结果。但是现在,我又写了一遍。我不知道为什么。学了半天,累死了。可能是我老了。
爬步骤获取翻译后的URL地址(http://fanyi.youdao.com/)进行抓取。
(2)在适当的页面中翻译单词并抓取数据包。
查看并解析表单。
键入python代码,输入要翻译的内容,发送post请求。
获取翻译结果。
抓包的熟悉度在正式开始抓包之前,我们先熟悉一下如何抓包。
备注:数据包捕获是对网络发送和接收的数据包进行拦截、重发、编辑和转储,也用于检查网络安全性。数据包捕获通常用于拦截数据。
在Chrome浏览器中,进入抓取包的网站(例如有道),打开网络抓取包(右键点击点评元素——点击网络——点击全部),与网站进行交互(例如有道翻译兔子这个词):
图中,红框框出的部分是我们与有道互动过程中产生的数据包。我们要抓网络上的包,就是要从这么多的包中找到有用的包。
让我们再次分析每个选项:
[Headers option]您可以查看我们提交的基本请求信息、请求头、响应头和查询参数。
如果数据包是因为我们发送了POST请求而被捕获的,那么来自表单的信息将出现在其报头中:
[预览]选项可用于预览。通过预览,我们可以判断数据包中是否包含我们想要的数据(预览的数据是格式化的):
【响应】选项提供给我们,不做任何修改的网站响应(网站响应的源代码):
我们打开有道翻译后,右键打开评论元素——点击网络——点击XHR(我们要的包主要在这里)——在有道翻译页面,输入兔子、书、笔——获取包:
检查数据包的报头信息:
可以看到,我们要求http://fanyi.youdao.com/translate_o? Smart result=dict Smart result=rule发送一个请求,请求模式是POST request。如果我们发送一个POST请求,在头中必须有来自数据的表单,服务器将验证我们发送的表单。如果表单验证失败,我们就无法得到想要的返回结果。
从表单解析现在让我们仔细看看表单数据:
兔子
出发地:汽车
至:自动
智能结果:字典
客户:fanyideskweb
盐:15874435880336
编号:9010 a 72 e 07 b 45d 70 c 18 B3 BC 640006 e 27
ts:1587443588033
bv:CDA 24 C3 e 62 de 8 f 471433417161 b 17 a 55
doctype:json
版本:2.1
keyfrom:fanyi.web
Action:FY_BY_REALTlME你可以看到参数I应该对应我们要翻译的内容,但是其他的参数是什么呢?尤其是以下参数:
盐:15874435880336
编号:9010 a 72 e 07 b 45d 70 c 18 B3 BC 640006 e 27
ts:1587443588033
BV:CDA 24 C3 e 62 de 8 f 471433417161 b 17 a 55这一堆数字似乎毫无头绪!
现在呢?
之前不是抓了三个包吗,那我们来看看每个包里的FROM表单中的参数值。看看哪些参数的参数值没变,那我们就不处理了,哪些参数的参数值变了,那我们就针对它。
我们来看看书和笔对应的FROM表单:
我:书
出发地:汽车
至:自动
智能结果:字典
客户:fanyideskweb
盐:15874437157104
标志:a4f 482196 c 44 b 53 e 9 f 8 de a 18 f 18 DD 446
ts:1587443715710
bv:CDA 24 C3 e 62 de 8 f 471433417161 b 17 a 55
doctype:json
版本:2.1
keyfrom:fanyi.web
动作:FY_BY_REALTlMEi:pen
出发地:汽车
至:自动
智能结果:字典
客户:fanyideskweb
盐:15874437391707
标志:f 22542 ce a9 aad 0 E1 C1 ca 53 CCC 6093772
ts:1587443739170
bv:CDA 24 C3 e 62 de 8 f 471433417161 b 17 a 55
doctype:json
版本:2.1
keyfrom:fanyi.web
操作:FY _ BY _ REALTlME比较表单中的这三个参数,我们删除具有相同参数值的参数,保留不同的参数值:
我:钢笔
盐:15874437391707
标志:f 22542 ce a9 aad 0 E1 C1 ca 53 CCC 6093772
Ts:1587443739170我们需要仔细研究这些参数是如何产生的,或者说我们是如何得到这些参数值的。
我们已经知道,第一个参数I对应于要翻译的内容。
其他参数呢,比如盐,sign,ts?
当我们访问有道翻译网站时,服务器会给我们一个响应。响应中有很多JS文件,所以salt、sign和ts的值都是由这些JS文件生成的。所以,如果我们想得到这些参数值,我们必须找到这些JS文件。
如何找到这些JS文件?
我们可以刷新页面,然后单击review elementnetworkJS来查找JS文件:
我们看到了一堆JS文件。
这些文件中哪些让我们想要JS文件?
在这些JS文件中,我们可以搜索出现在表单中的参数名。先搜索盐,看看你能得到什么:
我们得到了一个JS文件,其中包含salt参数。我们继续在这个文件的FROM表单中寻找其他参数(比如sign和ts)。
在这个JS文件中,我们在FROM表单中找到了参数ts、bv、salt、sign。看看这些代码(虽然我看不懂)。好像对参数进行了一些md5加密,生成了随机数。好像有时间戳?
这些是什么…喵,讨厌!
嘿。不管怎样,有了线索之后,我们先抄下这些语句:
t=n.md5(navigator.appVersion)
r=“”(新日期)。getTime()
i=r parseInt(10 * Math.random(),10);
ts: r,
bv: t,
绍特:我,
sign:n . MD5( fanyideskweb e I Nw(nmmbP % A-r 6 u 3 eun]Aj )
这些copy语句有什么用?
目的是根据这些js语句的含义,使用python语法以FROM形式再现参数值。哈哈!简单粗暴。
那么我们如何弄清楚这些JS语句的含义呢?
考一考!来吧,拿起我们的小手,在控制台里一行一行的研究这些JS语句的含义。
navigator.appVersion语句生成类似于我们的用户代理的内容。让我们验证一下:
用户代理:Mozilla/5.0(Windows NT 6.3;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/63 . 0 . 3239 . 84 Safari/537.36
石头被锤了!navigator.appVersion语句可以在用户代理中生成Mozilla/背后的东西。这就是bv参数不变的原因,因为我发起请求的时候User-Agent还没有变,所以用User-Agent进行md5加密得到的bv参数不会变。
(新日期)。getTime()语句似乎获得了时间戳。
似乎parseInt(10 * Math.random(),10)语句可以生成从0到9的随机数。
好了,更重要的来了!现在我想在控制台中测试代码 Fanyideskweb e I NW(NMMBP % a-r 6u 3 un]AJ 。好像只是简单的字符串拼接。有什么好看的?
很简单的拼接,没错,但是我不知道e是什么。我该怎么办?
看看那堆JS代码,找出E?…对不起,我有点晕,臣妾做不到…那又怎样?然后,在断点处调试…怎么调试?
我们在下图8378行做一个断点,在有道页面输入一些要翻译的内容,比如英语:
神奇的事情发生了!我想要的答案跳出了我们的屏幕:e="English "
通过断点调试,我们知道这个E代表我要翻译的内容。
敲码!那么在我们做了所有这些之后,我们现在可以输入python代码了吗?
当然可以!但是我们先不要爬。让我们用python …MD…保持微笑重现一下FROM表单中的salt,sign和ts参数的值。使用jpeg文件交换格式存储的编码图像文件扩展名
用于在python中从表单再现参数值的代码:
导入时间
随机导入
从hashlib导入md5
ts=str(int(time.time()*1000))
salt=ts str(random.randint(0,9))
s=md5()
E=input(输入要翻译的内容:)
sign= fanyideskweb e salt Nw(NMM BP % A-r 6 u 3 eun]Aj
s.update(sign.encode())
#更新的参数为字节数据类型
md5_sign=s.hexdigest()
现在可以爬了么?
不好意思,我还想介绍一下请求。邮政方法。
请求。邮政方法请求有很多类别,比如有得到、张贴、头、放等等。现在,我们就是要用大蟒的请求。邮政方法向服务端发起邮政请求。一般,当我们向网站提交一定的信息,想得到反馈(比如,想要注册账号,英汉翻译)时,就要用到邮政请求。
语法response=requests.post(url,data=formdata,headers=headers)
#表单数据:要帖子(提交)的从表单数据,字典格式
爬虫啦好了,现在我们开始爬吧。
大蟒代码:
# -*-编码:utf-8 -*-
导入请求
导入时间
随机导入
从摘要算法导入讯息摘要5
导入数据
班尤道斯皮德:
def __init__(self):
自我。URL= http://fanyi.youdao.com/translate_o?智能结果=字典智能结果=规则
自我。proxy=[ { }://117。88 .176 .93:3000 ,
{}://117.88.177.153:3000,
{}://60.188.77.31:3000]
self.headers={
接受:应用程序/json,文本/javascript,*/*;q=0.01 ,
接受-语言: zh-CN,zh;q=0.9 ,
连接:保持活动,
内容长度: 255 ,
content-Type ":" application/x-www-form-urlencoded;字符集=UTF-8 ,
Cookie:OUTFOX_SEARCH_USER_ID=-144954992@61.190.196.18;OUTFOX _ SEARCH _ USER _ ID _ NCOO=645870110.9638431;_ ntes _ nnid=75 e 99 ed 4 Fe 9 CEC bb 947 a 8 df 8 ea 8 b 8885,1526958441068;P _ INFO=m18155501928_ ga=ga 1。2 .45667 .48668686661 jsessionid=AAA 5 tmtwk 5 MCI 7 b 8j-Agx;SESSION _ FROM _ COOKIE=未知;_ _ _ rl _ _ test _ _ cookies=1587469540366 ,
主持人:“樊沂。游东。 com ,
产地樊沂街http://号。游东。 com ,
参考地址:樊沂http://号。游东。com/,
用户代理: Mozilla/5.0(Windows NT 6.3;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/63。0 .3239 .84 Safari/537.36
}
def get_parameter(self,word):
ts=str(int(time.time()*1000))
salt=ts str(random.randint(0,9))
s=md5()
sign=fanyideskweb 单词盐 Nw(nmmbP%A-r6U3EUn]Aj
s.update(sign.encode())
#更新的参数为字节数据类型
sign=s.hexdigest()
返回盐、符号、ts
def post_data(self,word):
salt,sign,ts=self.get_parameter(word)
表单数据={
我:字,
从:自动,
至:自动,
smartresult:dict ,
客户端: fanyideskweb ,
盐:盐,
标志:标志,
ts:ts,
bv : CDA 24 C3 e 62 de 8 f 471433417161 b 17 a 55 ,
doctype:json ,
版本: 2.1 ,
keyfrom:fanyi.web ,
操作: FY_BY_CLICKBUTTION
}
代理=random.choice(自我代理)
proxy={ http :proxy。格式( http ),
https:proxy.format(https)}
html_json=requests.post(
url=self.url,
data=formdata,
头=self.headers
代理=代理
).json()
#print(type(html_json))
result=html _ JSON[翻译结果][0][0][ TGT ]
打印(翻译结果:,结果)
定义主(自身):
word=input(输入要翻译的内容:)
self.post_data(word)
if __name__==__main__ :
start=time.time()
spider=YoudaoSpider()
spider.main()
end=time.time()
打印(执行时间:% . 2f“%(结束-开始))控制台输出:
输入要翻译的内容:垂耳兔
翻译结果:垂耳兔
执行时间:7.91
后记:写了这篇案例导致我想学CSS、JS和数据结构了,但还要复试。呵呵,说好的复试之前绝不写案例呢?辣鸡!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。