如何高效简单的爬取网站内链?

目标

使用 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的情况下,日志是直接可以输出的。

worker.py 日志输出

导出结果

将创建任务输出的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下


export_result.jpg

总结:

从整体来看,达到了我们预期的结果,整个过程配置非常简单;
如果站点是需要定时更新sitemap 用这个非常的赞;
如果涉及到统计内链,异常内链的排除也很方便。
代码整体逻辑清晰,注释也很明确,稍加改动,可以发挥更大的作用,比如爬取网页内容等。

好东西不多说,给源码仓库点个星,让更多开发者收益。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容