Backflow 是一个简洁且灵活的爬虫框架,目前处于开始测试阶段,支持使用 Celery 实现分布式采集。你可以根据自己的需求编写爬虫代码。
- 支持单机多线程爬取
- 支持分布式爬取(基于 Celery)
- 灵活的配置选项
- 易于扩展的爬虫模板
- Linux
- macOS
- Windows
- Python 3.9+
- Linux / Mac
pip install backflowCeleryConf
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 newsserver:
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中配置。
上述内容仅用于学术目的,旨在展示技术能力。一些例子来自互联网。如果任何内容侵犯了您的权利,请联系我们要求删除。