Beginning
这次的博客,讲的是利用python编写一个爬虫工具。为什么要写这个爬虫呢?缘故起因是小喵在看完《极黑的布伦希尔特》这个动画之后,又想看看漫画,结果发现各大APP都没有资源,终极好不轻易找到一个网站可以看,但是由于网速太渣,看起来额外的费劲。这时间假如能提前下载下来就好了。
先上项目地点(github):https://github.com/miaoerduo/cartoon-cat。欢迎各人随时fork、star和指教。
缘故起因就是如许,作为技能喵,任何题目都不能拦阻一颗爱漫画的心。以是题目就来了,发掘机技修哪家强?
在bing上搜刮Python、爬虫框架。找到各人常用的框架。
Scrapy好像是个很不错的选择。至于相对于其他框架的长处,小喵没有细查,至少这个框架是之前听过的。但是在实现的时间发现有一些题目,scrapy不能直接抓取动态的页面。小喵必要抓取的网站的漫画都是利用Ajax天生的。必要本身分析各种数据,这个有点贫苦。
那么有没有可以渲染页面的工具呢?像欣赏器一样的?有。
这里先容两个工具:
PhantomJs,可以明白是一个欣赏器。不外它没有界面,我们可以通过js的代码模仿用户的举动。这就要求相识它的api并有js底子了。
Selenium,这是个欣赏器主动化测试框架。它依靠于欣赏器(这个欣赏器也可以是PhantomJs),通过Selenium可以模仿用户的举动。而且有Python接口,以是相对简单一些。
我们这个爬虫利用selenium+phantomjs来实现。
哟,这个爬虫软件应该有个响当当的名字。。。就叫漫画喵吧,英文名CartoonCat。
下面我们一点点的先容这个爬虫的实现过程吧。
一、初生-环境搭建
小喵这里选用Python作为开辟语言,框架是selenium。缘故起因是python常常用来写爬虫,selenium可以用来模仿用户举动,PhantomJs是可选的,不外小喵终极会在一个服务器上运行,以是也是必要的。
为了不影响本机上的python,我们还必要利用virtualenv来创建一个独立的python环境。具体步调如下:
1.安装virtualenv
virtualenv是一个常用的用来创建python环境的工具。小喵用这个有两个缘故起因,一是为了不污染本机的环境,二是在本机直接安装库的时间出了一个权限的题目。
virtualenv的安装非常简单,利用pip工具就可以安装。
pipinstallvirtualenv
待程序实行竣事,你就会开心的发现本身已经有了virtualenv这个工具了。
2.创建python环境
virtualenv的利用非常的方便。
创建新的运行环境:virtualenvenv-name
进入相应的独立环境:sourceenv-path/bin/activate
实行完第一个指令后,就会创建乐成一个python环境,实行第二个指令后,就会发现下令行的起始位置有变革。这时间python、pip等工具就变成利用这个新环境的了,固然也可以利用whichpython来查察。
3.安装selenium
进入新环境后,pip安装的依靠库都会在新环境中安装,不会影响主机自身的python。利用pip安装selenium:
pipinstallselenium
至此,我们的根本环境就搭建完了。
4.安装PhantomJs
这个只在从官网上下载就可以:https://phantomjs.org/download.html
小喵的本地实行环境是Mac,以是下载了Mac版本。解压之后就可以利用。
二、寻觅-搜资源
小喵想看的这个漫画貌似各大网站都没有资源,在费了九牛二虎之力后,终于找到了一个网站!https://www.tazhe.com/mh/9170/。
每个网站的布局都不雷同,因此都必要定制一套爬虫程序。本文的爬虫就只能针对这个漫画网站利用,喵粉们必要爬其他网站的话,必要本身做相应的修改。
三、分析-资源分析
这里必要分析两个页面,一个是漫画的首页,比如前面的:https://www.tazhe.com/mh/9170/
另一个就是具体章节的页面。
1.首页
为了减小图片的巨细,小喵把窗口做了缩放。首页大抵是这个样子。
图1漫画首页
各类信息非常的明白。我们关注的就是下面的漫画列表。通过Chrome强大的检察元素的功能,我们立即就能定位到章节的位置。(对着感爱好的位置-右键-检察就能找到)
图2章节的节点
可以看到,章节地点的地区的id是play_0,学过前端的童鞋都应该知道,一个页面中id通常唯一标示一个节点。因此假如我们可以或许获取这个页面的话,查找id为play_0的节点就能一下子缩小搜刮范围。
而每个章节的信息都是一个a标签,标签的href是对应章节的具体网址,标签的文本部分是章节名。如许相对关系就得出了:div#play_0ullia。
首页的分析就到此竣事。
2.章节页面
我们随意打开一个具体章节的页面。比如:https://www.tazhe.com/mh/9170/1187086.html
引入眼帘的是一个很干净的页面(简直是漫画界的清流,很多多少漫画网站上全部是广告)。
我们把鼠标放在图片这个地区-右键-检察。
咦,我们的右键怎么按不了?
着实呢,这个征象在小说网站上碰到的机遇会更多。当我们看到比力精美的笔墨或是炫酷的图片,都会下意识的选中-右键-生存。而很多时间,这些资源都是有版权的。并不应该随意的传播(狠狠的打了本身的脸/(ㄒoㄒ)/~~)。因此限定鼠标右键会是一个很简单却有效的办法。
那么我们怎样绕过这个陷阱呢?
很简单,我们不消右键即可。打开欣赏器的开辟者工具选项,找到elements这个选项。可以看到一个复杂的布局(着实和上面检察元素之后的结果一样)。之后不绝的选中标签,当标签被选中时,左侧页面中对应的位置会有蓝色。多试反复,终极就能找到对应的位置。
图3漫画图片
这是一个img标签,对应的id是qTcms_pic。如许找到这个id,就能找到这个img标签,根据src就能找到图片的具体URI地点。
接下来是找到下一张图片的地点。这时间必要查察下一页这个按钮的内容。用雷同的方法,很轻易定位乐成。
图4下一页
小喵原来是用scrapy来做爬虫的,看到这里的时间就果断放弃了。我们分析一下,选中的a标签的代码如下:
aclass="next"href="java:a_f_qTcms_Pic_nextUrl_Href();"title="下一页"span下一页/span/a
比力简单的网站,“下一页”可以用真的a标签和href属性来做。如许的长处是实现比力简单,弊端是一旦得到网页源码就能很轻易的分析。而像scrapy如许的爬虫工具只能抓取静态的代码(动态的必要本身分析ajax,有点贫苦)。而显然这里的页面是动态的,利用了ajax来实现。以是光是得到网页源码并不能真的得到图片,而是必须让此中的js代码运行才可以。以是我们才必要利用欣赏器大概PhantomJs如许的可以实行js代码的工具。
上面的a标签的代码告诉了我们很多信息。起首是告诉了我们,这个节点的位置,通过next这个类名可以方便的找到该节点(着实有两个类名为next的按钮,另一个在下面,但是功能都一样)。其次,当这个按钮被点击时会调用:a_f_qTcms_Pic_nextUrl_Href()这个js函数。岂非我们必要再研究这个函数?
不消。由于PhantomJs的脚色就是一个欣赏器。我们只必要向真正的用户一样点击一下这个next按钮,就会进入下一个页面。/*感受到这个工具的强大了吗?*/
3.判定章节的末端
末了一个题目就是,怎样判定这个章节竣事了?
我们跳到章节的末了一页,然后再次点击“下一页”,这时间会出现一个弹窗。
图5末了一页
多次试验之后,我们会发现,只有在末了一页的时间才会弹出这个弹窗,如许的话,我们每抓取完一页,点击一次“下一页”,判定有无弹窗就知道是不是末了一页了。在右侧的开辟者工具中我们可以或许看到,这个弹窗是一个id为msgDiv的div(而且它的出现和消散是通过增减节点来实现的,另一种实现方法是将display设成none和block,这种环境可以根据display的属性来判定)。以是我们判定这个节点存不存在就行了。
至此,两种页面的分析都完成了。下一步就开始我们的代码实现吧。
四、逆袭——代码实现1.selenium的简单用法
fromseleniumimportwebdriver
browser=webdriver.Firefox()
#browser=webdriver.Safari()
#browser=webdriver.Chrome()
#browser=webdriver.Ie()
#browser=webdriver.PhantomJs()
browser.get('https://baidu.com')
printbrowser.title
#doanythingyouwant
上面是一个简单的例子,第一步import依靠的库。
第二步,得到一个欣赏器实例。selenium支持多种欣赏器。利用firefox之外的欣赏器都必要下载驱动(selenium本身自带了firefox的驱动)。驱动下载地点:https://pypi.python.org/pypi/selenium。驱动下载完之后将它的路径参加到PATH里,确保驱动程序可以或许被访问到。大概显式的把驱动程序的地点当参数传入。像下面一样调用:
browser=webdriver.PhantomJs('path/to/phantomjs')
第三步,用get的方式打开网页。
末了,通过browser对象来分析和处理惩罚页面。
2.获取章节的链接信息
在上面的分析页面的时间,我们知道了章节信息的位置:div#play_0ullia。如许就可以分析出章节信息。browser支持一大堆的选择器。大大简化我们查找节点的工作。
fromseleniumimportwebdriver
if__name__=="__main__":
driver="path/to/driver"#驱动地点
browser=webdriver.PhantomJS(driver)#欣赏器实例
main_page="https://www.tazhe.com/mh/9170/"
browser.get(main_page)#加载页面
#分析出章节的元素节点
chapter_elem_list=browser.find_elements_by_css_selector('#play_0ullia')#通过css选择器找出章节节点
chapter_elem_list.reverse()#本来的章节是倒叙的
chapter_list=[]
forchapter_eleminchapter_elem_list:
#元素的text和href属性分别就是章节的名称和地点
chapter_list.append((chapter_elem.text,chapter_elem.get_attribute('href')))
#chapter_list就是章节的信息
3.给定一个章节的地点,章节中的图片
这一步涉及到节点的获取、模仿鼠标的点击以及资源的下载。selenium的点击实现特别的人性化。只必要获取节点然后调用click()方法就搞定。资源的下载网上有很多教程,重要有两个方法,通过模仿右键另存为,和获取url用其他工具下载。思量到这里的右键不肯定可用,而且操纵有一点点复杂。小喵选用了第二种方案。
fromseleniumimportwebdriver
fromselenium.common.exceptionsimportNoSuchElementException
importos
fromosimportpathasosp
importurllib
#一个简单的下载器
download(url,save_path):
try:
withopen(save_path,'wb')asfp:
fp.write(urllib.urlopen(url).read())
exceptException,et:
print(et)
if__name__=="__main__":
driver="path/to/driver"#驱动地点
browser=webdriver.PhantomJS(driver)#欣赏器实例
chapter_url="https://www.tazhe.com/mh/9170/1187061.html"
save_folder="./download"
ifnotosp.exists(save_folder):
os.mkdir(save_folder)
image_idx=1
browser.get(chapter_url)#加载第一个页面
whileTrue:
#根据前文的分析,找到图片的URI地点
image_url=browser.find_element_by_css_selector('#qTcms_pic').get_attribute('src')
save_image_name=osp.join(save_folder,('%05d'%image_idx)+'.'+osp.basename(image_url).split('.')[-1])
download(image_url,save_image_name)#下载图片
#通过模仿点击加载下一页,留意假如是末了一页,会出现弹窗提示
browser.find_element_by_css_selector('a.next').click()
try:
#找寻弹窗,假如弹窗存在,阐明这个章节下载完毕,这个大循环也就竣事了
browser.find_element_by_css_selector('#bgDiv')
break
exceptNoSuchElementException:
#没有竣事弹窗,继承下载
image_idx+=1
五、终焉-写在背面
至此,漫画喵的计划思绪和重要的代码实现都先容完了。上面的代码只是用来表示,小喵本身下载漫画用的代码是另一套。github的地点是:https://github.com/miaoerduo/cartoon-cat。项目只有100多行。不外也用了小喵不少的一段时间。
博客写完了~小喵的漫画也下完了~
图6下载好的漫画
原文链接:https://www.miaoerduo.com/python/%E7%88%AC%E8%99%AB-%E6%BC%AB%E7%94%BB%E5%96%B5%E7%9A%84100%E8%A1%8C%E9%80%86%E8%A2%AD.html?utm_source=tuicoolutm_medium=referral
作者:MIAO
泉源:喵耳朵
我要评论