python爬虫框架——Scrapy学习

说起写爬虫,大多数第一时间想到的就是python了。python语法简洁明了,加上及其丰富好用的库,用它来写爬虫有天然的优势。

之前学python的时候也用requests+lxml写过几个爬虫玩,但是都就爬取一些内容就没继续下去了,都没做成一个项目,中间python也荒废了好久。最近要学kafka,就打算爬点数据来实践实践。于是就学起scrapy来,总的来说,scrapy还是很容易上手的,也比较简单,花了几天的时间学习加实践,也渐渐的掌握了这个爬虫框架。所以打算写个博客做个总结,以免之后又太久没用忘记了。

scrapy架构原理

scrapy架构图
scrapy架构
1. scrapy引擎向spider获取起始Request集合,也就是spider中定义的start_urls。如果spider重写了start_requests()方法,那么这个方法返回的Request集合就是起始Request。
2. scrapy引擎将拿到的Request发给调度中心开始调度。
3. scrapy引擎向调度中心请求获取下一个要爬取的Request。
4. scrapy引擎拿到Request后,然后将Request发给下载器。这个过程经过一系列在settings.py中配置的下载中间件,所有在settings.py中配置的下载中间件会依次对Request进行处理。——对应DownloaderMiddleware#process_request()方法
5. 下载器根据Request拉取响应的内容,比如Request的url是http://www.baidu.com,下载器就会拉取对应的网页内容下来并封装成Response对象。
6. 下载器将Response发送给scrapy引擎。这个过程也会经过一系列在settings.py中配置的下载中间件,这些下载中间件会依次对Response进行处理。——对应DownloaderMiddleware#process_response()方法
7. scrapy引擎拿到Response后将Response发给spider,交给对应的spider函数处理。这里默认方法是parse(),这个回调方法构造Request的时候指定。引擎发送Response的过程会经过一系列在settings.py中配置的spider中间件,这些spider中间件会依次对Response进行一些处理。——对应SpiderMiddleware#process_spider_input()
8. spider处理完Response后会返回一个result,这个result是一个包含 Request 或 Item 对象的可迭代对象(iterable)。然后将result发给scrapy引擎,这个过程也会经过一系列在settings.py中配置的spider中间件,这些spider中间件会依次对这个result进行一些处理。——对应SpiderMiddleware#process_spider_output()
9. scrapy引擎拿到这个result后,会将其中的Item发送给Item Pipeline处理,这些item就会被一系列我们在settings.py中配置的pipeline处理。同时,scrapy也会将result中的Request发给调度中间准备调度。
10. 继续重复第2步的步骤,直到所有的Request全部处理完后程序退出。

在scrapy 0.15版本后,spider中间件新增了一个方法,用于处理第一步中spider发送给引擎的Request,也就是SpiderMiddleware#process_start_requests(start_requests, spider)

猜你喜欢

转载自blog.csdn.net/u013332124/article/details/80645690