Downloader
Downloader是下载器,用于网络请求 下载器已实现的有aiohttp、requests和httpx, 默认使用aiohttp
- 可以在spider设置
from hoopa.settings import const
# downloader_cls = const.AiohttpDownloader
# 设置为httpx
# downloader_cls = const.HttpxDownloader
downloader_cls = const.RequestsDownloader
- 配置文件里面设置
from hoopa.settings import const
DOWNLOADER_CLS = const.HttpxDownloader
const.HttpxDownloader和const.AiohttpDownloader只是常量, "hoopa.downloader.HttpxDownloader"和"hoopa.downloader.AiohttpDownloader",填写这两个也是可以的
主要方法:
- fetch: 请求网页资源
- async_fetch: 请求网页资源, 异步
主要参数
- request: Request对象,具体看Request的文档
返回
- response:Response对象,具体看Response的文档
session说明
下载器默认使用全局session 如果有指定session,请设置参数Request.session 如果请求想单独创建session,请设置参数Request.client_kwargs
使用
框架里面的下载器是可以调用的,例如在parse调用:
同步
def parse(self, request, response):
resp = self.downloader.fetch((hoopa.Request(url="https://httpbin.org/get")))
print(resp.text)
异步
async def parse(self, request, response):
resp = await self.downloader.async_fetch((hoopa.Request(url="https://httpbin.org/get")))
print(resp.text)
在中间件使用:
# 同步
class DemoMiddleware:
def process_request(self, request, spider_ins):
resp = spider_ins.downloader.fetch((hoopa.Request(url="https://httpbin.org/get")))
# 异步
class DemoMiddleware:
async def process_request(self, request, spider_ins):
resp = await spider_ins.downloader.fetch((hoopa.Request(url="https://httpbin.org/get")))
另外,想要在解析函数或者中间件直接使用requets,time.sleep等也是可以的,不会阻塞
拓展
默认支持aiohttp和httpx,可是自己继承Downloader来实现自定义下载器,例如pyppeteer, playwright等 只需要在配置文件里面修改'DOWNLOADER_CLS'或者在spider里面设置,例如:
DOWNLOADER_CLS = "hoopa.downloader.AiohttpDownloader"