相关资源
章节代码:https://bitbucket.org/wswp/code/src/default
示例网站:http://example.webscraping.com
相关源码:https://bitbucket.org/wswp/places/src/default
语言学习:http://diveintopython.net
#1 网络爬虫简介
1.1 网络爬虫合适有用
1.2 网络爬虫是否合法
1.3 调研网站的信息
# robots.txt
通过robots.txt了解网站信息。通过sitemap.xml了解网站信息。
# sitemap.xml
也可使用高级搜索页面:https://www.google.com/advanced_search
# 站点大小估算
可以使用搜索引擎的site:来估算站点页面的多少。
# 技术栈识别
使用builtwith工具可以检测网站使用的技术栈。
# 寻找站点所有者
分析网站的所有者(有点社工了),可以使用python-whois包模块。
1.4 编写第一个网络爬虫
# 下载网络
单纯的下载。
# 使用sitemap下载网页
# 通过ID遍历
# 链接爬虫
通过正则匹配页面链接
# 相应码的含义
使用“http://httpstat.us”进行响应码测试
#2 数据抓取
2.1 分析页面
通过一些浏览器插件,分析页面的结构。
2.2 抓取页面的三种方法
# 正则表达式
偏向于简单的爬虫。
# Beautiful Soup
可以像操作XML一样操作HTML元素。
# Lxml
功能更加强大,性能也更高,同时支持CSS选择器
# 同时还可以添加回调函数,处理页面。
#3 下载缓存
3.1 为爬虫页面添加缓存
获取页面的信息及相关的连接,准备键数据进行缓存。
3.2 磁盘缓存
将数据缓存到磁盘,还可以附带缓存过期功能,比如生成序列化的数据,将日期保存在序列化的数据中。
3.3 数据库缓存
将数据保存在MongoDB中,使用MongoDB保存数据,并设置缓存过期时间,这个缓存过期时间是由数据库支持的。
还可以对数据进行压缩。
#4 并发下载
4.1 爬取100万个网页
如果由很多页面要爬取,该如何处理。
4.2 串行爬虫
前面介绍的爬虫都是串行的,即每次只爬取一个,在完成一个后,再处理下一个。
4.3 多线程爬虫
可以使用多线程爬虫,使用多个线程执行爬行任务。
还可以将爬行任务写入数据库中,执行多个进程,同时爬行数据。
4.4 性能
通常进程与线程越多速度越快,但是它呈现出一种对数变化其实,因为带宽及线程进程上下问的切换都是需要时间的。
#5 动态内容
5.1 动态网页示例
动态网页的意思就是说这个页面上的数据是动态加载的。并不是直接包换在HTML中的,而是经过程序执行,比如JS脚本,后产生的。
5.2 对动态网页逆向工程
分析页面的请求,比如由AJAX函数,那我们可以直接把AJAX地址拿来,然后对其进行爬取。
5.3 渲染动态网页
但是有些情况就比较复杂了,比如JS被压缩,代码可读性差,编码,混淆等等各种原因,导致我们没有那么容易。
这时候可以使用「渲染引擎」。我们这里使用的「WebKit」渲染引擎,Qt框架提供,Qt框架是UI框架。这个渲染引擎可以执行JS等代码,它就是浏览器的内核。
使用PySide库,可以操作它,该库是Qt的Python库,可以用Python创建一个Qt应用。或者使用PyQt库,但是该库不能用于商业。
# 使用并不复杂:实例化对象,加载URL地址,等待完成,获取HTML内容,使用LXMl库处理,又与之前的过程相同了。
# 另外Qt中,还提供了非常帮的API可以与HTML互操作,还能注入JS进行执行。
# 一个复杂的技术点是:等待页面相应。在Qt中,可能还没有API去判断AJAX是否执行结束。
# 除了PyQt外,我们还可以使用Selenium库,不如WebKit灵活,但是可以用它操作电脑上安装的浏览器。它的初衷是与浏览器交互,所以在HTML的操纵上会比较差,需要注入JS才能操作HTML内容。
#6 表单交互
6.1 登录表单
使用代码访问表单表单进行登录,但是注意提交页面中的隐藏元素。可以使用parse_form(html)获取所有的隐藏表单属性,然后全部进行提交。
还有一点需要注意,进行Coolie传递,需要使用cookielib库。
还以一个办法是从系统中直接加载浏览器的Cookie文件,这可以借助borwsercookie模块
6.2 支持内容更新的登录脚本扩展
当然,我们也可以使用代码提交表单,修改数据。比如使用库发送POST请求。
6.3 指用Mechanize实现自动化表单处理
使用Mechanize库可以使得表单的操作更加的简单,打开URL之后,设置指定的参数即可。
#7 验证码处理
7.1 注册帐号
使用Pillow模块获取页面中的验证码,但是验证码,但是文中的验证码是Base64存储的,所以具体的情况还有待研究。
7.2 光学字符识别
使用tesseract进行验证码识别,但是要先用Pillow库进行验证码降噪。
当然,对于验证码的识别,可能还要进行一些更加复杂的处理,对OCR训练等等。
7.3 处理复杂验证码
可以使用9kw.eu等服务,即打码平台对验证码进行处理。
#8 Scrapy
8.1 安装
安装比较容易,使用pip install scrapy即可。
8.2 启动项目
初始化项目
8.2.1 定义模型
在<proj>/items.py是一个模型文件。ExampleItem是一个模板,将其内容定义为要爬取的字段
8.2.2 创建爬虫
使用genspider命令生成,传入爬虫名、域名、模板参数,就可以生成初时的爬虫模板。
在<proj>/settings.py中,可以设置爬虫的爬行频率和参数等等。
8.2.3 使用Shell命令抓取
该框架还提供了内置Shell的功能来爬取页面。
8.2.4 检查结果
输出还可以重定向到文件中,通过–output选项实现。
8.2.5 终端与恢复爬虫
使用Ctrl + C停止爬虫,下次可以以相同的命令,重新开始。
8.3 使用Portia编写可视化爬虫
基于Scrapy的图形化工具。可以使用虚拟化环境(pip install virtualenv)将系统与之隔离。
安装后,启动服务,浏览器访问,定义要抓取的页面,它会生成一个Scrapy项目。同时也需要进行一些Scrapy的配置。
8.4 使用Scrapely自动化抓取
上面的Portia使用了该模块,但是该模块可以单独使用,可以对爬虫进行简单的训练,然后就可以了。
#9 总结
这里就不再整理,是一些更加具体的示例。