Backflow 是一个简洁且灵活的爬虫框架,目前处于开始测试阶段,支持使用 Celery 实现分布式采集。你可以根据自己的需求编写爬虫代码。
- 支持单机多线程爬取
- 支持分布式爬取(基于 Celery)
- 灵活的配置选项
- 易于扩展的爬虫模板
- Linux
- macOS
- Windows
- Python 3.9+
- Linux / Mac
pip install backflow
CeleryConf
REDIS_NAME = 'redis'
REDIS_HOST = "127.0.0.1"
REDIS_POST = 6379
REDIS_DB_BROKER = 10
REDIS_DB_RESULT = 11
REDIS_PWD = ''
Setting Parameter
START_PAGE = 1 # The default starting page number to crawl
END_PAGE = 10 # The default ending page number to crawl
PAGE_STEP = 1 # The default step size to crawl the pages
MAX_RETRIES = 3 # The maximum number of retries for each request
# END_PAGE / PAGE_STEP = TotalNumber # total number of pages to crawl
# The MAX_CONCURRENT_REQUESTS parameter needs to be greater than the TotalNumber
MAX_CONCURRENT_REQUESTS = 300 # The maximum number of concurrent requests:
# Select the enabled middleware
MIDDLEWARES = [
'UserAgentMiddleware',
'RetryMiddleware',
# 'ProxyMiddleware', # Uncomment to use
]
# 查看命令帮助
backflow --help
# 查看目前所有的回流平台的爬虫列表
backflow list
# 新建一个爬虫项目
backflow new newspider # Change newspider to your project name
# 运行单个爬虫
# If you do not include the -- page parameter afterwards, the default page is the START-PAGE END-PAGE parameter in the settings
backflow crawl baijiahao # Single run
backflow crawl jinritoutiao # Single run
# Single run The default is 20 pages. If you want to set page numbers, use the --page parameter
# For detailed parameters, please refer to the default parameter START_PAGE END_PAGE PAGE_STEP in settings.py
backflow crawl baijiahao --page 4
# 运行所有爬虫 多线程单机运行
# main_back.py # Can run all crawlers
# 启动celery worker
celery -A tasks worker --loglevel=info
# run distributed command / 分布式运行
backflow crawl baijiahao --distributed
# if you need to specify the number of pages for a distributed crawler, 100 pages, and a step size of 10
backflow crawl baijiahao --distributed --page 100 --step 10
# add new spider
backflow addspider newspider
当你使用命令
backflow addspider newspider
创建好一个新的spider模版后,请确保你的爬虫代码请求 可以正确采集到数据
from loguru import logger
from utils.tools import Tools
from Backflows.base import BackFlow
from Backflows.middleware import Request
import traceback
class {spider_name.capitalize()}(BackFlow):
name = '{spider_name}'
def __init__(self):
super().__init__()
self.ck = None
self.headers = {{
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like "
"Gecko) Chrome/108.0.0.0 Safari/537.36"
}}
async def get_page_request(self, page):
url = 'http://example.com/api/data?page={{}}'.format(page)
return Request('GET', url=url, headers=self.headers, cookies=self.ck, meta={{'page': page}})
async def parse(self, response):
resp = response.json()
datas = resp.get('data', {{}})
if not datas:
print(f'{spider_name} cookie might be expired or no data returned.')
return
for con in datas:
news = {{
'url': con.get('item_id', ''),
}}
yield news
server:
120.xx.xx.249
demo server:
host: 120.xx.xx.249
path: /opt/workstation/xx/
定时任务:
crontab/supervisor
-
启动程序: 在命令行中运行
runner.py
,并传入相应的参数,例如爬虫的名称、是否以分布式模式运行、停止页码和步长。 -
命令行解析:
argparse
库解析命令行参数,并根据参数确定运行模式。 -
查找爬虫:
SpiderRunner
类的find_spiders
方法搜索所有已定义的爬虫模块(如spiders
),并导入这些模块。它查找所有继承自BackFlow
类的爬虫,并将它们存储在一个字典中,键为爬虫的名称。 -
加载中间件&&Settings:
load_middlewares
方法根据settings.MIDDLEWARES
配置加载中间件。中间件包括用户代理、重试和代理中间件,它们用于修改请求和处理响应。 -
运行爬虫: 如果选择了分布式模式,
run
方法会为每个页面生成一个run_spider
任务,并使用Celery将其添加到任务队列中。否则,它会为每个页面创建一个异步任务,并使用asyncio.gather
等待所有任务完成。 -
执行任务: 在分布式模式下,Celery worker会从任务队列中获取任务并执行。每个任务都会调用
async_run_spider
异步函数。 -
获取页面请求:
async_run_spider
函数会创建一个Page
对象,并调用爬虫的get_page_request
方法来获取该页面的请求对象。 -
处理请求:
process_request
方法使用中间件处理请求,例如添加用户代理、设置代理等。 -
抓取页面:
fetch_page
方法使用httpx.AsyncClient
发送请求并获取响应。它使用信号量来限制并发请求数量。 -
处理响应:
process_response
方法使用中间件处理响应,例如检查响应状态码。 -
解析页面: 爬虫的
parse
方法解析响应内容,提取数据项。对于每个提取的数据项,它会调用管道的process_item
方法进行处理。 -
管道处理数据项: Pipeline的
process_item
方法将数据项存储到MongoDB或文件中。 -
统计信息: 爬虫会更新已抓取页面数和已发送请求数。在所有页面抓取完成后,
print_stats
方法会打印这些统计信息。 -
错误处理: 如果任何步骤出现错误,异常会被捕获,错误信息会被记录,并通过钉钉发送通知。
- 本项目仅供学习交流使用,未经本地测试 请不要在生产环境使用。
- 当前代码仅在 mac os 进行了测试
- 分布式运行需要启动celery worker。
- restart_celery.py 脚本用于监控并重启celery worker。需要在supervisor中配置或者 直接运行
- 爬虫代码需要在backflow/spiders目录下。
- 爬虫配置文件需要在backflow/conf目录 和 backflow/settings.py中配置。
上述内容仅用于学术目的,旨在展示技术能力。一些例子来自互联网。如果任何内容侵犯了您的权利,请联系我们要求删除。