scrapy 扩展库:用于扩展 Scrapy 功能来解放双手,还内置一些爬虫开发中的通用方法。
Project description
AyugeSpiderTools 工具说明
一句话介绍:用于扩展
Scrapy
功能来解放双手,还内置一些爬虫开发中的通用方法。
前言
在使用 Python
Scrapy
库开发爬虫时,免不了会重复的修改和编写 settings.py
,middlewares.py
,pipelines.py
,item.py
和一些通用方法或脚本,但其实各个项目中的这些文件内容大致相同,那为何不把他们统一整理在一起呢。虽说可以使用 scrapy
的模板功能,但还是无法适配所有的开发场景。
刚开始我也只是想把它用来适配 Mysql
存储的场景,可以自动创建相关数据库,数据表,字段注释,自动添加新添加的字段,和自动修复常见(字段编码,Data too long
,存储字段不存在等等)的存储问题。后来不断优化和添加各种场景,使得爬虫开发在通用场景下几乎只用在意 spider
脚本的解析规则和 VIT
下的 .conf
配置即可,脱离无意义的重复操作。
至于此库做了哪些功能,只要你熟悉 python
语法和 scrapy
库,再结合 DemoSpider 中的应用示例,你可以很快上手。具体的内容和注意事项也可以在 AyugeSpiderTools readthedocs 文档 中查看。
1. 前提条件
python 3.8+
可以直接输入以下命令:
pip install ayugespidertools -i https://pypi.org/simple
注:本库依赖中的 pymongo
版本要在 ^3.12.3
(即3.13.0
及以下) 是因为我的 mongoDB
的版本为 3.4
,pymogo
官方从 3.13.0
以后的版本开始不再支持 3.4
版本以下的 MongoDB
数据库了,望周知!你也可以根据 3.3 自定义库
2. 使用方法
项目主要包含两部分:
- 开发场景中的工具库
- 比如
MongoDB
,Mysql sql
语句的生成,图像处理,数据处理相关 ... ...
- 比如
Scrapy
扩展功能(主推功能 — 解放双手)- 使爬虫开发无须在意数据库和数据表结构,不用去管常规
item, pipelines
和middlewares
的文件的编写。内置通用的middlewares
中间件方法(随机请求头,动态/独享代理等),和常用的pipelines
方法(Mysql
,MongoDB
存储,Kafka
,RabbitMQ
推送队列等)。
- 使爬虫开发无须在意数据库和数据表结构,不用去管常规
2.1. Scrapy 扩展库场景
开发人员只需根据命令生成示例模板,再配置并激活相关设置即可,可以专注于爬虫
spider
的开发。
使用方法示例 GIF
如下:
对以上 GIF
中的步骤进行解释:
# 注:更推荐使用 ayuge 的 cli 名称,输入体验更友好,(ayugespidertools 的 cli 则会在下一大版本中会剔除)。
# 查看库版本
ayuge version
# 创建项目
ayuge startproject <project_name>
# 进入项目根目录
cd <project_name>
# 生成爬虫脚本
ayuge genspider <spider_name> <example.com>
# 替换(覆盖)为真实的配置 .conf 文件;
# 这里是为了演示方便,正常情况是直接在 VIT 路径下的 .conf 配置文件填上相关配置即可
cp /root/mytemp/.conf DemoSpider/VIT/.conf
# 运行脚本
scrapy crawl <spider_name>
具体使用方法请在 DemoSpider 之 AyugeSpiderTools 工具应用示例 项目中查看,目前已适配以下场景:
# 采集数据存入 `Mysql` 的场景:
- 1).demo_one: 配置根据本地 `settings` 的 `LOCAL_MYSQL_CONFIG` 中取值
+ 3).demo_three: 配置根据 `consul` 的应用管理中心中取值
+ 5).demo_five: 异步存入 `Mysql` 的场景
# 采集数据存入 `MongoDB` 的场景:
- 2).demo_two: 采集数据存入 `MongoDB` 的场景(配置根据本地 `settings` 的 `LOCAL_MONGODB_CONFIG` 中取值)
+ 4).demo_four: 采集数据存入 `MongoDB` 的场景(配置根据 `consul` 的应用管理中心中取值)
+ 6).demo_six: 异步存入 `MongoDB` 的场景
# 将 `Scrapy` 的 `Request`,`FormRequest` 替换为其它工具实现的场景
- 以上为使用 scrapy Request 的场景
+ 7).demo_seven: scrapy Request 替换为 requests 请求的场景(一般情况下不推荐使用,同步库
+ 会拖慢 scrapy 速度,可用于测试场景)
+ 8).demo_eight: 同时存入 Mysql 和 MongoDB 的场景
- 9).demo_aiohttp_example: scrapy Request 替换为 aiohttp 请求的场景,提供了各种请求场景示例(GET,POST)
+ 10).demo_aiohttp_test: scrapy aiohttp 在具体项目中的使用方法示例
+ 11).demo_proxy_one: 快代理动态隧道代理示例
+ 12).demo_proxy_two: 测试快代理独享代理
+13).demo_AyuTurboMysqlPipeline: mysql 同步连接池的示例
+14).demo_crawl: 支持 scrapy CrawlSpider 的示例
# 本库中给出支持 Item Loaders 特性的示例(文档地址:https://ayugespidertools.readthedocs.io/en/latest/topics/loaders.html)
+15).demo_item_loader: 本库 ScrapyClassicItem 及原生 scrapy item 动态添加 item 字段及支持 Item Loaders 的示例
+16).demo_item_loader_two: 展示本库使用 itemLoader 特性的示例
注:具体内容及时效性请以 DemoSpider 项目中描述为准。
2.2. 开发场景
这里不再一一列举所有功能,大概介绍下包含的大致功能。
- 数据处理相关: 比如一些字符串处理,
url
拼接处理。 - 常用加解密、编码:
rsa
,mm3
等,其实更推荐 chepy 库 - 你能用 icyberchef 测试跑通的加解密都可以用此库更方便地实现,两三行代码即可搞定。 - sql 语句拼接: 只能做到最简单的逻辑,如果需要灵活或稍复杂的情况,请参考
directsql
,python-sql
,pypika
或pymilk
等其它第三方类似功能库的实现方法。 - 滑块图片缺口位置识别及轨迹生成
注:
滑块缺口识别示例,双缺口也可正常识别。
识别结果展示 | 备注 |
---|---|
无 | |
可以展示只识别滑块小方块的结果,得到更精准的坐标数据。 |
3. 补充
在使用过程中若遇到各种问题,或有任何优化建议欢迎提 Issues !
3.1. 跑通测试示例
前提:需要在 tests
的 VIT
目录下创建 .conf
文件,已给出示例文件,请填写测试所需内容,然后:
-
可以直接使用
tox
来运行测试。 -
本库以 poetry 开发,那么直接新环境下运行
poetry install
后,手动运行目标测试或pytest
命令来测试等皆可。 -
也可以使用
make
工具,make start
然后make test
即可。
测试完毕后 make clean
清理文件。
3.2. 你可能在意的事
此项目会慢慢丰富
python
开发中的遇到的通用方法,详情请见 TodoList。
- 若你觉得某些场景下的功能实现不太符合你的预期,想要修改或添加自定义功能,或移除对你无用模块、修改库名等,你可以自行修改后
build
。 - 本库主推
scrapy
扩展(即增强版的自定义模板)的功能,在使用本库时,理论上并不会影响你scrapy
项目及其它组件,且你也可以根据上条须知来增强此库功能。因为模板功能天生就有及其明确的优缺点,我无法覆盖所有应用场景,但是它的高效率的确会解放双手。 - 当然,你也可以选择给此项目做出贡献,比如增加或优化某些功能等,但在此之前请提相关的
ISSUES
经确认后再开发和提交PULL REQUESTS
,以免不太符合本库场景或已废弃等原因造成你的贡献浪费,那就太可惜了!
3.3. Build-Your-Own-Library
具体内容请以 poetry 官方文档 为准。
据 3.2 可知,你可以 clone
源码后,修改任意方法(比如你的项目场景下可能需要其它的日志配置默认值,或添加其它的项目结构模板等),修改完成后 poetry build
或 make build
即可打包使用。
比如你可能需要更新依赖库中 pymongo
为新版本 x.x.x
,那只需 poetry install
安装现有依赖后,再 poetry add pymongo@x.x.x
安装目标版本(尽量不要使用 poetry update pymongo
),确定测试正常了即可 poetry build
打包使用。
TodoList
-
scrapy
的扩展功能场景-
scrapy
脚本运行信息统计和项目依赖表采集量统计,可用于日志记录和预警 - 自定义模板,在
ayugespidertools startproject <projname>
和ayugespidertools genspider <spidername>
时生成适合本库的模板文件 -
增加根据-> 改为增加根据nacos
来获取配置的功能consul
来获取配置的功能 - 代理中间件(独享代理、动态隧道代理)
- 随机请求头
UA
中间件,根据fake_useragent
中的权重来随机 - 使用以下工具来替换
scrapy
的Request
来发送请求-
requests
: 这个不推荐使用,requests
同步库会降低scrapy
运行效率 -
aiohttp
: 集成将scrapy Request
替换为aiohttp
的协程方式
-
-
Mysql
存储的场景下适配- 自动创建
Mysql
用户场景下需要的数据库和数据表及字段格式,还有字段注释
- 自动创建
-
MongoDB
存储的场景下适配,编写风格与Mysql
存储等场景下一致 -
asyncio
语法支持与async
第三方库支持示例-
spider
中使用asyncio
的aiohttp
示例 -
pipeline
中使用asyncio
的aioMysql
示例
-
- 集成
Kafka
,RabbitMQ
等数据推送功能
-
- 常用开发场景
-
sql
语句拼接,只是简单场景,后续优化。已给出优化方向,参考库等信息。 -
mongoDB
语句拼接 - 数据格式化处理,比如:去除网页标签,去除无效空格等
- 字体反爬还原方法
- 基于
ttf
,woff
之类的字体文件映射,或结合css
等实现- 可以直接在字体文件
xml
中找到映射关系的:使用 fontforge 工具导出映射即可。 - 无法找到映射关系的,则一般使用
ocr
识别(准确率非百分百),通过fontforge
导出每个映射的png
,后再通过各种方式识别。
- 可以直接在字体文件
- 基于
-
html
格式转markdown
格式 -
html
数据处理,去除标签,不可见字符,特殊字符改成正常显示等等等 - 添加常用的图片验证码中的处理方法
- 滑块缺口距离的识别方法(多种实现方式)
- 根据滑块距离生成轨迹数组的方法
- 识别点选验证码位置及点击顺序,识别结果不太好,待优化
- 图片乱序混淆的还原方法示例
-
注:
- 由于
scrapy
扩展库的开源项目众多,在使用本库的基础上扩展它们,与使用scrapy
时扩展它们的用法一致,所以不再开发一些其它工具已经拥有且稳定的功能,但也会尽量开发一些常用且通用的方法来提升效率。 - 字体反爬部分不会给出详细解决示例,不管是使用
fontforge
,fontTools
或ocr
等工具,已经脱离本库的范围了,我会给出部分依赖的方法,但不会添加以上工具库的依赖了,而导致本库依赖过于杂糅。而且,若要实现高可用的字体映射也比较简单,请自行实现,可能会考虑新开pypi
库来实现此部分。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for ayugespidertools-2.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 110863e5f471fb833730c2124e78ef27b94e92ba6b72b667d6d71e4d08b5bbd7 |
|
MD5 | 6bcee28e85e413d105d6146fdf211ac9 |
|
BLAKE2b-256 | 9c752cef45c5dfe3717dc29f39aa094a93b7c714d71837ae13336c0897f328b4 |