Skip to content

Commit be9b03e

Browse files
author
Boris
committed
完成 request response文档
1 parent 717895e commit be9b03e

11 files changed

Lines changed: 587 additions & 22 deletions

File tree

docs/_sidebar.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,20 @@
1515
* [爬虫集成](usage/爬虫集成.md)
1616

1717
* 使用进阶
18-
* [Request](source_code/Request.md)
19-
* [Response](source_code/Response.md)
20-
* [BaseParser](source_code/BaseParser.md)
21-
* [BatchParser](source_code/BatchParser.md)
22-
* [配置文件](source_code/配置文件.md)
23-
* [MysqlDB](source_code/MysqlDB.md)
24-
* [RedisDB](source_code/RedisDB.md)
18+
* [请求-Request](source_code/Request.md)
19+
* [响应-Response](source_code/Response.md)
20+
* [解析器-BaseParser](source_code/BaseParser.md)
21+
* [批次解析器-BatchParser](source_code/BatchParser.md)
2522
* [Spider进阶](source_code/Spider进阶.md)
2623
* [BatchSpider进阶](source_code/BatchSpider进阶.md)
2724
* [Item](source_code/Item.md)
25+
* [UpdateItem](source_code/UpdateItem.md)
2826
* [ItemBuffer](source_code/ItemBuffer.md)
29-
* [tools](source_code/tools.md)
27+
* [配置文件](source_code/配置文件.md)
28+
* [MysqlDB](source_code/MysqlDB.md)
29+
* [RedisDB](source_code/RedisDB.md)
30+
* [工具库-tools](source_code/tools.md)
31+
* [海量数据去重-dedup](source_code/dedup.md)
3032

3133
* 常见问题
3234
* [安装问题](question/安装问题.md)

docs/source_code/BaseParser.md

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,110 @@
11

22
# BaseParser
33

4-
未完待续
4+
BaseParser为Spider的基类,用来定义任务下发与数据解析,是面向用户提供的接口
5+
6+
## 源码
7+
8+
9+
```python
10+
class BaseParser(object):
11+
def start_requests(self):
12+
"""
13+
@summary: 添加初始url
14+
---------
15+
---------
16+
@result: yield Request()
17+
"""
18+
19+
pass
20+
21+
def parse(self, request, response):
22+
"""
23+
@summary: 默认的回调函数
24+
---------
25+
@param request:
26+
@param response:
27+
---------
28+
@result:
29+
"""
30+
31+
pass
32+
33+
def download_midware(self, request):
34+
"""
35+
@summary: 下载中间件 可修改请求的一些参数
36+
---------
37+
@param request:
38+
---------
39+
@result: return request / None (不会修改原来的request)
40+
"""
41+
42+
pass
43+
44+
def exception_request(self, request, response):
45+
"""
46+
@summary: 请求或者parser里解析出异常的request
47+
---------
48+
@param request:
49+
@param response:
50+
---------
51+
@result: request / callback / None (返回值必须可迭代)
52+
"""
53+
54+
pass
55+
56+
def failed_request(self, request, response):
57+
"""
58+
@summary: 超过最大重试次数的request
59+
可返回修改后的request 若不返回request,则将传进来的request直接人redis的failed表。否则将修改后的request入failed表
60+
---------
61+
@param request:
62+
---------
63+
@result: request / item / callback / None (返回值必须可迭代)
64+
"""
65+
66+
pass
67+
68+
def start_callback(self):
69+
"""
70+
@summary: 程序开始的回调
71+
---------
72+
---------
73+
@result: None
74+
"""
75+
76+
pass
77+
78+
def end_callback(self):
79+
"""
80+
@summary: 程序结束的回调
81+
---------
82+
---------
83+
@result: None
84+
"""
85+
86+
pass
87+
88+
@property
89+
def name(self):
90+
return self.__class__.__name__
91+
92+
def close(self):
93+
pass
94+
```
95+
96+
## 使用
97+
98+
以程序开始结束回调举例:
99+
100+
```python
101+
import feapder
102+
103+
104+
class TestSpider(feapder.Spider):
105+
def start_callback(self):
106+
print("爬虫开始了")
107+
108+
def end_callback(self):
109+
print("爬虫结束了")
110+
```

docs/source_code/BatchParser.md

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,121 @@
11
# BatchParser
22

3-
未完待续
3+
BaseParser为BatchSpider的基类,用来定义任务下发与数据解析,是面向用户提供的接口
4+
5+
除了提供[BaseParser](source_code/BaseParser)所有接口外,还提供以下方法
6+
7+
## 方法详解
8+
9+
### 1. 添加任务 add_task
10+
11+
add_task, 每次执行start_monitor都会调用,且在init_task之前调用, 用于在批次爬虫启动前添加任务到数据库
12+
13+
```
14+
class TestSpider(feapder.BatchSpider):
15+
def add_task(self):
16+
pass
17+
```
18+
19+
### 2. 更新任务
20+
21+
#### 方法一:
22+
23+
一条条更新
24+
25+
```python
26+
def update_task_state(self, task_id, state=1, **kwargs):
27+
"""
28+
@summary: 更新任务表中任务状态,做完每个任务时代码逻辑中要主动调用
29+
调用方法为 yield lambda : self.update_task_state(task_id, state)
30+
---------
31+
@param task_id: 任务id
32+
@param state: 任务状态
33+
---------
34+
@result:
35+
"""
36+
```
37+
38+
举例说明
39+
40+
```
41+
def parse(self, request, response):
42+
yield item # 返回item, item会自动批量入库
43+
yield lambda : self.update_task_state(request.task_id, 1)
44+
```
45+
46+
`yield item`后,调用`self.update_task_state`函数实现任务状态更新。
47+
48+
这里为什么使用`yield lambda`方式呢?因为`yield item`后,item不会马上入库,会存在一个buffer中,批量入库,如果我们直接调用`self.update_task_state`更新任务状态,可能这时item还并未入库,如果此时程序意外退出,那么缓存中的这一部分item数据将会丢失,但是此时任务状态已更新,任务不会重做,这便会导致这个任务所对应的数据丢失
49+
50+
`yield lambda`返回的是一个回调函数,这个函数并不会马上执行,系统会保证item入库后再执行,因此这么写的用意在于item入库后再更新任务状态
51+
52+
#### 方法二:
53+
54+
批量更新
55+
56+
```python
57+
def update_task_batch(self, task_id, state=1, **kwargs):
58+
"""
59+
批量更新任务 多处调用,更新的字段必须一致
60+
注意:需要 写成 yield update_task_batch(...) 否则不会更新
61+
@param task_id:
62+
@param state:
63+
@param kwargs:
64+
@return:
65+
"""
66+
```
67+
68+
举例说明
69+
70+
```python
71+
def parse(self, request, response):
72+
yield item # 返回item, item会自动批量入库
73+
yield self.update_task_batch(request.task_id, 1) # 更新任务状态为1
74+
```
75+
76+
`yield item`后调用`self.update_task_batch`实现批量更新
77+
78+
注意,批量更新必须使用 `yield`, 因为`update_task_batch`函数并未实现更新逻辑,只是返回了`UpdateItem``UpdateItem``Item`类似,只不过带有更新功能,框架会在Item入库后在调用`UpdateItem`实现批量更新。关于`UpdateItem`详解,请参考[UpdateItem]()
79+
80+
#### 两种方式选取
81+
82+
同一张表,若更新字段相同,推荐使用批量更新的方式,效率更高,若字段不同,用一条条更新的方式。因为批量更新,这一批的更新字段必须一致
83+
84+
比如当请求失败时,将任务更新为-1,同时标记失败原因,成功时将任务更新为1,写法如下:
85+
86+
```python
87+
def parse(self, request, response):
88+
yield self.update_task_batch(request.task_id, 1) # 更新任务状态为1
89+
90+
def failed_request(self, request, response):
91+
"""
92+
@summary: 超过最大重试次数的request
93+
---------
94+
@param request:
95+
---------
96+
@result: request / item / callback / None (返回值必须可迭代)
97+
"""
98+
99+
yield request
100+
yield lambda : self.update_task_state(request.task_id, -1, remark="失败原因") # 更新任务状态为-1
101+
```
102+
103+
因任务失败时多更新了个remark字段,与任务成功时只更新state字段不同,因此需要将此更新操作单独拆出来,用`update_task_state`方式更新
104+
105+
### 3. 获取批次时间
106+
107+
示例:
108+
109+
def parse(self, request, response):
110+
item = SpiderDataItem() # 声明一个item
111+
item.batch_data = self.batch_date
112+
item.title = title # 给item属性赋值
113+
yield item # 返回item, item会自动批量入库
114+
115+
使用`self.batch_date`可获取当前批次时间,然后拼接到item入库
116+
117+
数据示例
118+
119+
| id | title | batch_date |
120+
| --- | --- | --- |
121+
| 1 | 百度一下 | 2021-01-01 |

0 commit comments

Comments
 (0)