Skip to main content

基于asyncio异步爬虫网络框架,仿scrapy

Project description

fspider

介绍

fspider是一款基于python原生协程asyncio的异步网络爬虫框架,仿照scrapy

要求

python>=3.7

安装

1.pip install fspider

2.或者点击下载 然后执行python setup.py install

教程

创建项目

fspdier startproject 命令有两个参数-项目名称和项目路径 fspdier startproject testspider . 在当前目录创建testspider项目

cd testspider
python main.py

执行默认的测试用例

command

在命令行窗口使用fspider -h 查看支持的命令及参数

  • fspdier startproject -h
  • fspdier shell -h

上下文变量

from fspider import context
context.spider.get()

目前支持spider对象的获取,这样就不必将spider一直作为参数来传递。 注意:必须在spider初始化之后,即无法在spider init 里面调用

signals

  • spdier_opened
  • spider_closed

使用方法: spider 默认绑定了这两个signal 你可以覆盖这两个方法

async def spider_opened(self):
    self.logger.info('spider_opened!!!!!!!!!!!')


async def spider_closed(self):
    self.logger.info('spider_closed ')
    pass

在其他地方使用(sender参数默认使用context.spider.get())

from fspider import signals


async def spider_opened():
    pass


signals.connect(receiver=spider_opened, signal=signals.spider_opened)

spider middreware

spider middreware 是用来处理spider结果的组件 一个简单的spider middreware 如下所示:

from fspider.http.response import Response
from fspider.spidermiddlewares import SpiderMiddleware
from fspider.utils.type import SpiderRequest


class TestSpiderMiddleware(SpiderMiddleware):
    async def process_start_requests(self, result: SpiderRequest) -> SpiderRequest:
        async for r in result:
            print('process_start_requests', r)
            yield r

    async def process_spider_output(self, response: Response, result: SpiderRequest) -> SpiderRequest:
        async for i in result:
            print('process_spider_output', i)
            yield i

之后你需要在setting中配置启用:

SPIDER_MIDDLEWARES = {
    'test.middlewares.TestSpiderMiddleware': 543,
}

downloader middreware

downloader middreware 是用来处理request请求,最终得到response的一系列组件, 一个简单的downloader middreware 如下所示

from typing import Union
from fspider.downloadermiddlewares import DownloaderMiddleware
from fspider.http.request import Request
from fspider.http.response import Response


class TestDownloaderMiddleware(DownloaderMiddleware):
    async def process_request(self, request: Request) -> Union[Request, Response, None]:
        print('process_request', request)
        return None

    async def process_response(self, request: Request, response: Response) -> Union[Request, Response]:
        print('process_response', response)
        return response

之后你需要在setting中配置启用:

DOWNLOADER_MIDDLEWARES = {
    'test.middlewares.TestDownloaderMiddleware': 543,
}

DOWNLOADER_MIDDLEWARES 会先顺序执行各个middlewares的process_request方法,之后倒叙执行process_response

内置 downloader middreware

RobotsTxtMiddleware
DownloadTimeoutMiddleware
DefaultHeadersMiddleware
DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh-HK;q=0.9,zh;q=0.8,en;q=0.7,la;q=0.6,ja;q=0.5',
    'accept-encoding': 'gzip, deflate, br',
}
HttpCompressionMiddleware

aiohttp 会根据response 自动解压数据,所以不需要实现该中间件 (默认DEFAULT_REQUEST_HEADERS 'accept-encoding': 'gzip, deflate, br',接受压缩数据,不需要的话可以删除accept-encoding)

UserAgentMiddleware
CookiesMiddleware
DefaultDownloaderMiddleware

Item Pipeline

当spider 抓取了item,将会移交到 item pipeline ,按照顺序执行相应的组件 一个自定义的pipeline 如下所示:

import logging
import typing
from fspider.pipelines import Pipeline
from fspider.utils.type import Item


class FspidertestPipeline(Pipeline):
    async def process_item(self, item: Item) -> typing.Optional[Item]:
        logging.info(item)
        return item
  • 你必须实现process_item方法

    • 每个pipeline都会执行此方法来处理
    • return item 将会继续执行后续pipeline ,return None将会停止执行后续pipiline
  • 然后需要在setting 配置启用:

ITEM_PIPELINES = {
    'fspidertest.pipelines.FspidertestPipeline': 300,
}
MediaPipeline

这是一个用来并发处理image、video等文件的pipeline,并提供了并发控制、大小限制、下载时间估算、超时等功能 默认配置参数

  • meida_key:#item[meida_key] 是将要下载的url列表 默认值:media_urls
  • CONN_LIMIT:最大并发 默认值:5
  • LIMIT_PER_HOST:单个域名最大并发 默认值:2
  • file_dir:保存目录 默认当前目录
  • size_limit: 最大文件限制 默认:1024 * 1024 * 1024 # 1GB
  • time_limit:最大时长 默认:10 * 60 # 10分钟

item_completed 方法:

params :

results: typing.Union[str, Exception] 返回文件保存路径或者exception
item

return item or None

example:

import logging
import typing
from fspider.pipelines.files import MediaPipeline
from fspider.utils.type import Item


class FspidertestPipeline(MediaPipeline):
    meida_key = 'images'
    LIMIT_PER_HOST = 2

    # async def process_item(self, item: Item) -> typing.Optional[Item]:
    #     item = await super().process_item(item)
    #     logging.info(item)
    #     return item

    async def item_completed(self, results: typing.Union[str, Exception], item: Item) -> Item:
        item['media_path'] = [r for r in results if not isinstance(r, Exception)]
        return item

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fspider-1.1.0.tar.gz (29.4 kB view details)

Uploaded Source

File details

Details for the file fspider-1.1.0.tar.gz.

File metadata

  • Download URL: fspider-1.1.0.tar.gz
  • Upload date:
  • Size: 29.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.8.11

File hashes

Hashes for fspider-1.1.0.tar.gz
Algorithm Hash digest
SHA256 d9360256802d3f161141008771d18edb44b351487d417c4177ef90a91aac8cfe
MD5 0bdb976e5db61d2dd05d1cef339955cc
BLAKE2b-256 5bedc7c65a64c304e97f14d4ca933e408768840fca65cfad21bd8832ea3ec3c4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page