百度爬虫工程师教你只用500行Python代码构建一个轻量级爬虫框架

百度爬虫工程师教你只用500行Python代码构建一个轻量级爬虫框架,第1张

概述 Features简单、易用;易于定制的Spider;多线程实现并发下载。待改进更多的测试代码;

Features

简单、易用; 易于定制的 SpIDer ; 多线程实现并发下载。

待改进

更多的测试代码; 添加更多的网站爬虫示例; 完善爬虫调度,支持 Request 优先级调度。

xcrawler 介绍

项目结构

├── demo (一个示例 SpIDer)│ ├── baIDu_news.py│ └── __init__.py├── README.md (项目文档)├── setup.py (pip 安装脚本)├── tests (测试代码,尚未完成)└── xcrawler (核心代码) ├── core │ ├── crawler.py (Crawler process,负责管理引擎的配置和启动) │ ├── engine.py (Crawler engine,负责调度并完成 URL 请求和调用解析方法) │ ├── __init__.py ├── __init__.py ├── spIDer │ ├── __init__.py │ ├── request.py │ ├── response.py │ └── spIDer.py (SpIDer 基类,所有的自定义 SpIDer 需要从此处继承) └── utils (一些工具函数) ├── __init__.py └── url.py

Crawler engine (生产者+消费者模型)

引擎启动时会启动一个后台线程池,后台线程池负责下载由调度器提供给它的所有 URL (Request),并将响应(Response)结果存放到队列中; 引擎的前台解析线程会不断消费处理队列中的响应(Response),并调用相应 SpIDer 的解析函数处理这些相应; 引擎负责处页面理解析回来的对象,所有的 Request 对象都会被放到队列中(递归抓取时)等待处理,所有的字典对象(item)送给 SpIDer 的 process_item 方法处理。

配置介绍

配置项目download_delay : 每批次之间的下载延迟(单位为秒),默认为 0; download_timeout :下载等待延迟,默认为 6 秒; retry_on_timeout :即当下载超时后,对应的请求是否应该重试; concurrent_requests :并发下载数; queue_size :请求队列大小,当队列已满时,会阻塞后续的请求。示例配置: 进群:548377875   海量学习教程,大牛随时答疑  
settings = { 'download_delay': 0,'download_timeout': 6,'retry_on_timeout': True,'concurrent_requests': 32,'queue_size': 512}

SpIDer 基类关键方法介绍

spIDer_started :该方法会在引擎启动时被触发调用,你可以通过继承该方法进行一些初始化工作,比如配置 pipeline 输出文件或者数据库连接等等; spIDer_IDle :该方法会在引擎处理空闲状态(即没有任何 requests 在队列)时被触发调用,你可以通过继承该方法给引擎添加新的请求等(使用 self.crawler . crawl ( new_request,spIDer = self )即可); spIDer_stopped :该方法会在引擎关闭时触发调用,你可以通过继承该方法并在 SpIDer 结束工作前做一些清理工作,如关闭文件管道、关闭数据库连接等; start_requests :该方法会为引擎提该 SpIDer 的对应种子请求; make_requests_from_url :该方法会为你的 URL 创建一个 Request 对象; parse :该方法为请求的默认解析函数回调,当然你可以可以在创建 Request 时指定其它的回调函数; process_request :每当引擎处理一个 SpIDer 对应的请求时,该方法会被触发调用,你可以通过继承该方法对 request 做些设置,比如更换随机的 User - Agent ,替换 cookies 或者代理等;当然,你可以将 request 设置为 None 从而忽略该请求; proccess_response :每当引擎处理一个 SpIDer 对应的响应时,该方法会被触发调用; process_item :每当引擎处理一个 SpIDer 对应的 item 时,该方法会被触发调用,你可以通过继承该方法将抓取并解析到的 item 存储到数据库或者本地文件中。

注意

你可以在一个 Crawler 进程中装入不同的 SpIDer class ,但需要保证不同的 SpIDer 的名称也要不同,否则会被引擎拒绝; 需要根据情况调整下载延迟和并发数大小;下载延迟尽量不要太大,否则每批请求可能会等待较长时间才会处理完成,从而影响爬虫性能; windows 下的测试还没做,我用的是 Ubuntu ,所以如果您有什么问题,欢迎反馈哈!

安装

请移步项目主页 xcrawler (https://github.com/chrisleegit/xcrawler) 下载源码; 请保证你的安装环境为 Python 3.4+ ; 请使用 pip 3 setup.py install 安装即可。

示例

from xcrawler import CrawlerProcessfrom xcrawler.spIDer import BaseSpIDer,Requestfrom lxml.HTML import fromstringimport Json__version__ = '0.0.1'__author__ = 'Chris'class BaIDuNewsspIDer(BaseSpIDer): name = 'baIDu_news_spIDer' start_urls = ['http://news.baIDu.com/'] default_headers = { 'User-Agent': 'Mozilla/5.0 (X11; linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) ' 'Chrome/50.0.2661.102 Safari/537.36' } def spIDer_started(self): self.file = open('items.jl','w') def spIDer_stopped(self): self.file.close() def spIDer_IDle(self): # 引擎空闲时,你也可以从数据库中提取新的 URL 进来 print('I am in IDle mode') # self.crawler.crawl(new_request,spIDer=self) def make_requests_from_url(self,url): return Request(url,headers=self.default_headers) def parse(self,response): root = fromstring(response.content,base_url=response.base_url) for element in root.xpath('//a[@target="_blank"]'): Title = self._extract_first(element,'text()') link = self._extract_first(element,'@href').strip() if Title: if link.startswith('http://') or link.startswith('https://'): yIEld {'Title': Title,'link': link} yIEld Request(link,headers=self.default_headers,callback=self.parse_news,Meta={'Title': Title}) def parse_news(self,response): pass def process_item(self,item): print(item) print(Json.dumps(item,ensure_ascii=False),file=self.file) @staticmethod def _extract_first(element,exp,default=''): r = element.xpath(exp) if len(r): return r[0] return defaultdef main(): settings = { 'download_delay': 1,'concurrent_requests': 16,'queue_size': 512 } crawler = CrawlerProcess(settings,'DEBUG') crawler.crawl(BaIDuNewsspIDer) crawler.start()if __name__ == '__main__': main()

版权声明

本文由 Christopher L 发表,采用 知识共享署名——非商业性使用——相同方式共享 4.0 国际许可协议 进行许可。请确保你已了解许可协议,并在转载 时声明。 本文固定链接: http://blog.chriscabin.com/?p=1512。 总结

以上是内存溢出为你收集整理的百度爬虫工程师教你只用500行Python代码构建一个轻量级爬虫框架全部内容,希望文章能够帮你解决百度爬虫工程师教你只用500行Python代码构建一个轻量级爬虫框架所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1208463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存