起因


有个朋友叫我帮忙写个爬虫,爬取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. Python全栈-day11-函数3

    装饰器 1.开放封闭原则 通常情况下,软件一旦上线就应该遵循开放封闭原则,即对修改封闭.对扩展开放 扩展开放需遵循两个原则: 1)不修改源代码 2)不修改原函数的调用方式 2.装饰器 器指的是工具,装 ...

  2. python SQLite说一点点, python使用数据库需要注意的几点

    SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. Python就 ...

  3. PyCharm 2017.2.3 版本在2017年9月7日发布,支持 Docker Compose

    PyCharm是由JetBrains打造的一款Python IDE.PyCharm具备用于一般IDE的功能,比如, 调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制 ...

  4. vue生产环境清除console.log

    npm run build 后的生产环境的代码,会有很多开发时留下的console.log(),不可能每个页面不停地删除 在build/webpack.prod.conf.js文件里加上这样一段代码即 ...

  5. ubuntu 常见命令整理

    SSH 查看ssh服务的进程是否已经开启ps -e | grep ssh 安装ssh服务组件sudo apt-get install openssh-server 服务启动和关闭 方法1:servic ...

  6. linux下VLAN设置

    1. 安装vlan(vconfig)和加载8021q模块 [root@test0001~]#yum install vconfig [root@test0001~]#modprobe 8021q [r ...

  7. JavaScript笔记 #06# Promise简单例子

    索引 回调版本 Promise版本1 Promise版本2 Notes 参考资料: Promise JavaScript Promise:简介 你去书店借书,按照异步的套路,剧情如下↓ 你:“老板,有 ...

  8. sqlchemy self made

    # -*- coding: utf-8 -*- from sqlalchemy import create_engine, Column, String, Integer, ForeignKey, T ...

  9. 使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL

    传统的使用scrapy爬下来的数据存入mysql,用的是在pipeline里用pymysql存入数据库, 这种方法需要写sql语句,如果item字段数量非常多的 情况下,编写起来会造成很大的麻烦. 我 ...

  10. 您的windows许可证即将过期 win10的解决办法

    出现这个错误是因为安装的版本不是正版系统,每隔一段时间需要激活 这次激活也费了一些时间,记录如下希望能对大家有所帮助 (1)首先可以查看自己的许可什么什么时候会过期 windows+R调出命令运行窗口 ...