目标
使用 web-tools 提供的webSpider来爬取网站内链,并且将其导出。
webSpider介绍:
官网链接:https://web-tools.cn/web-spider
仓库地址:https://github.com/duerhong/web-spider
Web Spider 专门用于爬取网站内链,可以导出成csv/json/xml等文件。可以用于给网站生成专用的sitemap。
整个爬取过程是通过多个线程同时进行爬取,速度快;爬取过程中,会将非法的内链排除,最终可以生成一个可用的内链列表。
使用webSpider爬取原因:
- 爬取快;
- 内链高可用,且可导出
- 配置简单
运行环境
python3.8 +
redis 版本不限
文件结构
config.py 配置文件,可配置redis,日志,导出数据文件路径
utils.py 核心函数库
worker.py 爬取主程序
task.py 任务相关
demo_create_task.py 创建任务demo
demo_export.py 导出数据demo
env-example env配置文件demo,请复制一份名称env的文件
requirements.txt 依赖安装
data/csv 当执行了导出csv文件后创建
data/sitemap 当执行了导出sitemap文件后创建
安装依赖扩展
pip install -r requirements.txt
配置
env文件配置
将当前env-example复制一份,新文件名称为env文件,并且做好以下配置
ROOT_PATH:./ 当前项目根路径
REDIS_HOST=127.0.0.1 redis host
REDIS_PORT=6379 redis prot
REDIS_PASSWORD= redis password
REDIS_DB=0 redis db
config.py 配置文件
如果想改动默认配置,请修改相关配置项。如果为正式环境,建议将debug设置为False。
运行
运行worker.py
worker.py 为多线程 + 轮询监听运行,可以通过config.py 文件下配置spider_thread_list来调整线程数量。
当有爬取任务进入的时候,worker.py将进入爬取状态。
python worker.py
# linux
python3 worker.py
# linux 后台守护任务方式运行
nohup python3 worker.py &
创建任务
可参考 demo_create_task.py 来创建一个爬取任务,主要代码
from task import SpiderTask
task = SpiderTask()
ret = task.createTask(
# 着陆页
landing_page="http://localhost:7071",
# 域名,多个域名可以用逗号隔开。当爬取链接的域名配置这个域名的时候,被认为是内链。
# 该方案解决部分内链写的是不规范的绝对链接。
domain="localhost",
# 基础链接,用于生成最终爬取链接,比如当爬取的内链为 /test/1 那么最终链接为 https://www.test.com/test/1
basic_page="http://localhost:7071/"
)
if ret:
print("任务ID:", ret)
为了模拟真实环境,这里我将用自己本地站点域名来测试。
运行创建任务脚本:
python demo_create_task.py
这时候可以看看woker.py 运行输出(如果是在后台,可以在log下查看相关日志)
注意:在config.py下配置了 debug 为True的情况下,日志是直接可以输出的。
导出结果
将创建任务输出的taskID记录下来:20230428085908_Gjw3
通过以下代码(可以参考demo_export.py)来导出为csv/sitemap数据
import json
from config import config
import utils
from task import SpiderTask
task = SpiderTask()
# List of task that has been crawled
taskList = task.getFinishTask()
print(json.dumps(taskList, indent=4))
# get inner link list
key = config['redis_urls_result_queue_prefix_key']
taskID = "20230428085908_Gjw3"
innerList = task.getInnerList(taskID)
print(json.dumps(innerList, indent=4))
urlList = []
for url in innerList:
urlList.append(url['standard_url'])
# export sitemap.xml
utils.saveSitemap(urlList, taskID)
# export csv file
headers = innerList[0].keys()
utils.saveCsv(headers, innerList, taskID)
注意替换 TaskID 为你的真实taskid,导出结果在 data/sitemap 和data/csv下
总结:
从整体来看,达到了我们预期的结果,整个过程配置非常简单;
如果站点是需要定时更新sitemap 用这个非常的赞;
如果涉及到统计内链,异常内链的排除也很方便。
代码整体逻辑清晰,注释也很明确,稍加改动,可以发挥更大的作用,比如爬取网页内容等。
好东西不多说,给源码仓库点个星,让更多开发者收益。