Skip to content

Downloader

Downloader是下载器,用于网络请求 下载器已实现的有aiohttp、requests和httpx, 默认使用aiohttp

  1. 可以在spider设置
from hoopa.settings import const
# downloader_cls = const.AiohttpDownloader
# 设置为httpx
# downloader_cls = const.HttpxDownloader
downloader_cls = const.RequestsDownloader
  1. 配置文件里面设置
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"