如何高效簡單的爬取網(wǎng)站內(nèi)鏈?

目標(biāo)

使用 web-tools 提供的webSpider來爬取網(wǎng)站內(nèi)鏈,并且將其導(dǎo)出。

webSpider介紹:

官網(wǎng)鏈接:https://web-tools.cn/web-spider
倉庫地址:https://github.com/duerhong/web-spider

Web Spider 專門用于爬取網(wǎng)站內(nèi)鏈,可以導(dǎo)出成csv/json/xml等文件??梢杂糜诮o網(wǎng)站生成專用的sitemap。

整個爬取過程是通過多個線程同時進行爬取,速度快;爬取過程中,會將非法的內(nèi)鏈排除,最終可以生成一個可用的內(nèi)鏈列表。

使用webSpider爬取原因:

  • 爬取快;
  • 內(nèi)鏈高可用,且可導(dǎo)出
  • 配置簡單

運行環(huán)境

python3.8 +
redis 版本不限

文件結(jié)構(gòu)

config.py                   配置文件,可配置redis,日志,導(dǎo)出數(shù)據(jù)文件路徑
utils.py                    核心函數(shù)庫
worker.py                   爬取主程序
task.py                     任務(wù)相關(guān)
demo_create_task.py         創(chuàng)建任務(wù)demo
demo_export.py              導(dǎo)出數(shù)據(jù)demo
env-example                 env配置文件demo,請復(fù)制一份名稱env的文件
requirements.txt            依賴安裝
data/csv                    當(dāng)執(zhí)行了導(dǎo)出csv文件后創(chuàng)建
data/sitemap                當(dāng)執(zhí)行了導(dǎo)出sitemap文件后創(chuàng)建

安裝依賴擴展

pip install -r requirements.txt

配置

env文件配置

將當(dāng)前env-example復(fù)制一份,新文件名稱為env文件,并且做好以下配置

ROOT_PATH:./               當(dāng)前項目根路徑
REDIS_HOST=127.0.0.1        redis host
REDIS_PORT=6379             redis prot
REDIS_PASSWORD=             redis password
REDIS_DB=0                  redis db
config.py 配置文件

如果想改動默認(rèn)配置,請修改相關(guān)配置項。如果為正式環(huán)境,建議將debug設(shè)置為False。

運行

運行worker.py

worker.py 為多線程 + 輪詢監(jiān)聽運行,可以通過config.py 文件下配置spider_thread_list來調(diào)整線程數(shù)量。
當(dāng)有爬取任務(wù)進入的時候,worker.py將進入爬取狀態(tài)。

python worker.py
# linux
python3 worker.py
# linux 后臺守護任務(wù)方式運行
nohup python3 worker.py &

創(chuàng)建任務(wù)

可參考 demo_create_task.py 來創(chuàng)建一個爬取任務(wù),主要代碼

from task import SpiderTask
task = SpiderTask()
ret = task.createTask(
    # 著陸頁
    landing_page="http://localhost:7071",
    # 域名,多個域名可以用逗號隔開。當(dāng)爬取鏈接的域名配置這個域名的時候,被認(rèn)為是內(nèi)鏈。
    # 該方案解決部分內(nèi)鏈寫的是不規(guī)范的絕對鏈接。
    domain="localhost",
    # 基礎(chǔ)鏈接,用于生成最終爬取鏈接,比如當(dāng)爬取的內(nèi)鏈為 /test/1 那么最終鏈接為 https://www.test.com/test/1
    basic_page="http://localhost:7071/"
)
if ret:
    print("任務(wù)ID:", ret)

為了模擬真實環(huán)境,這里我將用自己本地站點域名來測試。
運行創(chuàng)建任務(wù)腳本:

python demo_create_task.py
創(chuàng)建任務(wù)

這時候可以看看woker.py 運行輸出(如果是在后臺,可以在log下查看相關(guān)日志)
注意:在config.py下配置了 debug 為True的情況下,日志是直接可以輸出的。

worker.py 日志輸出

導(dǎo)出結(jié)果

將創(chuàng)建任務(wù)輸出的taskID記錄下來:20230428085908_Gjw3

通過以下代碼(可以參考demo_export.py)來導(dǎo)出為csv/sitemap數(shù)據(jù)

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,導(dǎo)出結(jié)果在 data/sitemap 和data/csv下


export_result.jpg

總結(jié):

從整體來看,達到了我們預(yù)期的結(jié)果,整個過程配置非常簡單;
如果站點是需要定時更新sitemap 用這個非常的贊;
如果涉及到統(tǒng)計內(nèi)鏈,異常內(nèi)鏈的排除也很方便。
代碼整體邏輯清晰,注釋也很明確,稍加改動,可以發(fā)揮更大的作用,比如爬取網(wǎng)頁內(nèi)容等。

好東西不多說,給源碼倉庫點個星,讓更多開發(fā)者收益。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容