请求回调模块
This commit is contained in:
@@ -1,8 +1,6 @@
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
import aiohttp
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
|
||||||
@@ -12,11 +10,12 @@ class Downloader:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def fetch(self,request):
|
async def fetch(self,request):
|
||||||
await self.download(request)
|
return await self.download(request)
|
||||||
|
|
||||||
|
|
||||||
async def download(self,request):
|
async def download(self,request):
|
||||||
response = requests.get(request.url)
|
response = requests.get(request.url)
|
||||||
|
print(response)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
# await asyncio.sleep(0.1)
|
# await asyncio.sleep(0.1)
|
||||||
|
|||||||
@@ -2,17 +2,21 @@ from typing import Optional,Generator,Callable
|
|||||||
from baid_spider.core.downloader import Downloader
|
from baid_spider.core.downloader import Downloader
|
||||||
from baid_spider.core.scheduler import Scheduler
|
from baid_spider.core.scheduler import Scheduler
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from baid_spider.spider import Spider
|
||||||
|
from inspect import iscoroutine
|
||||||
|
from baid_spider.utils.spider import transform
|
||||||
|
|
||||||
|
|
||||||
class Engine:
|
class Engine:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.downloader :Optional[Downloader] = Downloader()
|
self.downloader :Optional[Downloader] = None
|
||||||
self.scheduler: Optional[Scheduler] = None
|
self.scheduler: Optional[Scheduler] = None
|
||||||
self.start_requests: Optional[Generator] = None
|
self.start_requests: Optional[Generator] = None
|
||||||
|
self.spider: Optional[Spider] = None
|
||||||
|
|
||||||
async def start_spider(self,spider):
|
async def start_spider(self,spider):
|
||||||
|
self.spider = spider
|
||||||
self.scheduler = Scheduler()
|
self.scheduler = Scheduler()
|
||||||
if hasattr(self.scheduler,'open'):
|
if hasattr(self.scheduler,'open'):
|
||||||
self.scheduler.open()
|
self.scheduler.open()
|
||||||
@@ -42,14 +46,31 @@ class Engine:
|
|||||||
else:
|
else:
|
||||||
#入队
|
#入队
|
||||||
await self.enqueue_request(start_request)
|
await self.enqueue_request(start_request)
|
||||||
|
|
||||||
async def _crawl(self,request):
|
async def _crawl(self,request):
|
||||||
# todo 实现并发
|
# 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):
|
async def _fetch(self,request):
|
||||||
await self.downloader.fetch(request)
|
async def _seccess(_respones):
|
||||||
callback: Callable = request.callback
|
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):
|
async def enqueue_request(self,request):
|
||||||
# 入队
|
# 入队
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
# @Email : 15726649712@163.com
|
# @Email : 15726649712@163.com
|
||||||
|
|
||||||
|
|
||||||
from typing import Optional,Callable
|
from typing import Optional,Callable,Dict
|
||||||
|
|
||||||
|
|
||||||
class Request:
|
class Request:
|
||||||
def __init__(
|
def __init__(
|
||||||
self, url: str, *,
|
self, url: str, *,
|
||||||
headers: Optional[dict] = None,
|
headers: Optional[Dict] = None,
|
||||||
priority: Optional[int] = None,
|
priority: Optional[int] = 0,
|
||||||
timeout: Optional[int] = None,
|
timeout: Optional[int] = None,
|
||||||
method: Optional[str] = None,
|
method: Optional[str] = 'GET',
|
||||||
cookies: Optional[dict] = None,
|
cookies: Optional[Dict] = None,
|
||||||
proxies: Optional[dict] = None,
|
proxies: Optional[Dict] = None,
|
||||||
proxy: Optional[dict] = None,
|
proxy: Optional[Dict] = None,
|
||||||
body: Optional[dict] = None,
|
body: Optional[Dict] = None,
|
||||||
json: Optional[dict] = None,
|
json: Optional[Dict] = None,
|
||||||
callback: Optional[Callable] = None,
|
callback: Optional[Callable] = None,
|
||||||
):
|
):
|
||||||
self.url = url
|
self.url = url
|
||||||
|
|||||||
@@ -13,4 +13,7 @@ class Spider:
|
|||||||
yield Request(url=url)
|
yield Request(url=url)
|
||||||
else:
|
else:
|
||||||
if hasattr(self,'start_url') and isinstance(getattr(self,'start_url'),str):
|
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
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
class TransformTypeError(TypeError):
|
||||||
|
pass
|
||||||
@@ -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`')
|
||||||
@@ -1,8 +1,16 @@
|
|||||||
|
from baid_spider import Request
|
||||||
from baid_spider.spider import Spider
|
from baid_spider.spider import Spider
|
||||||
class Baidu_Spider(Spider):
|
class Baidu_Spider(Spider):
|
||||||
|
|
||||||
start_urls = ['https://www.baidu.com','https://www.baidu.com']
|
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):
|
# def start_requests(self):
|
||||||
#
|
#
|
||||||
# # response = requests.get(self.start_urls)
|
# # response = requests.get(self.start_urls)
|
||||||
|
|||||||
Reference in New Issue
Block a user