起因


有个朋友叫我帮忙写个爬虫,爬取javbus5上面所有的详情页链接,也就是所有的https://www.javbus5.com/SRS-055这种链接,

我一看,嘿呀,这是司机的活儿啊,我绝对不能辱没我老司机的名声(被败坏了可不好),于是开始着手写了


构思


  • 爬虫调度启动程序crawler.py
  • 页面下载程序downloader.py
  • 页面解析程序pageparser.py
  • 数据库入库与去重管理程序controler.py

爬取入口为第一页,当页面中存在下一页的超链接继续往下爬,这是个死循环,跳出条件为没有了下一页的链接

在某一页中解析页面,返回所有的详情页链接,利用迭代器返回,然后在主程序中调用解析程序对页面信息进行解析并包装成字典返回,其中用详情页网址作为数据库主键,其他信息依次写入数据库

当这一页所有的子链接爬取完成后,继续爬取下一页。

将数据存入数据库,用的是sqllite3,失败的网址页存入一个fail_url.txt。

对于增量爬取,我是这么做的,当爬取到相同的网址时结束程序,这么做也有漏洞,才疏学浅,我没想到太好的办法,希望有好办法的给我说一声(布隆过滤正在研究之中),如果用数据库查询去重,那么势必导致二次爬取,我们都知道,爬虫更多的时间是花在网络等待上


问题


在写爬虫的过程中遇到了一些问题

  1. 在墙内爬不动,爬取几个之后就失败,这个解决方案只需要全局翻墙爬取就可以了

  2. 本来之前加了多线程并发爬取,但是发现爬取一段时间后会封ip导致整体无法运行,本来想搞个代理池进行并发,结果网上免费的代理太慢太慢,根本打不开网页,于是就改回了单线程

  3. 就是我的那个不完善的增量爬取,导致了你一次爬取就需要爬取完成,不然数据库里面存在你之前爬到的,爬取到你已有的会直接停止

  4. 存在反扒策略

    详情页中的磁力链接是ajax动态加载的,通过分析抓包,可以在XHR中找到是一个get请求,至于参数,我开始不知道怎么得来的,后来在html代码中找到了,我放几张图大家就明白了

    我们通过对响应内容的查看可以发现磁力的加载访问了类似于这样一个网址

    https://www.javbus5.com/ajax/uncledatoolsbyajax.php?gid=30100637207&lang=zh&img=https://pics.javbus.info/cover/59pc_b.jpg&uc=0&floor=921

    那么这些get参数是从哪里来呢,这就是通过经验与基本功去发现了

    通过对html源文件的搜索,我们即可直接发现答案





    通过分析发现,后面的floor是个随机数参数,一般这种参数可以去除无影响,事实也是这样

    我利用HttpRequest模拟发包,对这个请求直接get,发现所有数据隐藏

    那么肯定是有反扒的策略,伪造请求头,反扒也就那么几种,通过分析发现是同源策略,对Referer请求头伪造成来源网址就可以直接获取到内容了





  5. 常见的Python2.x编码问题,全部转换为unicode字节流就可以了

    这个问题在我博客中已经记录了http://www.53xiaoshuo.com/Python/77.html

    有兴趣的童鞋可以看看

  6. 遇到的最闹心问题是详情页的项目抓取,有的详情页的类别不同,我开始只分析了一个页面,导致写的规则在有的页面上频频出错

    导致后面对抓取规则进行了大改,重写了分析规则,用了个笨办法,毕竟那小块的html写的十分不规范,正则规则有三种,挺烦人





    比如上图的两个就不同,html代码更是稀烂,需要判断有没有这个项,没有就设置空字节入库

    在这其中纠结了一个问题

    就是对于这两种的比较,我想上面这种变成下面这种,毕竟第一种的话,soup.find要执行两次,但是下面这种又要比上面那个多一行,丑一点

    最后我选择了第二种,所有的信息分析代码就不贴了,具体想看的直接看我的代码文件就好了


小Tips


  1. 对于动态加载的内容的爬取,能不用selenium去模拟浏览器爬取就不用,耗费资源,更好的是自己分析网络请求,然后构造

  2. 对于页面信息的解析,要多看几个页面,看是否相同,别到时候做多事情

  3. 多看别人的博客学习思路


注意


爬虫依赖的第三方库有Requests,BeautifulSoup,使用前请先pip install这两个第三方库


测试展与地址





代码地址:


司机的名声总算是没有辱没,秋名山依旧,嘿嘿

转载请注明来源作者

  • 博客:akkuman.cnblogs.com | hacktech.cn
  • 作者:Akkuman

javbus爬虫-老司机你值得拥有的更多相关文章

  1. 老司机教你下载tumblr上视频和图片的正确姿势

    本文面向初学者. 很多同学问我:“我非常想学Python编程,但是找不到兴趣点”. 还有的同学呢,找到了很好的兴趣点,但是无从下手,“玄魂老师,我想下载tumblr上的视频, 怎么下载,Python能 ...

  2. [BZOJ4200][Noi2015]小园丁与老司机

    4200: [Noi2015]小园丁与老司机 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 106  Solved ...

  3. 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer

    大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...

  4. 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选

    在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...

  5. 老司机学新平台 - Xamarin开发环境及开发框架初探

    随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增.免费.更好的VS2015集成.更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即 ...

  6. FJNU 1196 汪老司机(DP or 建图+最短路)

    1196: 汪老司机 Time Limit: 1000 MS         Memory Limit: 257792 KB 64-bit interger IO format: %lld       ...

  7. 老司机带你走进Core Animation

    为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...

  8. 【Bugly干货分享】老司机教你 “飙” EventBus 3

    Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. EventBus对于Android ...

  9. cdoj 1489 老司机采花

    地址:http://acm.uestc.edu.cn/#/problem/show/1489 题目: 老司机采花 Time Limit: 3000/1000MS (Java/Others)     M ...

随机推荐

  1. 恢复Windows10应用商店

    用管理员权限运行powershell,输入 Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableDevelopmentMode -R ...

  2. QString和char*互转

    1. QString转为char * // QString转QByteArray QByteArray sr = strQ.toLocal8Bit(); int len = sr.length(); ...

  3. Ubuntu10.04 python2.6下安装matplotlib环境

    一.准备工作1.sudo apt-get install python-numpy2.sudo apt-get install python2.6-dev3.sudo apt-get install ...

  4. uva 1633 Dyslexic Gollum

    题意: 给出n和k,求出长度为n的不包含长度大于等于k的回文串的01字符串的个数. 思路: 如果一个字符串包含长度为k的回文串,那么它肯定包含长度为k-1的回文串,所以考虑第i位的时候,只要前缀中不包 ...

  5. uvalive 4452 The Ministers’ Major Mess

    题意: 有一些部长需要对某些账单进行投票. 一个部长最多对4个账单进行投票,且每票对一个账单通过,要么否决. 问是否存在一个方案使得所有部长有超过半数的投票被通过,如果有,那么说明哪些账单的决定是明确 ...

  6. SpringMVC七种参数绑定简单介绍

    a. 默认支持的类型:        httpServletRequest, httpservletresponse, httpsession, model        看自己需要, 如果需要用就加 ...

  7. eclipse格式化代码样式

    1.Window->Preferences //Java 格式化 2.Java->Code Style->Formatter->New->Edit->Line Wr ...

  8. Icarscan VCI is definitely the update variation of Start iDiag

    Start iCarScan is alternative of Super X431 iDiag, it’ll make your Android smartphone or tablet righ ...

  9. 如何用nginx在本地把9000端口转发到80端口上

    起因看到一个用java写的轻博客,于是就兴致冲冲的试用一下.由于是lnmp的环境,Nginx占用了80端口,新博客只能用其他的端口,这里选择了9000端口,本地测试没问题.总不能访问了域名然后在加上端 ...

  10. Tensorflow timeline trace

    根据 https://github.com/tensorflow/tensorflow/issues/1824 简单进行了测试 修改运行的脚本增加如下关键代码 例如mnist_softmax.py f ...