漫画爬虫的一个小小的例子

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

说一下前一段时间玩爬虫的时候作死的一个小例子吧。大概的描述就是闲的没事做,去爬了一个漫画网站,想着成功了去装个逼。结果代码写到吐血。这个网站的反爬还真是做的让我这种技术渣又爱又恨啊,这个漫画网站就是:爱漫画(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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值