Skip to content

Commit 2f4b551

Browse files
committed
添加校验函数
1 parent 8b04f76 commit 2f4b551

5 files changed

Lines changed: 56 additions & 13 deletions

File tree

feapder/core/base_parser.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,41 @@ def start_requests(self):
2626

2727
pass
2828

29-
def parse(self, request, response):
29+
def download_midware(self, request):
3030
"""
31-
@summary: 默认的回调函数
31+
@summary: 下载中间件 可修改请求的一些参数
32+
---------
33+
@param request:
34+
---------
35+
@result: return request / None (不会修改原来的request)
36+
"""
37+
38+
pass
39+
40+
def validate(self, request, response):
41+
"""
42+
@summary: 校验函数, 可用于校验response是否正确
43+
若函数内抛出异常,则重试请求
44+
若返回True 或 None,则进入解析函数
45+
若返回False,则抛弃当前请求
46+
可通过request.callback_name 区分不同的回调函数,编写不同的校验逻辑
3247
---------
3348
@param request:
3449
@param response:
3550
---------
36-
@result:
51+
@result: True / None / False
3752
"""
3853

3954
pass
4055

41-
def download_midware(self, request):
56+
def parse(self, request, response):
4257
"""
43-
@summary: 下载中间件 可修改请求的一些参数
58+
@summary: 默认的解析函数
4459
---------
4560
@param request:
61+
@param response:
4662
---------
47-
@result: return request / None (不会修改原来的request)
63+
@result:
4864
"""
4965

5066
pass
@@ -108,12 +124,7 @@ class BatchParser(BaseParser):
108124
"""
109125

110126
def __init__(
111-
self,
112-
task_table,
113-
batch_record_table,
114-
task_state,
115-
date_format,
116-
mysqldb=None,
127+
self, task_table, batch_record_table, task_state, date_format, mysqldb=None
117128
):
118129
self._mysqldb = mysqldb or MysqlDB() # mysqldb
119130

feapder/core/parser_control.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ def deal_requests(self, requests):
138138
else:
139139
response = None
140140

141+
# 校验
142+
if parser.validate(request, response) == False:
143+
continue
144+
141145
if request.callback: # 如果有parser的回调函数,则用回调处理
142146
callback_parser = (
143147
request.callback
@@ -473,6 +477,10 @@ def deal_requests(self, requests):
473477
else:
474478
response = None
475479

480+
# 校验
481+
if parser.validate(request, response) == False:
482+
continue
483+
476484
if request.callback: # 如果有parser的回调函数,则用回调处理
477485
callback_parser = (
478486
request.callback

feapder/network/request.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,14 @@ def to_dict(self):
223223

224224
return request_dict
225225

226+
@property
227+
def callback_name(self):
228+
return (
229+
getattr(self.callback, "__name__")
230+
if callable(self.callback)
231+
else self.callback
232+
)
233+
226234
def get_response(self, save_cached=False):
227235
"""
228236
获取带有selector功能的response

tests/air-spider/test_air_spider.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ def download_midware(self, request):
2525
# request.cookies = {}
2626
return request
2727

28+
def validate(self, request, response):
29+
if response.status_code != 200:
30+
raise Exception("response code not 200") # 重试
31+
32+
# if "哈哈" not in response.text:
33+
# return False # 或略当前请求
34+
35+
2836
def parse(self, request, response):
2937
print(response.bs4().title)
3038
print(response.xpath("//title").extract_first())

tests/spider/spiders/test_spider.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@
1313

1414
class TestSpider(feapder.Spider):
1515
def start_requests(self):
16-
yield feapder.Request("https://www.baidu.com")
16+
yield feapder.Request("https://www.baidu.com", callback=self.parse)
17+
18+
def validate(self, request, response):
19+
print(request.callback_name)
20+
if response.status_code != 200:
21+
raise Exception("response code not 200") # 重试
22+
23+
# if "哈哈" not in response.text:
24+
# return False # 或略当前请求
1725

1826
def parse(self, request, response):
1927
title = response.xpath("//title/text()").extract_first() # 取标题

0 commit comments

Comments
 (0)