文章说明:本文是在学习一个网络爬虫课程时所做笔记,文章如有不对的地方,欢迎指出,积极讨论。
一、网站结构分析及案例:马蜂窝
(一)Robots.txt(网站架构图,告诉spider哪些可以爬或是不可以爬)
1.网站对爬虫的限制(以马蜂窝为例:www.mafengwo.cn/robots.txt)
2.利用sitemap来分析网站结构和估算目标网页的规模
二、XML(EXtensible Markup Language)
详细教程XML教程
三、XPath
详细教程XPath教程
四、正则表达式(详细教程正则表达式)
(一)简介
正则表达式是对字符串操作的一种逻辑公式,就是事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符创的一种过滤逻辑。
在爬虫的解析中,经常会将正则表达式与DOM选择器结合使用。正则表达式适用于字符串特征比较明显的情况,但是同样的正则表达式可能在HTML源码里多次出现,而DOM选择器可以通过class及id来精确找到DOM模块,从而缩小查找的范围。 (xpath + re)
(二)常用规则
(三)爬虫常用的正则规则
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中
检测:
(三)使用PhantomJS加载动态页面
示例:
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. 具体方法及操作代码
(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].