请求回调模块

This commit is contained in:
2026-06-17 16:53:25 +08:00
parent 6889d565bb
commit 9564b048a9
7 changed files with 75 additions and 19 deletions
+2 -3
View File
@@ -1,8 +1,6 @@
import time
import asyncio
import aiohttp
import requests
@@ -12,11 +10,12 @@ class Downloader:
pass
async def fetch(self,request):
await self.download(request)
return await self.download(request)
async def download(self,request):
response = requests.get(request.url)
print(response)
return response
# await asyncio.sleep(0.1)
+27 -6
View File
@@ -2,17 +2,21 @@ from typing import Optional,Generator,Callable
from baid_spider.core.downloader import Downloader
from baid_spider.core.scheduler import Scheduler
import asyncio
from baid_spider.spider import Spider
from inspect import iscoroutine
from baid_spider.utils.spider import transform
class Engine:
def __init__(self):
self.downloader :Optional[Downloader] = Downloader()
self.downloader :Optional[Downloader] = None
self.scheduler: Optional[Scheduler] = None
self.start_requests: Optional[Generator] = None
self.spider: Optional[Spider] = None
async def start_spider(self,spider):
self.spider = spider
self.scheduler = Scheduler()
if hasattr(self.scheduler,'open'):
self.scheduler.open()
@@ -42,14 +46,31 @@ class Engine:
else:
#入队
await self.enqueue_request(start_request)
async def _crawl(self,request):
# todo 实现并发
await self._fetch(request)
outputs = await self._fetch(request)
# 处理outputs
if outputs:
async for output in outputs:
print(output)
async def _fetch(self,request):
await self.downloader.fetch(request)
callback: Callable = request.callback
async def _seccess(_respones):
callback: Callable = request.callback or self.spider.parse
if _outputs := callback(_response):
if iscoroutine(_outputs):
print(iscoroutine(_outputs))
await _outputs
else:
return transform(_outputs)
return callback(_response)
_response = await self.downloader.fetch(request)
#callback: Callable = request.callback or self.spider.parse
outputs = await _seccess(_response)
return outputs
async def enqueue_request(self,request):
# 入队
+9 -9
View File
@@ -6,21 +6,21 @@
# @Email : 15726649712@163.com
from typing import Optional,Callable
from typing import Optional,Callable,Dict
class Request:
def __init__(
self, url: str, *,
headers: Optional[dict] = None,
priority: Optional[int] = None,
headers: Optional[Dict] = None,
priority: Optional[int] = 0,
timeout: Optional[int] = None,
method: Optional[str] = None,
cookies: Optional[dict] = None,
proxies: Optional[dict] = None,
proxy: Optional[dict] = None,
body: Optional[dict] = None,
json: Optional[dict] = None,
method: Optional[str] = 'GET',
cookies: Optional[Dict] = None,
proxies: Optional[Dict] = None,
proxy: Optional[Dict] = None,
body: Optional[Dict] = None,
json: Optional[Dict] = None,
callback: Optional[Callable] = None,
):
self.url = url
+4 -1
View File
@@ -13,4 +13,7 @@ class Spider:
yield Request(url=url)
else:
if hasattr(self,'start_url') and isinstance(getattr(self,'start_url'),str):
yield getattr(self,'start_url')
yield getattr(self,'start_url')
def parse(self,response):
raise NotImplementedError
+3
View File
@@ -0,0 +1,3 @@
class TransformTypeError(TypeError):
pass
+22
View File
@@ -0,0 +1,22 @@
from inspect import isasyncgen,isgenerator
from baid_spider.utils.execptions import TransformTypeError
async def transform(func_result):
if isgenerator(func_result):
try:
for r in func_result:
yield r
except Exception:
print("同步生成器迭代过程发生异常")
raise
elif isasyncgen(func_result):
try:
async for r in func_result:
yield r
except Exception:
print("异步生成器迭代过程发生异常")
raise
else:
raise TransformTypeError('callback return value must be `generator` or `async generator`')
+8
View File
@@ -1,8 +1,16 @@
from baid_spider import Request
from baid_spider.spider import Spider
class Baidu_Spider(Spider):
start_urls = ['https://www.baidu.com','https://www.baidu.com']
def parse(self,response):
print(response)
for i in range(10):
url = 'https://www.baidu.com'
response = Request(url=url)
yield response
# def start_requests(self):
#
# # response = requests.get(self.start_urls)