Python爬蟲系列-讓爬蟲自己寫爬蟲(半自動化,代替人工寫爬蟲)

????????現在的PC、手機客戶端等終端設備大量使用了網頁前后端技術,另外主流的網站也會經常會更新,導致以前一個月更新一次爬蟲代碼,變成了天天需要更新代碼,所以自動化爬蟲技術在當前就顯得特別重要,最近我也是在多次更新某個爬蟲后,突然有了這樣的需求,嘗試搜索了下相關信息,發現是有人弄過這東西,我想哪些大廠肯定也有爬蟲工程師開發過這東西,但是都沒有開源,找不到啥資料,所以我想寫一篇這方面的東西,感興趣的朋友可以看下去。

? ? ? ? 首先,我們先確定下基本思路,我經常使用Requests+BeautifulSoup寫爬蟲,所以基本代碼的模板很好寫,如下:

code_template = """
import requests
from bs4 import BeautifulSoupdef crawl(url):response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')results = []SELECTORS_PLACEHOLDERreturn resultsif __name__ == "__main__":url = "URL_PLACEHOLDER"results = crawl(url)for result in results:print(result)"""

其中SELECTORS_PLACEHOLDER就是我們需要用程序動態填寫的內容,這是根據爬蟲自我填寫的代碼,輸入的代碼如下所示:
?那么我們跟這個程序根據什么爬蟲那,其實也很簡單,我們使用上一篇文章的例子,鏈接如下為:
Python爬蟲系列-爬取小說20240703更新(Request方法)icon-default.png?t=N7T8https://blog.csdn.net/donglxd/article/details/140145498

我們先試試爬取某個章節部分,隨便打開一篇文章,如下圖:

選取一行字,比如正文的第一句:"京海市第四高中,新生報到日。" 把這句作為一個參數代入到我的程序中,同時把這篇文章的網址也代入到我的程序中如下:

把運行后的自動寫的代碼如下:

復制后新建一個python文件,粘貼進去,保存并運行,就會得到如下結果:

?

有人要問了,我的自動生成爬蟲,只能爬取文本嗎?不能爬取屬性值嗎?比如屬性里的鏈接?當然可以,請看下圖:

可以看到第一章的鏈接是"41594870.html",這個不是絕對鏈接,而是相對鏈接,需要拼接處理,這個很簡單,我想稍微學過5分鐘python字符串語法的都會。我們把這個"41594870.html"屬性代入我的程序讀取看看,參數設置如下:

生成的爬蟲如下:
新建一個python文檔運行看看:

可以看到爬取成功了,我們可以嘗試把兩者結合起來,寫一個手動爬蟲,如下:

import requests
from bs4 import BeautifulSoup
import time# 導入time庫加延遲用# def crawl(url):
def getText(url):#把crawl函數建立一個新名稱,方便調用,這個函數和下面的函數名不同,已區分開功能(讀取每章內容)response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')# results = []results = ""#把數組改成字符串拼接用elements = soup.select('html body #main .bookinfo.m10.clearfix .chaptercontent #content p')for element in elements:# results.append(element.get_text(strip=True))results = results + element.get_text(strip=True) + "\n"results = results + "\n"#每章之間空一行return results# def crawl(url):
def getUrl(url):#把crawl函數建立一個新名稱,方便調用,這個函數和下面的函數名不同,已區分開功能(讀取每章網址)response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')# results = []elements = soup.select('html body #main .chapterlist .clearfix li a')with open("20.AI編程爬蟲\\1.txt","a+",encoding="utf-8") as f:# 創建一個新的txt文檔,記錄小說內容。for element in elements:# results.append(element.get('href', 'N/A'))results = getText(url + "/" + element.get('href', 'N/A'))# 把主鏈接和href的相對鏈接拼合f.write(results)#寫入每章內容到txt文檔print("鏈接內容:" + url + "/" + element.get('href', 'N/A') + "寫入成功!")#輸出寫入的鏈接time.sleep(3)#為了爬取穩定加點延遲# return resultsif __name__ == "__main__":url = "https://www.feibzw.com/Html/51366"# results = getUrl(url)getUrl(url)# for result in results:#     print(result)

可以看到上面的代碼中,我注釋的代碼都是原來兩個爬蟲里的,新加的代碼都有注釋說明,一行行寫下來不難,這部分其實也可以自動化,但是可能每個網站的鏈接地址都不同,拼接方法也不同,所以我寫了這個模板給大家套用,按實際情況改就行了,這個模板可以應付大多數小說網站。我在這只是教大家方法,希望有拋磚引玉的作用,授人以漁。

最后放上我的自動生成程序,免費提供給大家:

import requests
from bs4 import BeautifulSoupdef find_elements_by_text_or_attribute(url, text):# 發送請求并獲取網頁內容response = requests.get(url)response.raise_for_status()  # 檢查請求是否成功html_content = response.text# 解析網頁內容soup = BeautifulSoup(html_content, 'html.parser')# 查找所有包含目標文本的標簽target_tags = set()for tag in soup.find_all(string=True):if text in tag:parent = tag.parenttarget_tags.add(parent)# 查找所有包含目標屬性值的標簽for tag in soup.find_all(True):  # True表示查找所有標簽for attr, value in tag.attrs.items():if isinstance(value, list):value = ' '.join(value)if text in value:target_tags.add(tag)breakreturn target_tagsdef get_unique_selectors(target_tags):unique_selectors = set()for tag in target_tags:selectors = []for parent in tag.parents:if parent.name == '[document]':breakif parent.get('id'):selectors.append(f"#{parent.get('id')}")elif parent.get('class'):selectors.append(f".{'.'.join(parent.get('class'))}")else:selectors.append(parent.name)selectors.reverse()selectors.append(tag.name)unique_selector = ' '.join(selectors)unique_selectors.add(unique_selector)return unique_selectorsdef generate_crawler_code(url, selectors, is_attribute, attribute=None):code_template = """
import requests
from bs4 import BeautifulSoupdef crawl(url):response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')results = []SELECTORS_PLACEHOLDERreturn resultsif __name__ == "__main__":url = "URL_PLACEHOLDER"results = crawl(url)for result in results:print(result)"""selectors_code = ""for selector in selectors:selectors_code += f"elements = soup.select('{selector}')\n"selectors_code += f"    for element in elements:\n"if is_attribute:selectors_code += f"        results.append(element.get('{attribute}', 'N/A'))\n"  # 這里的N/A表示如果屬性不存在返回默認值else:selectors_code += f"        results.append(element.get_text(strip=True))\n"final_code = code_template.replace("URL_PLACEHOLDER", url).replace("SELECTORS_PLACEHOLDER", selectors_code)return final_codedef crawl_generator(url, text):target_tags = find_elements_by_text_or_attribute(url, text)if target_tags:unique_selectors = get_unique_selectors(target_tags)attribute = Noneis_attribute = False# 檢查是文本內容還是屬性值for tag in target_tags:for attr, value in tag.attrs.items():if isinstance(value, list):value = ' '.join(value)if text in value:is_attribute = Trueattribute = attrbreakif is_attribute:breakcrawler_code = generate_crawler_code(url, unique_selectors, is_attribute, attribute)return crawler_codeelse:return "未找到包含目標文本或屬性的元素。"if __name__ == "__main__":url = "https://www.feibzw.com/Html/51366"  # 替換為目標網址text = "41594870.html"  # 替換為目標文本# url = "https://www.feibzw.com/Html/51366/41594870.html"  # 替換為目標網址# text = '''京海市第四高中,新生報到日。'''  # 替換為目標文本crawler_code = crawl_generator(url, text)print(crawler_code)

謝謝大家觀看,再見!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40469.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

養老院生活管理系統

摘要 隨著全球范圍內人口老齡化趨勢的日益加劇,養老院作為老年人生活的重要場所,其生活管理問題也顯得愈發突出和重要。為了滿足養老院在日常生活管理、老人健康監護、服務人員管理等多方面的需求,提高管理效率和服務質量。決定設計并實現了…

用一百場線下講座科普充電樁 能效電氣做到了

在新能源汽車產業蓬勃發展的今天,充電樁作為產業鏈的重要環節,其建設與發展成為推動行業進步的關鍵。在這一背景下,能效電氣憑借其卓越的技術實力和前瞻性的市場布局,成為了新能源充電樁行業的佼佼者。 為了進一步推動新能源產業的發展,普及充電樁知識,能效電氣精心策劃并舉辦…

C語言數據類型和變量(二)

目錄 1.數據類型的取值范圍 2.變量 2.1 變量的創建 2.2 變量的分類 2.3全局變量和局部變量在內存中的存儲?編輯 3. 算術操作符: 、 - 、* 、/ 、% 3.1 和 - 3.2 * 3.3 / 3.4 % 1.數據類型的取值范圍 每一種數據類型有自己的取值范圍,也就是存…

mapper.xml 文件對應的 Dao 接口原理

在 Java 框架如 MyBatis 中,Mapper.xml 文件是用于定義 SQL 查詢的配置文件,而對應的 Dao 接口(Mapper 接口)則提供了與 XML 文件中的 SQL 查詢相對應的方法。這種設計模式使得 Java 代碼與 SQL 語句解耦,提高了代碼的…

盤點亞馬遜5大實用選品思路(圖文講解+選品案例)

一、7天藍海選品法 市場上很多工具一般都是近30天的跨境商品數據,而店雷達亞馬遜選品,可以篩選出上架近7天的亞馬遜產品,避免在已經市場相對飽和的賽道,中小賣家還要擠破頭去搶蛋糕。我們更應該學會在市場反饋好的新品中找到出單…

Git刪除了文件拉取時失敗

本地刪除了一些文件,遠端的另一個提交修改了被刪除的文件,vs里拉取時提示未處理的提交,無法繼續操作,git gui里顯示很多unstaged change的項 解決辦法: 1、用git bash的git rm --cached filename或 git rm -r --cached…

GBASE8S如何使用dbexport實現單表的還原和實現數據庫的復制

(一) 通過dbexport實現單表數據還原 1. 測試前的信息查看 本次以test庫的表test21為例 [gbasedbtiZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test - Your evaluation license will expire on 2025-05-26 00:00:00Database selected.> select * from test21;id name1 a2 b3 c3…

探索Vue.js的無限可能 —— vuejs-challenges

vuejs-challenges:挑戰自我,共同成長,Vue.js挑戰等你來戰!- 精選真開源,釋放新價值。 概覽 vuejs-challenges是一個專為Vue.js學習者和開發者設計的開源項目。它通過提供一系列精心設計的挑戰,幫助參與者深…

使用 JavaScriptCore 進行跨語言調用

使用 JavaScriptCore 進行跨語言調用時,既可以在 Native 代碼中執行 JavaScript 代碼,也可以在 JavaScript 中調用 Native 方法。以下是詳細的實現步驟和示例。 1. 在 Native 代碼中執行 JavaScript 代碼 使用 JavaScriptCore 框架,可以在 …

手把手教你一步一步通過AI助手生成利潤表分析報告

AI助手之利潤表分析報告-操作篇 以下為文字整理部分: 如果要手工制作一份這樣的利潤分析報告大概要多久時間?從準備數據做成表格,到完成報告,至少需要1天的時間吧,特別是敲文字報告的時候,生怕把數字搞錯要…

什么是森林防火氣象站?作用?

森林防火氣象站用精準的數據和先進的技術,守護著森林的安全。本文將帶您了解其重要性、工作原理以及在森林防火中的實際應用。 一、森林防火氣象站的重要性 森林火災是森林生態系統的大敵,它能在短時間內燒毀大片森林,破壞生態平衡&#xff0…

5、Redis 緩存設計相關知識點

1. 多級緩存架構 多級緩存架構是一種通過在應用層和數據庫層之間添加多個緩存層來提高系統性能和可用性的架構設計。這種設計能夠有效減少數據庫負載,并提高數據訪問速度。常見的多級緩存包括本地緩存、分布式緩存和數據庫緩存。 本地緩存:本地緩存位于應用服務器本地,響應…

高通平臺Display顯示架構

目錄 一、顯示整體架構二、SurfaceFlinger三、HWC四、Gralloc五、DisplayManagerService六、WindowManagerService 一、顯示整體架構 二、SurfaceFlinger SurfaceFlinger是一個系統服務,如:audioflinger等等,這個系統服務主要實現了Surface的…

通過升級nginx完美修復nginx相關漏洞

目錄 前言1 安全評估報告的漏洞信息1.1 nginx漏洞概況1.2 nginx漏洞詳細信息1.3 安裝的軟件信息 2 問題分析3 Nginx從1.18版本升級到1.26版本的步驟與說明3.1 查看現有Nginx配置參數3.2 下載新版本Nginx3.3 配置新版本Nginx3.4 編譯新版本Nginx3.5 備份舊版本Nginx的二進制文件…

github 設置中文,親測有效

點進去 安裝 選上面第二個,不行再選第一個 GitHub - maboloshi/github-chinese: GitHub 漢化插件,GitHub 中文化界面。 (GitHub Translation To Chinese)

常見網絡攻擊方式及防御方法

1. DDOS攻擊(分布式拒絕服務攻擊) 概念:借助于C/S(客戶端/服務器)技術,將多個計算機聯合起來作為攻擊平臺,對一個或多個目標發動DDOS攻擊,從而成倍地提高拒絕服務攻擊的威力。防護方…

springboot 配置加密,jasypt加解密命令

位置:Maven倉庫中\org\jasypt\jasypt\1.9.3 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input123456 passwordmysalt algorithmPBEWithMD5andDES ----ENVIRONMENT----------------- Runtime: Oracle Corporation Java HotSpot?…

sideloadly 蘋果自簽和sidestore手機續簽ipa記錄

sideloadly 地址:https://sideloadly.io/#download 直接安裝對應系統軟件,然后吧ipa 拖到里面續簽,缺點每7天需要電腦續簽 如果續簽保留數據需要對應的位置開啟 enable file sharing 勾選 和 bundle id 修改 注意的地方需要電腦和手機appi…

氣象觀測站:時刻注視著天空的變化

在廣袤無垠的地球上,氣象觀測站時刻注視著天空的變化,記錄著大自然的脈動。它們是我們理解和應對氣候變化、極端天氣事件的重要工具。 一、氣象觀測站的基本構成 氣象觀測站包括一系列的氣象儀器和設備,用于測量和記錄各種氣象參數。這些參數…

軟考《信息系統運行管理員》-2.5信息系統運維管理系統與專用工具

2.5信息系統運維管理系統與專用工具 信息系統運維管理系統功能框架 信息系統運維管理系統是站在運維管理的整體視角,基于運維流程,以服務為導向的業務 服務管理和運維管理支撐平臺,提供統一管理門戶,最終幫助運維對象實現信息系…