使用playwright爬取魔筆小說網站並下載輕小說資源

来源:https://www.cnblogs.com/xwjz/archive/2023/10/09/17752999.html
-Advertisement-
Play Games

一、安裝python 官網 下載python3.9及以上版本 二、安裝playwright playwright是微軟公司2020年初發佈的新一代自動化測試工具,相較於目前最常用的Selenium,它僅用一個API即可自動執行Chromium、Firefox、WebKit等主流瀏覽器自動化操作。 ( ...


一、安裝python

官網

下載python3.9及以上版本

二、安裝playwright

playwright是微軟公司2020年初發佈的新一代自動化測試工具,相較於目前最常用的Selenium,它僅用一個API即可自動執行Chromium、Firefox、WebKit等主流瀏覽器自動化操作。

(1)安裝Playwright依賴庫

1 pip install playwright

 

(2)安裝Chromium、Firefox、WebKit等瀏覽器的驅動文件(內置瀏覽器)

1 python -m playwright install

三、分析網站的HTML結構

魔筆小說網是一個輕小說下載網站,提供了mobi、epub等格式小說資源,美中不足的是,需要跳轉城通網盤下載,無會員情況下被限速且同一時間只允許一個下載任務。

當使用chrome瀏覽器時點擊鍵盤的F12進入開發者模式。

(一)小說目錄

HTML內容

通過href標簽可以獲得每本小說的詳細地址,隨後打開該地址獲取章節下載地址。

(二)章節下載目錄

HTML內容

遍歷每本小說的地址並保存到單獨的txt文件中供後續下載。

(三)代碼

 1 import time,re
 2 
 3 from playwright.sync_api import Playwright, sync_playwright, expect
 4 
 5 def cancel_request(route,request):
 6     route.abort()
 7 def run(playwright: Playwright) -> None:
 8     browser = playwright.chromium.launch(headless=False)
 9     context = browser.new_context()
10     page = context.new_page()
11     # 不載入圖片
12     # page.route(re.compile(r"(\.png)|(\.jpg)"), cancel_request)
13     page.goto("https://mobinovels.com/")
14     # 由於魔筆小說首頁是動態載入列表,因此在此處加30s延遲,需手動滑動頁面至底部直至載入完全部內容
15     for i in range(30):
16         time.sleep(1)
17         print(i)
18     # 定位至列表元素
19     novel_list = page.locator('[class="post-title entry-title"]')
20     # 統計小說數量
21     total = novel_list.count()
22     # 遍歷獲取小說詳情地址
23     for i in range(total):
24         novel = novel_list.nth(i).locator("a")
25         title = novel.inner_text()
26         title_url = novel.get_attribute("href")
27         page1 = context.new_page()
28         page1.goto(title_url,wait_until='domcontentloaded')
29         print(i+1,total,title)
30         try:
31             content_list = page1.locator("table>tbody>tr")
32             # 保存至單獨txt文件中供後續下載
33             with open('./novelurl/'+title+'.txt', 'a') as f:
34                 for j in range(content_list.count()):
35                     if content_list.nth(j).locator("td").count() > 2:
36                         content_href = content_list.nth(j).locator("td").nth(3).locator("a").get_attribute("href")
37                         f.write(title+str(j+1)+'分割'+content_href + '\n')
38         except:
39             pass
40         page1.close()
41     # 程式結束後手動關閉程式
42     time.sleep(50000)
43     page.close()
44 
45     # ---------------------
46     context.close()
47     browser.close()
48 
49 
50 with sync_playwright() as playwright:
51     run(playwright)

(四)運行結果

四、開始下載

之所以先將下載地址保存到txt再下載而不是立即下載,是防止程式因網路等原因異常崩潰後記錄進度,下次啟動避免重覆下載。

(一)獲取cookies

城通網盤下載較大資源時需要登陸,有的輕小說文件較大時,頁面會跳轉到登陸頁面導致程式卡住,因此需利用cookies保存登陸狀態,或增加延遲手動在頁面登陸。

chrome瀏覽器可以通過cookies editor插件獲取cookies,導出後即可使用。

(二)分析下載地址

下載地址有三種類型,根據判斷條件分別處理:

(1)文件的訪問密碼統一為6195,當功能變數名稱為 https://url74.ctfile.com/ 地址尾碼帶有 ?p=6195 時,頁面自動填入訪問密碼,我們需要在腳本中判斷尾碼是否為 ?p=6195 ,如不是則拼接字元串後訪問;

(2)有尾碼時無需處理;

(3)當功能變數名稱為 https://t00y.com/ 時無需密碼;

 1                         if "t00y.com" in new_url:
 2                             page.goto(new_url)
 3                         elif "?p=6195" not in new_url:
 4                             page.goto(new_url+"?p=6195")
 5                             page.get_by_placeholder("文件訪問密碼").click()
 6                             page.get_by_role("button", name="解密文件").click()
 7                         else:
 8                             page.goto(new_url)
 9                             page.get_by_placeholder("文件訪問密碼").click()
10                             page.get_by_role("button", name="解密文件").click()

(三)開始下載

playWright下載資源需利用 page.expect_download 函數。

下載完整代碼如下:

 1 import time,os
 2 
 3 from playwright.sync_api import Playwright, sync_playwright, expect
 4 
 5 
 6 def run(playwright: Playwright) -> None:
 7     browser = playwright.chromium.launch(channel="chrome", headless=False) # 此處使用的是本地chrome瀏覽器
 8     context = browser.new_context()
 9     path = r'D:\PycharmProjects\wxauto\novelurl'
10     dir_list = os.listdir(path)
11     # 使用cookies
12     # cookies = []
13     # context.add_cookies(cookies)
14     page = context.new_page()
15     for i in range(len(dir_list)):
16         try:
17             novel_url = os.path.join(path, dir_list[i])
18             print(novel_url)
19             with open(novel_url) as f:
20                     for j in f.readlines():
21                         new_name,new_url = j.strip().split("分割")
22                         if "t00y.com" in new_url:
23                             page.goto(new_url)
24                         elif "?p=6195" not in new_url:
25                             page.goto(new_url+"?p=6195")
26                             page.get_by_placeholder("文件訪問密碼").click()
27                             page.get_by_role("button", name="解密文件").click()
28                         else:
29                             page.goto(new_url)
30                             page.get_by_placeholder("文件訪問密碼").click()
31                             page.get_by_role("button", name="解密文件").click()
32 
33                         with page.expect_download(timeout=100000) as download_info:
34                             page.get_by_role("button", name="立即下載").first.click()
35                             print(new_name,"開始下載")
36                         download_file = download_info.value
37                         download_file.save_as("./novel/"+dir_list[i][:-4]+"/"+download_file.suggested_filename)
38                         time.sleep(3)
39             os.remove(novel_url)
40             print(i+1,dir_list[i],"下載結束")
41         except:
42             print(novel_url,"出錯")
43     time.sleep(60)
44     page.close()
45 
46     # ---------------------
47     context.close()
48     browser.close()
49 
50 
51 with sync_playwright() as playwright:
52     run(playwright)

(四)運行結果

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 導讀 VTable: 不只是高性能的多維數據分析表格,更是行列間創作的方格藝術家! VTable是位元組跳動開源可視化解決方案 VisActor 的組件之一。 在現代應用程式中,表格組件是不可或缺的一部分,它們能夠快速展示大量數據,並提供良好的可視化效果和交互體驗。VTable是一款基於可視化渲染引擎 ...
  • 單例模式 一個類只有一個實例,並提供一個全局訪問此實例的點,哪怕多線程同時訪問。 單例模式主要解決了一個全局使用的類被頻繁的創建和消費的問題。 單例模式的案例場景 資料庫的連接池不會反覆創建 spring中一個單例模式bean的生成和使用 在我們平常的代碼中需要設置全局的一些屬性保存 七種單例模式的 ...
  • 本文介紹了一種基於線上流量實現對重構系統進行功能和性能驗證的實踐方案。針對線上流量如何攔截、如何錄製、如何存儲、如何回放以及如何發壓均作了詳細說明,為具有類似需求的讀者提供了一種可供參考的思路。 ...
  • 一起學習下架構的視角。 架構的視角 在筆者的知識體系中,實際上將架構分為業務架構、應用架構、雲基礎架構這幾大類,業務架構主要著眼於控制業務的複雜性,基礎架構著眼於解決分散式系統中存在的一系列問題。無論何種架構,都希望能實現系統的可變的同時保障業務的高可用。 很多時候架構的視角/分類沒有明顯的邊界,通 ...
  • 一、項目地址 https://github.com/LinFeng-BingYi/DailyAccountBook 二、新增 1. 在表格中設置選項列表,讓用戶更快地編輯動賬記錄 1.1 功能詳述 為表格中以下欄位設置選項列表: 1. 需求強度(由"基本需求"更名) 溫飽:基本維持生存且不鋪張浪費的 ...
  • Python裝飾器是一種語法糖,用於在不改變原有函數代碼的情況下,為函數添加額外的功能。裝飾器本質上是一個函數,它接收一個函數作為參數,並返回一個新的函數,通常使用@語法糖來應用裝飾器。 1.裝飾器本質是一個函數,可稱之為函數裝飾器; 2.裝飾器也是一個閉包,即在非全局範圍內定義的函數可以引用其外圍... ...
  • Java網路編程基於TCP/UDP協議的基礎之上,TCP/IP協議是一個協議簇。裡面包括很多協議的,UDP只是其中的一個, 之所以命名為TCP/IP協議,因為TCP、IP協議是兩個很重要的協議,就用他兩命名了。那麼首先我們先介紹一下TCP和UDP的特點: 1.TCP(Transmission Con ...
  • 目錄前言介紹舉例: 前言 不錯麼 內容參考 https://zh.cppreference.com/w/cpp/ranges Chatjpt 總結註意點: 確保你的C++編譯器支持C++20標準 包含 ranges 頭文件 views的操作是惰性的,它們不會立即執行,而是在需要時計算。這意味著你可以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...