44![ ] ( https://img.shields.io/github/watchers/Boris-code/feapder?style=social )
55![ ] ( https://img.shields.io/github/stars/Boris-code/feapder?style=social )
66![ ] ( https://img.shields.io/github/forks/Boris-code/feapder?style=social )
7+
78## 简介
89
9- ** feapder** 是一款简单、快速、轻量级的爬虫框架。起名源于 fast、easy、air、pro、spider的缩写,以开发快速、抓取快速、使用简单、功能强大为宗旨,历时4年倾心打造。支持轻量爬虫、分布式爬虫、批次爬虫、爬虫集成,以及完善的爬虫报警机制。
10+ ** feapder** 是一款上手简单,功能强大的Python爬虫框架,使用方式类似scrapy,方便由scrapy框架切换过来,框架内置3种爬虫:
11+
12+ - ` AirSpider ` 爬虫比较轻量,学习成本低。面对一些数据量较少,无需断点续爬,无需分布式采集的需求,可采用此爬虫。
13+
14+ - ` Spider ` 是一款基于redis的分布式爬虫,适用于海量数据采集,支持断点续爬、爬虫报警、数据自动入库等功能
15+
16+ - ` BatchSpider ` 是一款分布式批次爬虫,对于需要周期性采集的数据,优先考虑使用本爬虫。
1017
11- 之前一直在公司内部使用,已使用本框架采集100+数据源,日采千万数据。现在开源,供大家学习交流!
18+ ** feapder ** 除了支持 ** 断点续爬 ** 、 ** 数据防丢 ** 、 ** 监控报警 ** 外,还支持 ** 浏览器渲染下载 ** ,自定义入库 ** pipeline ** ,方便对接其他数据库(默认数据库为msyql,数据可自动入库,无需编写pipeline)
1219
1320读音: ` [ˈfiːpdə] `
1421
15- 官方文档:http://boris.org.cn/feapder/
22+ - 官方文档:http://boris.org.cn/feapder/
23+ - github:https://github.com/Boris-code/feapder
24+ - 更新日志:https://github.com/Boris-code/feapder/releases
1625
1726
1827## 环境要求:
@@ -58,7 +67,7 @@ From Git:
5867直接运行,打印如下:
5968
6069 Thread-2|2021-02-09 14:55:11,373|request.py|get_response|line:283|DEBUG|
61- -------------- FirstSpider.parser request for ----------------
70+ -------------- FirstSpider.parse request for ----------------
6271 url = https://www.baidu.com
6372 method = GET
6473 body = {'timeout': 22, 'stream': True, 'verify': False, 'headers': {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36'}}
@@ -72,166 +81,12 @@ From Git:
72811 . start_requests: 生产任务
73822 . parse: 解析数据
7483
75- ## 为什么不使用scrapy
76-
77- scrapy给我的印象:
78-
79- 1 . 重,框架中的许多东西都用不到,如CrawlSpider、XMLFeedSpider
80- 2 . 不好上手,对小白不友好
81- 3 . 不支持从数据库中取任务作为种子抓取
82- 4 . 数据入库不支持批量,需要自己写批量逻辑
83- 5 . 启动方式需要用scrapy命令行,打断点调试不方便
84-
85- ### 举例说明
86-
87- 本文以某东的商品爬虫为例,假如我们有1亿个商品,需要每7天全量更新一次,如何做呢?
88-
89- #### 1. 准备种子任务
90-
91- 首先需要个种子任务表来存储这些商品id,设计表如下:
92-
93- ![ -w1028] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/09/16152931277517.jpg?x-oss-process=style/markdown-media )
94-
95- ``` sql
96- CREATE TABLE `jd_item_task ` (
97- ` id` int (11 ) NOT NULL AUTO_INCREMENT,
98- ` item_id` varchar (100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ' 商品id' ,
99- ` state` int (11 ) DEFAULT ' 0' COMMENT ' 任务状态 0 待抓取 1 抓取成功 2 抓取中 -1 抓取失败' ,
100- PRIMARY KEY (` id` )
101- ) ENGINE= InnoDB DEFAULT CHARSET= utf8mb4 COLLATE= utf8mb4_0900_ai_ci;
102- ```
103-
104- 然后将这1亿个商品id录入进来,作为种子任务
105-
106- ![ -w357] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/09/16152932156268.jpg?x-oss-process=style/markdown-media )
107-
108- #### 2. 准备数据表
109-
110- ![ -w808] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/09/16152934374807.jpg?x-oss-process=style/markdown-media )
111-
112- ``` sql
113- CREATE TABLE `jd_item ` (
114- ` id` int (11 ) NOT NULL AUTO_INCREMENT,
115- ` title` varchar (255 ) DEFAULT NULL ,
116- ` batch_date` date DEFAULT NULL COMMENT ' 批次时间' ,
117- ` crawl_time` datetime DEFAULT NULL COMMENT ' 采集时间' ,
118- PRIMARY KEY (` id` )
119- ) ENGINE= InnoDB DEFAULT CHARSET= utf8mb4 COLLATE= utf8mb4_0900_ai_ci;
120- ```
121-
122- 需求是每7天全量更新一次,即数据要以7天为维度划分,因此设置个` batch_date ` 字段,表示每条数据所属的批次。
123-
124- 这里只是演示,因此只采集标题字段
125-
126- #### 3. 采集
127-
128- 若使用` scrapy ` ,需要手动将这些种子任务分批取出来发给爬虫,还需要维护种子任务的状态,以及上面提及的批次信息` batch_date ` 。并且为了保证数据的时效性,需要对采集进度进行监控,写个爬虫十分繁琐。
129-
130- 而` feapder ` 内置了批次爬虫,可以很方便的应对这个需求。完整的爬虫写法如下:
131-
132- ``` python
133- import feapder
134- from feapder import Item
135- from feapder.utils import tools
136-
137-
138- class JdSpider (feapder .BatchSpider ):
139- # 自定义数据库,若项目中有setting.py文件,此自定义可删除
140- __custom_setting__ = dict (
141- REDISDB_IP_PORTS = " localhost:6379" ,
142- REDISDB_DB = 0 ,
143- MYSQL_IP = " localhost" ,
144- MYSQL_PORT = 3306 ,
145- MYSQL_DB = " feapder" ,
146- MYSQL_USER_NAME = " feapder" ,
147- MYSQL_USER_PASS = " feapder123" ,
148- )
149-
150- def start_requests (self , task ):
151- task_id, item_id = task
152- url = " https://item.jd.com/{} .html" .format(item_id)
153- yield feapder.Request(url, task_id = task_id) # 携带task_id字段
154-
155- def parse (self , request , response ):
156- title = response.xpath(" string(//div[@class='sku-name'])" ).extract_first(default = " " ).strip()
157-
158- item = Item()
159- item.table_name = " jd_item" # 指定入库的表名
160- item.title = title
161- item.batch_date = self .batch_date # 获取批次信息,批次信息框架自己维护
162- item.crawl_time = tools.get_current_date() # 获取当前时间
163- yield item # 自动批量入库
164- yield self .update_task_batch(request.task_id, 1 ) # 更新任务状态
165-
166-
167- if __name__ == " __main__" :
168- spider = JdSpider(
169- redis_key = " feapder:jd_item" , # redis中存放任务等信息key前缀
170- task_table = " jd_item_task" , # mysql中的任务表
171- task_keys = [" id" , " item_id" ], # 需要获取任务表里的字段名,可添加多个
172- task_state = " state" , # mysql中任务状态字段
173- batch_record_table = " jd_item_batch_record" , # mysql中的批次记录表,自动生成
174- batch_name = " 京东商品爬虫(周度全量)" , # 批次名字
175- batch_interval = 7 , # 批次周期 天为单位 若为小时 可写 1 / 24
176- )
84+ ## 相关文章
17785
178- # 下面两个启动函数 相当于 master、worker。需要分开运行
179- spider.start_monitor_task() # maser: 下发及监控任务
180- # spider.start() # worker: 采集
86+ [ 使用feapder开发爬虫是一种怎样的体验
87+ ] ( https://mp.weixin.qq.com/s/WfClSbsjrn_4aPyI5hsalg )
18188
182- ```
183-
184- 我们分别运行` spider.start_monitor_task() ` 与` spider.start() ` ,待爬虫结束后,观察数据库
185-
186- ** 任务表** :` jd_item_task `
187-
188- ![ -w282] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/09/16152953028811.jpg?x-oss-process=style/markdown-media )
189-
190- 任务均已完成了,框架有任务丢失重发机制,直到所有任务均已做完
191-
192- ** 数据表** :` jd_item ` :
193-
194- ![ -w569] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/09/16152952623851.jpg?x-oss-process=style/markdown-media )
195-
196- 数据里携带了批次时间信息,我们可以根据这个时间来对数据进行划分。当前批次为3月9号,若7天一批次,则下一批次为3月18号。
197-
198- ** 批次表** :` jd_item_batch_record `
199-
200- ![ -w901] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/09/16152953428596.jpg?x-oss-process=style/markdown-media )
201-
202- 启动参数中指定,自动生成。批次表里详细记录了每个批次的抓取状态,如任务总量、已做量、失败量、是否已完成等信息
203-
204- #### 4. 监控
205-
206- feapder会自动维护任务状态,每个批次(采集周期)的进度,并且内置丰富的报警,保证我们的数据时效性,如:
207-
208- 1 . 实时计算爬虫抓取速度,估算剩余时间,在指定的抓取周期内预判是否会超时
209-
210- ![ -w657] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2020/12/20/16084718683378.jpg?x-oss-process=style/markdown-media )
211-
212-
213- 2 . 爬虫卡死报警
214-
215- ![ -w501] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2020/12/20/16084718974597.jpg?x-oss-process=style/markdown-media )
216-
217- 3 . 爬虫任务失败数过多报警,可能是由于网站模板改动或封堵导致
218-
219- ![ -w416] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2020/12/29/16092335882158.jpg?x-oss-process=style/markdown-media )
220-
221- 1 . 下载情况监控
222-
223- ![ -w1299] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/02/09/16128568548280.jpg?x-oss-process=style/markdown-media )
224-
225-
226- ## 来自使用者的评价
227-
228- ![ -w625] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/11/16154605699226.jpg?x-oss-process=style/markdown-media )
229-
230- ![ ] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/11/16154606478110.jpg?x-oss-process=style/markdown-media )
231-
232- ![ -w552] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/12/16155327974180.jpg?x-oss-process=style/markdown-media )
233-
234- ![ ] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/11/16154606955574.jpg?x-oss-process=style/markdown-media )
89+ [ 爬虫 | 如何快速的将请求头转为json格式] ( https://mp.weixin.qq.com/s/BgAGo7HwlHxL8jDL5TSuHQ )
23590
23691
23792
@@ -241,4 +96,10 @@ feapder会自动维护任务状态,每个批次(采集周期)的进度,
24196
24297![ 知识星球] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2020/02/16/zhi-shi-xing-qiu.jpeg )
24398
244- 星球会不定时分享爬虫技术干货,涉及的领域包括但不限于js逆向技巧、爬虫框架刨析、爬虫技术分享等
99+ 星球会不定时分享爬虫技术干货,涉及的领域包括但不限于js逆向技巧、爬虫框架刨析、爬虫技术分享等
100+
101+ ## 赞赏
102+
103+ 搞个** 微信** 赞赏码,不知道屏幕前的你愿不愿意请我喝杯咖啡,让我激动激动🥺
104+
105+ ![ 赞赏码] ( http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/03/16/zan-shang-ma.png )
0 commit comments