ajax服务器怎么装(ajax向服务器发送数据)「ajax服务器怎么搭建」

  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.获取章节的链接信息

ajax服务器怎么装(ajax向服务器发送数据) ajax服务器怎么装(ajax向服务器发送数据)「ajax服务器怎么搭建」 行业资讯

  在上面的分析页面的时间,我们知道了章节信息的位置: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

  五、终焉-写在背面

ajax服务器怎么装(ajax向服务器发送数据) ajax服务器怎么装(ajax向服务器发送数据)「ajax服务器怎么搭建」 行业资讯

  至此,漫画喵的计划思绪和重要的代码实现都先容完了。上面的代码只是用来表示,小喵本身下载漫画用的代码是另一套。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

  泉源:喵耳朵

客户评论

我要评论