前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分享两个有趣的爬虫代码

分享两个有趣的爬虫代码

作者头像
月小水长
发布2019-07-30 14:49:05
1.4K0
发布2019-07-30 14:49:05
举报
文章被收录于专栏:月小水长月小水长

百度翻译爬虫

程序跑起来的效果是这样的,

自动翻译,而且支持中英文互译

在调试代码的过程中,我发现百度翻译的加密参数和谷歌翻译差不多,我以前也写过一篇有关谷歌翻译的文章,感兴趣的同学可以看看: Python 实现一个自动化翻译和替换的工具

更让我大跌眼镜的是,不仅如此,百度翻译的加密函数也是抄袭谷歌翻译的。。。

不展开说了,今天主要借破解百度翻译的两个参数:签名 sign 和 通证 token, 来谈谈爬虫编码的一般思路。

假如我们要想爬取百度翻译,第一步当然是打开百度翻译的网页,按F12打开开发人员工具。

切换到 NetWork 标签下,选择查看的返回文件类型为 All, 先清除之前的痕迹,方法是点击红色圆点右边第一个图标。

然后点击蓝色的翻译按钮,这时候,就可以看到有许多响应了

有个搜索按钮(用小红色矩形框出来的),输入搜索特定的响应文件

同时我们注意到还有一个类似放大镜的图标,它也是一个搜索按钮:

点击这个搜索按钮,输入关键词,它搜索的是所有相应文件里的Response

搜索 translate 关键词,我们可以看到有一条搜索结果

点击这条结果

可以看到,浏览器帮我们定位到这个关键词所在的响应文件了,它是v2transapi 更多响应信息可以看右边的 Response 或者 Preview 标签页, 其实这个我们搜的这个关键词就是网页中显示的我们输入的翻译的翻译结果 不行你可以多信几次,这里要注意的一点是最好不要输中文关键词,因为响应文件中中文是 \\u4f8b\\u53e5\\u5e93 这样的 Unicode 字符存在的,显示的浏览器肯定做了转化解析,不知道为什么开发者工具没有做转化,可能 google 以后会改进吧,至少到2019//05/27 Chrome还没有。

然后切换到 Headers 标签页

看请求的网址是什么,需要哪些参数,如果有些变化的参数不知道怎么构造,可以以这个参数作为关键词再搜响应文件。 最后就是编码了,上面的准备工作做得这么好,还怕什么编码呢? Data 只需要添加:

代码语言:javascript
复制
query,  
simple_means_flag,  
sign,  
token  

即可。其中 simple_means_flag 为固定量,query 代表待翻译的词,接下来需要解决的就是破解 signtoken 这两个参数。先说token吧,token 可以直接在百度翻译主页的源码里找到:

但是貌似因为时间戳不同步所以直接请求百度翻译的主页获取到的token 是用不了的,所以需要在代码中设置

代码语言:javascript
复制
self.session = requests.Session()
# Chrome : 设置-->高级-->内容设置-->cookie-->查看所有cookie和网站数据-->baidu.com的cookie
self.session.cookies.set('BAIDUID', '19288887A223954909730262637D1DEB:FG=1;'
self.session.cookies.set('PSTM', '%d;' % int(time.time()))

接下来再说说sign,sign是由一段js代码产生的(index_9b62d56.js中):

在 Python 中用 execjs 执行这段 js 代码即可获得我们所需要的sign 值,计算 sign 值的过程中需要用到一个名为 gtk 的变量的值,直接请求百度翻译的主页即可获取该值:

于是我们就可以愉快地写代码实现百度翻译的内容爬取功能了。具体操作看代码吧,破解过程也挺复杂的。

所有代码地址:https://github.com/Python3Spiders/BaiduSpider/tree/master/baidu_translation

百度贴吧爬虫

程序跑起来的效果如下,

可以下载指定贴吧的图片,首先将下主要的技术思路。

由于我们要请求多个页面,而且浏览图片必须要登陆后,一种笨拙的方法是先登陆百度账号,获取 cookies ,访问其他页面获取图片链接时在 headers 中携带这些 cookies,但是这样无疑添加了代码量,其实 requests 库帮我们封装好了一个 seesion 对象,requests 库的 session 会话对象可以跨请求保持某些参数,一旦使用 session 成功地登录了某个网站,再次使用该 session 对象请求该网站的其他网页都会默认使用该 session 之前使用的 cookies 等参数。

而 session 的 api 也很简单,几乎和 requests 一模一样。比如它的 post 方法。

代码语言:javascript
复制
session.post(url=url, data=ldata, headers=headers)

再说说这个百度账号登陆接口的破解,其实破解流程和上面百度翻译类似,不再赘述,说说它的各个参数的含义吧。

代码语言:javascript
复制
 data = {
'username': USER_NAME,
'password': PASSWORD,
'tpl': 'tb',
'u': 'https://tieba.baidu.com/index.html?traceid=#',
'staticpage': 'https://passport.baidu.com/static/passpc-account/html/v3Jump.html',
'isPhone': 'false',
'charset': 'utf-8',
'callback': 'parent.bd__pcbs__3rjsif'
}

username 和 password 自然不必说,账号和密码,其中密码在 Chrome 上调试发现 'password' 是加密的,一直没有找到加密的算法,后来直接尝试不加密 post,居然成功了,估计这个加密只是防止在 Chrome 中直接看到密码,post 的时候接口后台会自动加密的。

tpl:tb 表明我们是从贴(t)吧(b)登录百度账号的,如果是从百度账号中心,则是 pp(passport)。

callback:是接口 post 成功的回调。

两件事

第一件事,是有关本公众号的运营,我正式开始运营这个公众号的时间是今年初,一直坚持做原创分享,经常有粉丝后台留言催更和帮我举报抄袭者,这点由衷地感动,目前也有上千个粉丝了,达到了开通流量主的门槛,说直白点,就是可以赚钱了,只要你动动手指,点击文章中的 ad, 但是我承诺,会以各种形式返还给亲爱的粉丝们,比如在交流群发红包,定期送书,我也不靠这点钱发家致富,我还是个在校学生,主要是想结识一群志同道合的朋友。公众号后台回复 ” 社群 ”即可加入群聊。同时,欢迎将本公众号推荐给您身边的朋友,在此谢过。

第二件事,我最近在创建了一个开源组织,Python3Spiders,主要是一些原创爬虫,和在爬取数据上的数据分析项目集合,全部开源,欢迎小伙伴们一起加入这个组织,可以 star,也可以成为这个组织的开发者和贡献者(在 issues 上提交留下你的足迹即可)。

组织地址: https://github.com/Python3Spiders

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 月小水长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档