1. Scrapy使用了Twisted异步网络库来处理网络通讯,整体架构:
- Scrapy爬虫框架主要由5个部分组成,分别是:Scrapy Engine(Scrapy引擎),Scheduler(调度器),Downloader(下载器),Spiders(蜘蛛),Item Pipeline(项目管道)。爬取过程是Scrapy引擎发送请求,之后调度器把初始URL交给下载器,然后下载器向服务器发送服务请求,得到响应后将下载的网页内容交与蜘蛛来处理,尔后蜘蛛会对网页进行详细的解析。
- 蜘蛛分析的结果有两种:一种是得到新的URL,之后再次请求调度器,开始进行新一轮的爬取,不断的重复上述过程;另一种是得到所需的数据,之后会转交给项目管道继续处理。项目管道负责数据的清洗、验证、过滤、去重和存储等后期处理,最后由Pipeline输出到文件中,或者存入数据库等。
scrapy startproject XXX可以产生一个项目,其中:
items.py是定义储对象的文件,决定爬取哪些项目;middlewares.py文件是中间件,一般不用进行修改,主要负责相关组件之间的请求与响应;pipelines.py是管道文件,决定爬取后的数据如何进行处理和存储;settings.py是项目的设置文件,设置项目管道数据的处理方法、爬虫频率、表名等;spiders文件夹中放置的是爬虫主体文件(用于实现爬虫逻辑)和一个__init__.py空文件。
python classmethod是用来指定一个类的方法为类方法,可以基于类直接调用方法class.get(),没有此参数指定的类的方法为实例方法。
2. 对spider来说,爬取的循环类似下文:
(1) 以初始的URL初始化Request,并设置回调函数。 当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。
(2) spider中初始的request是通过调用 start_requests()
来获取的。 start_requests()
读取 start_urls
中的URL, 并以 parse
为回调函数生成 Request
。
(3) 在回调函数内分析返回的(网页)内容,返回 Item
对象或者 Request
或者一个包括二者的可迭代容器。 返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。
(4) 在回调函数内,可以使用 选择器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。
(5) 最后,由spider返回的item将被存到数据库(由某些 Item Pipeline 处理)或使用 Feed exports 存入到文件中。
3. 选择器
Xpath是一门用来在XML文件中选择节点的语言,也可以用在HTML上。Scrapy选择器构建于 lxml库之上.
response
是 HtmlResponse
或 XmlResponse
的一个对象,将被用来选择和提取数据。如response.xpath("//div[@class='book-mid-info']")
// 表示相对路径 @后面接属性
4. Items
爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy提供 Item
类来满足这样的需求。
class Product(scrapy.Item): name = scrapy.Field() price = scrapy.Field() stock = scrapy.Field()
在spider调用item实例,予以赋值
item pipeline的一些典型应用:
- 清理HTML数据
- 验证爬取的数据(检查item包含某些字段)
- 查重(并丢弃)
- 将爬取结果保存到数据库中
正则表达式:re.search()并不要求必须从字符串的开头进行匹配,也就是说,正则表达式可以是字符串的一部分。
5. Rule
1.rules内规定了对响应中url的爬取规则,爬取得到的url会被再次进行请求,并根据callback函数和follow属性的设置进行解析或跟进。
这里强调两点:一是会对所有返回的response进行url提取,包括首次url请求得来的response;二是rules列表中规定的所有Rule都会被执行。
2.allow参数没有必要写出要提取的url完整的正则表达式,部分即可,只要能够区别开来。且最重要的是,即使原网页中写的是相对url,通过LinkExtractor这个类也可以提取中绝对的url。
link = LinkExtractor(allow='d{6}.html',restrict_xpaths='//div//table//a')
links = link.extract_links(response)
6. 异步加载爬虫
之前爬取的网站,可以用直接利用Xpath去提取数据,因为所有的数据在一次请求后会全部被加载出来。然而,现在有一些网站使用了异步加载的技术,就是让一部分网页信息先加载出来,然后剩下的东西在满足某种条件下才会被加载,这样做的好处是可以提高网页的加载速度。
7. 正则表达式
s 匹配任何空白字符,包括空格、制表符、换页符等等
S 匹配任何非空白字符。
$ 匹配结尾位置
* 匹配前面字符0或多次
+ 匹配前面字符1或多次
? 匹配前面字符0或1次
{m,n} 至少匹配m次至多n次
d 数字
w 字母,数字,下划线
W 非字母数字下划线