爬虫实战2—动态网页的爬取

文章说明:本文是在学习一个网络爬虫课程时所做笔记,文章如有不对的地方,欢迎指出,积极讨论。

一、网站结构分析及案例:马蜂窝

(一)Robots.txt(网站架构图,告诉spider哪些可以爬或是不可以爬)

1.网站对爬虫的限制(以马蜂窝为例:www.mafengwo.cn/robots.txt)

爬虫实战2—动态网页的爬取_第1张图片

2.利用sitemap来分析网站结构和估算目标网页的规模

爬虫实战2—动态网页的爬取_第2张图片

二、XML(EXtensible Markup Language)

详细教程XML教程

三、XPath

详细教程XPath教程

四、正则表达式(详细教程正则表达式

(一)简介

正则表达式是对字符串操作的一种逻辑公式,就是事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符创的一种过滤逻辑

在爬虫的解析中,经常会将正则表达式DOM选择器结合使用。正则表达式适用于字符串特征比较明显的情况,但是同样的正则表达式可能在HTML源码里多次出现,而DOM选择器可以通过class及id来精确找到DOM模块,从而缩小查找的范围。  (xpath + re

(二)常用规则

爬虫实战2—动态网页的爬取_第3张图片

(三)爬虫常用的正则规则

1. 获取标签下的文本:

](.*?)’

2. 查找特定类别的链接,例如/wiki/不包含Category目录:

]*>(.*?)<”’

3. 查找商品外链,例如jd的商品外链为7位数字的a标签节点:

‘^d{7}.html’

4. 查找淘宝的商品信息,‘或者’开始及结尾:

‘href=[\”\’]{1}(//detail.taobao.com/item.htm[^>\”\’\s]+?)”’

(四)贪婪模式与非贪婪模式

?字符紧跟在任何一起其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认是非贪婪模式则尽可能多的匹配所搜索的字符串。

五、动态网页

(一)动态网页的使用场景

1.单页模式:指的是不需要外部跳转的网页,例如个人设置中心经常就是单页。

2.页面交互多的场景:一部分网页上,有很多的用户交互接口,例如去哪儿的机票选择网页,用户可以反复修改查询的参数。

3.内容及模块丰富的网页:有些网页内容很丰富,一次加载完对服务器夜里很大,而且这种方式延时也会很差;用户往往也不会查看所有内容。

(二)动态网页带来的挑战

对于爬虫:

1. 简单下载HTML已经不行了,必须得有一个web容器来运行HTML的脚本(执行JavaScript)

2. 增加了爬取的时间

3. 增加了计算机的CPU内存的资源消耗

4. 增加了爬取的不确定性(需要循环检测)

对于网站:

1. 为了配合搜索引擎的爬取,与搜索相关的信息会采用静态方式

2. 与搜索无关的信息,例如商品的价格、评论,仍然会使用动态加载

(三)动态网页的分析

1.打开目标网页后,直接右键点击,只保存HTML;

2.把网页滑动到页面的最下面,然后保存,这次选择保存完整网页;

3.使用BeyondCompare或者SVN等工具,大致找出动态加载的部分,记录下它们的 class 或 id。

六、使用 PhantomJS + Selenium 抓取

(一)概述

PhantomJS:基于webkit的headless的javasscript API。

selenium:一个自动化的web测试工具

(二)安装(教程)

1.selenium:pip install selenium

2.phantomJS:PhantomJS下载,下载后解压后,把文件夹bin中的phantomjs.exe移到Anaconda3文件夹中的Scripts中

检测:

爬虫实战2—动态网页的爬取_第4张图片

(三)使用PhantomJS加载动态页面

示例:

爬虫实战2—动态网页的爬取_第5张图片

1. set_window_size:

对于动态网页,有可能存在大量数据是根据视图来动态加载的,PhantomJS允许客户端设置用来渲染模拟页面的窗口的尺寸,这个窗口如果设置比较小,就不得不用JavaScript的scoll命令来模拟页面往下滑动的效果以显示更多内容,所以我们可以设置一个相对大的窗口高度来渲染

set_window_size(1280,2400)    #optional

2. UsefulMethods & Properties

Selenium通过浏览器的驱动,支持大量的HTML及JavaScript的操作,常用的可以包括:

(1)page_souce:获取当前的HTML文本

(2)title:HTML的title

(3)current_url:当前网页的URL

(4)get_cookie()& get_cookies():获取当前的cookie

(5)delete_cookie()& delete_all_cookies():删除所有的cookie

(6)add_cookie():添加一段cookie

(7)set_page_load_timeout():设置网页超时

(8)execute_script():同步执行一段JavaScript命令

(9)execute_async_script():异步执行JavaScript命令

(四)关闭及清理爬虫进程

1. Selenium通过内嵌的浏览器driver与浏览器进程通信,因此在退出的时候必须调用driver.close()及driver.quit()来退出PhantomJS,否则PhantomJS会一直运行在后台并占用系统资源。

爬虫实战2—动态网页的爬取_第6张图片

2. 具体方法及操作代码

(1)send signalis recommended :

      driver.service.process.send_signal(signal.SIGTERM)

(2)this is notguaranteed to close PhantomJS :

      driver.close()

(3)to assure it’sclosed, run below command in terminal :

      pgrep phantomjs \ xargskill

内存泄漏(memory leak):程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄漏具有隐蔽性积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。且不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能导致系统崩溃。

(五)提取动态数据

1.加载的过程中,根据网络环境的优劣,会存在一些延时,因此要多次尝试提取,提取不到不意味着数据不存在或者网络出错

2.动态页面的元素,所使用的id或class经常会不止一个,例如京东一件商品的“好评率”,class包括了rate和percent-con两种,因此需要对两种情况都进行尝试。更通用的情况,如果一个元素不能找到而selenium并没有网络错误,那么有可能这个元素的class或id有了新的定义,我们需要将找不到的页面及圆度信息记录在日志里,使得后续可以分析,找出新的定义并对这一类页面重新提取信息。

(六)PhantomJS配置

1. --ignore-ssl-errors = [true|false]  ignores ssl errors,such asexpired or self-signed certificate errors (default is false).Also accepted:[yes|no].

一些证书没有获得CA授权(多事自己制作的证书,如12306),浏览器会报酬证书不受信任,这种情况需要用户交互操作(点击继续),使用这个命令后,能自动忽略此类错误。

2. --load-images = [true|false]  load all images (defaule istrue) . Also accepted:[yes|no].

3. --disk-cache = [true|false]  enables disk cache (atdesktop services cache storage location , default is false).Alsoaccepted:[yes|no].

网页上一般都存在大量的图片,这些图片对我们第一次执行抓取是没有用的,在这种情况下,选择—load-images=false可以不下载这些图片,加快下载速度。

4. –config = /path/to/config.json  specifies JSDN-formattedconfiguration file (see below).

5. --cookies-file = /path/to/cookies.txt  specifies the file name tostore the persistent Cookies.

6. --debug = [true|false] printsadditional warning and debug message (default is true).Also accepted:[yes|no].




你可能感兴趣的:(爬虫实战2—动态网页的爬取)