「《用 Python 写网络爬虫》- 学习笔记」

  CREATED BY JENKINSBOT

相关资源

章节代码: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 总结

这里就不再整理,是一些更加具体的示例。