python爬虫实战案例,python爬虫百度文库

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: