逢年过节胖三斤,技术手法退十年。- -
差不多一个多月没碰博客了,都快要没手感了。

说一下前一段时间玩爬虫的时候作死的一个小例子吧。大概的描述就是闲的没事做,去爬了一个漫画网站,想着成功了去装个逼。结果代码写到吐血。这个网站的反爬还真是做的让我这种技术渣又爱又恨啊,这个漫画网站就是:爱漫画(http://www.iimanhua.com)。如果有哪位大牛攻破了的话请一定要多多指教小弟一下,感激不尽。

先上一张这个网站看漫画的图吧:

可以看到的就是这个网站的漫画是像我们平时看电视一样,一话一话分的。那么在爬的时候肯定也是选择一话一话的爬,这样就要获取到每一话的url。

看了一下网页源码,发现这个是页面加载时自动生成好的,形式就像这样:

a标签里面已经有了现成的url了,这个就很简单了,用urllib2模拟请求一下这个漫画的url获取网页的html代码,然后用python的BeautifulSoup库来获取到这个列表里面所有的章节的url。

html = urllib2.urlopen(‘漫画url’, timeout=120).read()
soup = BeautifulSoup(html)
chapterURLList = []
chapterLI_all = soup.find('div',id='play_0').find_all('a')

然后就可以开始拿这些url来爬东西了。用浏览器随便打开了一章看了一下页面:

发现一章又分为很多页,每一章的页数不一样。这就需要动态获取到每一章的页数才能继续下去了。这时候想到一个办法就是上面这张图里有一个下拉列表select,里面就是这一章所有的页数。于是又像上面一样用urllib2去请求,心里还在暗喜urllib2怎么这么好用,谁发明的这么好用的东西的时候程序报错了,这就尴尬了- -。又跑去看了一下网页源码发现这个页面就没有上面那个页面那么简单了,这个页面全是用js动态加载的,包括下拉列表select标签的option个数,img标签的url等等。用urllib2去请求根本请求不到想要的东西。Google了一下说可以用ghost.py,然而这个网站的开发人员貌似早料到了有人会这样做,所以用ghost得到的结果比urllib2还不尽人意,直接请求失败!!!

这样的情况下首先想到了用phantomjs+selenium。phantomjs是没有界面的浏览器,加上selenium,获取到章节的总页数之后,用章节的url后面加上‘?p=1、2。。。‘来访问章节的每一页,像这样:http://www.iimanhua.com/imanhua/9773/318450.html?p=2来访问第187话第二页。

driver = webdriver.PhantomJS()
driver.get('http://www.iimanhua.com/imanhua/9773/318450.html?p=2')
# 根据页面的下拉列表选项个数来计算章节页数(每一页有上下两个select)
allPage=driver.find_elements_by_tag_name("option").__len__()/2

然后得到每一页的图片url用urllib2去模拟请求得到图片存到本地。

driver.get('http://www.iimanhua.com/imanhua/9773/318450.html?p=2')
imgurl = driver.find_element_by_class_name("tbCenter").find_elements_by_tag_name("img")[0].get_attribute("src")GetImageContent('页面url',imgurl,'文件名')
# 传入url模拟Get请求,获取图片内容
# parame: # wholeurl:本页的url# imgurl:本页上的图片的url# imgname:图片保存在本地的文件名
def GetImageContent(wholeurl,imgurl,imgname):req = urllib2.Request(imgurl)req.add_header('Referer', wholeurl)content = urllib2.urlopen(req).read()with open(cartoonName + '/' + imgname + '.JPG', 'wb') as newImg:newImg.write(content)

最后跑是跑起来了,但是就像上面说的那样,这个网站的反爬技术对我来说太厉害了,用phantomjs慢的一比,有时候甚至网站的服务器直接忽略掉了我的请求,导致什么都爬不下来。试了一下换浏览器头,在google找到了大多数常用的手机和电脑端的浏览器头,每请求一次换一个浏览器头

userAgent = ['Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0','Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0','Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0','Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166  Safari/535.19','Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30','Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1','Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36','Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko','Mozilla/5.0 (compatible; WOW64; MSIE 10.0; Windows NT 6.2)','Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.2)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586','Opera/9.80 (Windows NT 6.1; WOW64; U; en) Presto/2.10.229 Version/11.62']dcap = dict(DesiredCapabilities.PHANTOMJS)dcap["phantomjs.page.settings.userAgent"] = random.choice(userAgent)# print dcap["phantomjs.page.settings.userAgent"]driver=webdriver.PhantomJS(desired_capabilities=dcap)

速度还是提不上来,想了一下应该是selenium加载页面太慢了再加上网站自身的拦截。这个办法应该是不行了。

实在没想到其他办法,就去拿了之前自动化测试的东西来暴力爬了。直接用了selenium+火狐浏览器,以可视化的浏览器的界面方式去达到想要的目的。成功是成功了,但是selenium的速度太慢了,我估计爬一章最快都需要两三分钟。这还是网站没有封我的IP的情况下,如果在一定时间内连续请求图片的话网站就会中断请求,或者返回一些与你想要的图片不符的图片过来。所以终究以失败告终。

最后附上本渣失败的源码下载地址:http://download.csdn.net/detail/ztzy520/9762153
selenium的一些基本使用:http://blog.csdn.net/ztzy520/article/details/53940127

呕心沥血写出来的,转载请一定注明出处!

漫画爬虫的一个小小的例子相关推荐

  1. android 多线程 加锁,android 多线程 — 从一个小例子再次品位多线程

    今天回味 volatile 时看到了别人的一个 Demo: class VolatileDemo() { var flag: Boolean = false fun read() { while (! ...

  2. char转成string_真没想到,一个小小的String居然还有这么多窍门?

    推荐学习 公司来了位阿里P8大神,看完他的手写"Kafka笔记",万分膜拜 牛掰!"基础-中级-高级"Java程序员面试集结,看完献出我的膝盖 真没想到,一个小 ...

  3. java的正则表达式 CPU_小心踩雷!一个小小的正则表达式竟把CPU拖垮......

    原标题:小心踩雷!一个小小的正则表达式竟把CPU拖垮...... " 前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%. 通过 ...

  4. 可能我也没有想到,我能把写文章这件事因为一个小小的念头而坚持下来!

    大家好,我是小一 周末的时光总是很短暂,又一个周末过去了,下一个周末只放一天假.闲聊一下自己这段时间的一些个人感受吧 不知道大家有没有发现,从去年疫情期间开始,突然多了 好多好多 的公众号大佬,特别是 ...

  5. python练手漫画爬虫,代码,软件成品打包下载链接,效果图

    #-*-coding:GBK -*- import urllib.request import lxml import pyquery import zlib import winreg #操作注册表 ...

  6. [Python BeautifulSoup Threading] 多线程漫画爬虫

    漫画爬虫 简介 爬取公开漫画资源,下载完成后打包成Zip发送至手机指定文件夹. 20201020:新增manganelo爬虫,也是英文漫画,使用了beautifulsoup解析网页,同时使用了多线程. ...

  7. 网络漫画爬虫:抓取漫画章节和图片

    目录 摘要 1. 介绍 2. 环境准备 安装Python和相应库 3. 爬虫基础知识 HTTP请求和响应 解析网页内容 Robots.txt文件 4. 抓取漫画章节 选择目标网站 发送HTTP请求 解 ...

  8. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  9. 用一个实际例子理解Docker volume工作原理

    要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...

最新文章

  1. android 相机智能补光,美图秀秀智能补光功能应用详解
  2. AI每日精选:AI可追踪人体血糖水平;中国或成为首个AI超级大国
  3. python redis链接建立实现分析
  4. 手把手教你发布自己的CocoaPods开源库
  5. 检查联网状态并设置网络
  6. 中国房地产行业调查分析与发展前景研究报告2022年版
  7. IntelliJ IDEA连接数据库时报错:服务器返回无效的时区,需要设置 ‘‘serverTimezone‘‘ 属性。
  8. 使用PostgreSQL使用Spring Boot和JPA构建基本应用
  9. 不会配置HTTPS?给我5分钟,手把手教你
  10. java中与接口类,Java中类与类、类与接口、接口与接口的关系
  11. 一款基于jQuery底部带缩略图的焦点图
  12. L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT
  13. python 有趣的爬虫_Python有趣|微博榜单爬虫,尽知天下事
  14. 吊炸天!15岁成杀人犯,监狱里学编程,37岁获释后年薪70万
  15. linux输入法安装指南,Linux 中文输入法安装
  16. 震撼!七大议题全数入选!九州云与您相约温哥华
  17. 2020全国网络安全知识竞赛链工宝答案 爬取 自动答题
  18. MySQL中全局变量、会话变量、用户变量和局部变量的区别
  19. 《手把手教你构建自己的 Linux 系统》学习笔记(9)
  20. android停止蓝牙音乐服务,蓝牙音乐播放状态一直为暂停态

热门文章

  1. 华为鸿蒙 HarmonyOS 2 正式发布
  2. sbit在c语言中的作用,C语言中对引的读写操作 sbit的三种用法
  3. 女生学java的坏处_女生学java是否真的没有优势
  4. 【初识python 1】Python PPT PDF 转成图片
  5. 多行内容超出...显示的终极解决方案
  6. fadora 23 dnf 更新错误
  7. GEAC盒子相机初始化配置及推流程序使用说明
  8. 前端开发同步和异步的区别?
  9. 手机海豚模拟器怎么添加游戏_af飞行模拟器手机版下载-af飞行模拟器中文游戏手机版 v20.20.17...
  10. [c++]输入一组数据,逆序输出