最近有很多朋友跟我说,“爬虫这东西很简单啊,好像还没学就已经会了,没啥深奥的东西哦。看了你之前的教程,不就是一个队列加一些Http请求吗,不就是写写XPath和正则吗,你们还做个神箭手云爬虫出来?我自己上个厕所就写完了啊。”

看来是时候拿出我们压箱底多年的老干妈了,哦不,老干货了。不吓屎你们这群小学生我就不在6年级混了。

废话不多说,所谓爬虫天坑,敢对得起这个名字的一定不能是等闲之辈。起码得是过完年老板给你扔这个任务,你儿童节还在头大的级别。今天第一课,咱们就先找个最难的热热身吧:爬取百度指数的关键词搜索指数。

先贴一个logo让大家跪拜一下

好了,大家平身吧,咱们马上就正式开始了,想上厕所的赶紧去,不然看完这篇文章估计你就忘了怎么上厕所了。

正式开始之前,先插个广告:如果土豪朋友不想写代码或者中途看不下去的,我们将以下代码已经打包成一个完整的应用,大家进入神箭手的云市场搜索百度指数(http://www.shenjianshou.cn/index.php?r=market/product&product_id=500036)就可以看到应用,直接调用既可。

——前方高能预警看也看不完上厕所赶紧去分割线-----

咱们正式开始:所谓知己知彼百战不殆,我们要先了解一下我们的对手。咱们打开百度指数

http://index.baidu.com

,映入眼帘的是一个简单的输入框。好开心啊,好像不用登录啊,输入一个关键字试一下吧,输入神箭手,回车:

果然百度老司机不会让我们那么开心的。没事没事,不就是登录吗,也不是没做过登录,抓包研究下请求应该不难。我们先找一个账号登录看下。登录之后继续输入神箭手:

出来了。哈哈,不难嘛,这不就直接显示了。然后就按照以前的爬虫的教程,用XPATH获取一下数字就可以了,哈哈哈…哈哈..哈……..

慢着,怎么感觉这个数字看着怪怪。吓得我赶紧掀开被子看看这货到底是啥:

什么?这是图!!!!什么?这还是拼图!!!!什么?这货居然是异步的拼图!!!!

怎么样,感受到天坑的深度没有?

那咱们就一起来看看怎么见招拆招,用神箭手把百度指数搞定的吧。

开始具体的代码之前,我们先在神箭手后台新建三个应用,分别是百度指数API,百度登录爬虫,百度指数图片识别AI。

第一章登录应用

第一节:咱先搞定登录

模拟登录一直是爬虫的一个老大难问题,虽然我们神箭手提供了智能登录接口login函数,但是遇上复杂一些的登录依然无能为力。当然你可以登录后复制本机Cookie直接用,但这种雕虫小技百度想封你真得比捏死一只蚂蚁还简单。咱们要有不怕苦,迎难而上的精神,死磕登录!算了~还是先去搜一下有没有别人写过。不搜不知道,一搜吓一跳啊。咱就随便找个源码借鉴借鉴。乔布斯老人家说过嘛,greateartist steal。

https://github.com/qiyeboy/baidulogin/blob/master/baidulogin.py

这个不错,逻辑清晰,代码干净,万能的github果然不辜负我的重望。我们steal到神箭手平台上来。

首先我们理清这个流程,根据这个代码我们知道百度的登录流程是这样的:

1.通过请求百度首页或者任意一个百度url获得百度的基础cookie。

2.请求

https://passport.baidu.com/v2/api/?getapi

获得token

3.通过

https://passport.baidu.com/v2/getpublickey

获得密码加密的key

4.通过

https://passport.baidu.com/v2/api/?login

将之前获得到的token,生成的gid,生成的时间戳,用key加密密码,来提交登录。

5.如果返回有验证码,获取codestring并请求

https://passport.baidu.com/cgi-bin/genimage

获得验证码图片并识别。

6.通过

https://passport.baidu.com/v2/?checkvcode

来验证是否识别成功

7.如果不成功通过

https://passport.baidu.com/v2/?reggetcodestr

来切换验证码,在重复前两步。

8.再次提交

https://passport.baidu.com/v2/api/?login

看是否登录成功。

好了,这中间很麻烦的两个地方是

1.验证码识别 这个神箭手提供了验证码识别的函数,调用方式如下:

varcodeUrl = "

https://passport.baidu.com/cgi-bin/genimage?"

; + codeString;

varcodeReg = getCaptcha(71, codeUrl);

varimgCaptchaData = JSON.parse(codeReg);

if(imgCaptchaData && imgCaptchaData.ret > 0) {

varresult = imgCaptchaData.result;

verifycode= encodeURI(result,"UTF-8");

tt= (new Date()).getTime();

varcodeCheck = site.requestUrl("

https://passport.baidu.com/v2/?checkvcode&token="

;+ token + "&tpl=mn&apiver=v3&tt=" + tt + "&verifycode="+ verifycode + "&codestring=" + codeString + "&callback=");

varcheckInfo = JSON.parse(codeCheck);

if(checkInfo.errInfo.no != "0") {

console.log("验证码识别错误");

}

continue;

}else {

console.log("验证码识别失败");

continue;

}

2.RSA加密

当我们获取到key之后需要对密码进行RSA加密,百度是采用的JS的开源RSA加密库,神箭手也提供了RSAEncode的方法,具体代码如下:

varpubkeyJson = site.requestUrl("

https://passport.baidu.com/v2/getpublickey?token="

;+ token + "&tpl=mn&apiver=v3&tt=" + tt + "&gid="+ gid + "&callback=");

varpubkeyInfo = JSON.parse(pubkeyJson.replace(/'/g, "\""));

varpubkey = pubkeyInfo.pubkey;

varrsakey = pubkeyInfo.key;

varcrypttype = "";

varrsaPassword="";

if(rsakey != "") {

crypttype= "12";

//加密密码

pubkey= pubkey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----ENDPUBLIC KEY-----", "").trim();

rsaPassword= (RSAEncode(password, pubkey));

}

其他的都是一些基础的请求,大家可以参考github中的代码进行编写。

第二节:疯狂登录

完成了第一节的工作之后,你以为登录就没问题了吗?你以为你可以用一个帐号爬到天荒地老吗?有人说限制爬取频率,这当然是一个方法,但却不是最好的解决方案。毕竟缩手缩脚,感觉很受限。最好的方案当然是登录一堆帐号,获取一堆的Cookie,然后从这堆Cookie中每次随机取一个Cookie,再通过这个Cookie去访问。那我们就需要一个新的东西:Cookie池。

我们看下神箭手如何调用Cookie池,首先我们需要新建一个爬虫应用专门用于登录:

varconfigs = {

shareUserWithKey:"__bindex__",

};

configs.onUserAdded= function (use, psw, site) {

varloginResult = login(use, psw, site);

if(loginResult !="success") {

returnfalse;

}

returntrue;

}

这里的login方法就是刚刚我们写的百度登录,然后我们再在beforeCrawl的回调函数中反复调用以下方法:

site.addUser(user,password);

当然这里还有一个问题,如果我们一直使用一个IP来登录,也很容易被百度封掉,所以我们最好打开企业代理IP接入。

通过这种形式我们就可以建立一个可共享的Cookie池。然后我们在百度指数API应用(下一章会详细介绍)里通过设置以下代码来共享这个Cookie池:

varconfigs = {

shareUserWithKey:"__bindex__",

multiUser:true

}

这样在这个应用中会在每次访问一个Url的周期中随机从Cookie池取一个Cookie并请求Url。通过这种形式我们还可以把登录和请求代码解耦合。将来还可以复用登录代码。

第三节:问题来了,帐号从哪来呢?

除了把七大姑八大姨的手机都来注册一遍以外,没什么好办法,除非…(此处省略1000个字)。

第二章:获取指数图片API

第一节:异步请求数据

终于完成了登录,感觉怎么样,是不是有点天坑的意思?哈哈,万里长征咱才走了第一步。下面我们才真正来揭开天坑的核心:数字图片。

然后我们继续掀被子看看这个标签是怎么来的:

貌似不难找,不过看这个URL看着就头大,感觉已经被百度登录伤害过一次之后真的无力再一个一个参数分析,我们直接使用神箭手提供的js渲染页面的接口,直接把页面渲染出来把:

varconfigs = {

domains:["index.baidu.com"],

scanUrls:["

http://index.baidu.com/?tpl=trend&word="

; + encodeURI(keyword, "GBK")],

enableJS:true

}

这样我们在afterDownloadPage中拿到的就直接是渲染好的页面了,我们再通过正则和XPath取出数字图片的容器标签代码和Css代码(Css代码就是把图片设置成背景的style标签),之所以要拿Style标签是因为两个数字图片共享了一个Style,而这个Style在第一个数字图片的标签中,所以我们必须抽取出这个Style标签,在分别设置给两个不同的数字的容器标签代码。这段代码咱们再下一节中给出。

第二节:渲染数据成图片

我们拿到了数字图片的容器标签代码有什么用呢,当然是要渲染出对应的图片了。那为什么我们要这么大的弯去得到这张图呢。这一点正是百度指数能当选天坑的原因了,我们看一下这个图片是如何拼出来的,我们看下这段HTML代码。

python爬关键词百度指数_Python爬虫爬取百度指数的关键词搜索指数教程相关推荐

  1. python爬虫抓取百度图片_Python爬虫抓取百度的高清摄影图片

    成果预览: 源代码: import requests import re url = 'https://image.baidu.com/search/index' headers = { 'User- ...

  2. python爬图代码实例_Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  3. python爬贴吧回复_Python爬虫——抓取贴吧帖子

    对珊瑚老哥保证了自己会尽量补档动画MTV吧的资源,有空应该研究下爬虫了. 不要在意头图,我不会假借各位对某个动漫的爱好然后坑人的.无论是电磁炮吧主那种拿电磁铁糊弄人的奸商,还是逸站靠小林做幌子卖收费破 ...

  4. python 百度词典_python在线抓取百度词典的翻译结果翻译单词

    这段代码通过抓取百度词典的翻译结果达到翻译单词的目的 这个小工具使用Python语言编写完成,其中使用到这 些类库(urllib,BeautifulSoup ),前者主要负责网络通讯方面,后者负责HT ...

  5. python爬虫教学百度云_python爬虫爬取百度网盘-怎么做一个百度网盘搜索引擎

    因为要做去转盘网,所以一定要爬取网盘资源,本来想自己写一个爬虫挺不容易的,不想分享出来,但最后还是决定了拿给大家一起看吧,毕竟有交流才有进步,有兴趣的朋友也可以看看我写的其他日志或者关注我,会发现去转 ...

  6. python爬网页源码_python爬虫爬取网页的内容和网页源码不同?

    可以看到这里id为k_total的元素值不同,爬出来是1,网页源码是55. 附还未完成的代码:import requests from bs4 import BeautifulSoup import ...

  7. python手机壁纸超清_python爬虫 爬取超清壁纸代码实例

    简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...

  8. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  9. python百度贴吧怎么爬取最早的帖子_Python爬虫爬取百度贴吧的帖子

    同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python #_*_coding:utf-8_*_ import urllib import ur ...

  10. python爬虫百度图片_python实现爬取百度图片的方法示例

    本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...

最新文章

  1. Science:又一明星菌群可以调控肠道免疫?
  2. java代码生成springdao_请JAVA高手推荐个SSH的后台代码生成工具!!要能生成Spring整合Hibernate的DAO类和Service类!...
  3. OpenCV计算机视觉编程攻略之用色调、饱和度和亮度表示颜色
  4. lambda表达式的日期问题
  5. 分布式服务框架原理(一)设计和实现
  6. springboot和quartz整合实现动态定时任务(持久化单节点)
  7. MFC TabCtrl用法
  8. android shell 批量打包,Android执行shell命令打包
  9. 螺旋千斤顶设计大作业_新型飞机千斤顶的优化设计
  10. 2017年11月11日
  11. android动画 底部弹窗 效果
  12. J2EE / TOMCAT / TOMCAT系列教材 (一)- 教程
  13. 企业如何选择固定资产管理系统?
  14. 微信直接下载app的解决方案
  15. L13-页眉页脚设计加水印
  16. 自定义桌面右键菜单-Win 10 版
  17. 微信摇一摇周边--获取access_token
  18. python 制作 gif 动态图
  19. 电路功能描述方式——数据流方式
  20. 使用Git时,Failed to connect to github.com port 443 after 21100 ms: Timed out

热门文章

  1. 参考文献空格怎么空_参考文献中的标点符号后要不要加空格
  2. mac 提示缺失Myriad字体
  3. 网上书店管理系统 课程设计
  4. 服务器 '' 上的 MSDTC 不可用。
  5. 无线系列-无线通信系统组成
  6. easyui-combobox之setText与setValue先后之分
  7. phpwind升级php7,phpwind-8.7-GBK升级到phpwind-9.02-utf8步骤详解
  8. Win7安装IIS出错,总是提示“出现错误。并非所有的功能被成功更改。”
  9. 软考中级软件设计师考试大纲
  10. c语言第九章课后作业答案,C语言课后习题部分答案