Excel不只是一個簡單的表格工具還有你不了解的神奇作用(表格工具都有哪些)
794
2025-04-01
今天,他爬取了 上千張 相親素顏照。跟我說?刷相親平臺,收集素顏照,訓練機器模型。這也能信?
她們明明化妝了。
閱讀本文你將收獲
近萬張素顏頭像;
lxml 解析庫初識;
XPath 語法初識;
Cooike 反爬;
女朋友(沒準是意外收獲)
Python 采集 19 樓相親女生頭像
從本篇博客開始,你將進入爬蟲 120 例的第二個小階段,requests + lxml 實現爬蟲。
requests 相信通過前面 10 個案例,你已經比較熟悉了,接下來我們在其基礎上,新增一款爬蟲解析庫 lxml。該庫主要用于 XML,HTML 的解析,而且解析效率非常高,使用它之后,你就可以擺脫編寫正則表達式的煩惱了。
目標數據源分析
爬取目標網站
本次抓取目標是 19 樓女生相親頻道,該分類頻道截止 7 月 1 日還在持續更新中。
https://www.19lou.com/r/1/19lnsxq.html
以下圖片來自網頁截圖,如有侵權,及時聯系橡皮擦哦~
本次爬取的目標為上圖頭像圖片,文件名保存為標題內容。
使用的 Python 模塊
requests 模塊
lxml 模塊
fake_useragent 模塊
重點學習內容
lxml 模塊初識。
列表頁分析
本次抓取圍繞列表頁即可完成任務,列表頁排序規則如下:
https://www.19lou.com/r/1/19lnsxq.html https://www.19lou.com/r/1/19lnsxq_2.html https://www.19lou.com/r/1/19lnsxq-233.html
圖片所在標簽如下所示,提取工作交給 lxml 模塊完成,當然為了聯系熟練程度,你依舊可以使用 re 模塊完成一版。
lxml 基礎知識
提前通過 pip install lxml 對該庫完成安裝。
導入該庫與該庫的基本使用。
from lxml import etree html = "一點HTML代碼" #生成一個 XPath 對象 html=etree.HTML(text) # 提取數據 html.xpath('//li/a')
上述代碼注釋中提及的 XPath 對象,關于 XPath,是一門在 XML/HTML 文檔中查找信息的語言,大意為通過特定語法在 HTML 中提取數據的語言,基礎知識的學習,可以參考 https://www.w3school.com.cn/xpath/xpath_intro.asp,最佳的學習技巧是邊查邊用。
整理需求如下
批量生成待抓取列表頁;
requests 請求目標數據;
lxml 提取目標數據;
保存圖片。
編碼時間
在編碼時,為了防止直接被反爬識別,所在爬取過程中,增加一個等待時間,限制爬取速度(當然在后續發現沒有對 IP 的限制,直接移除即可)。
代碼編寫過程中,如果出現如下錯誤,更新 fake_useragent 即可。
raise FakeUserAgentError('Maximum amount of retries reached')
更新腳本如下:
pip install -U fake-useragent
如果依舊失敗,建議自己寫隨機生成 UserAgent 的函數。
一點點反爬
爬取該目標數據時,直接通過 requests 請求目標地址,會返回如下代碼,該代碼不是目標數據所在頁面,即網站存在反爬技術。
直接請求目標網址,得到的響應代碼如下圖所示,注意紅框位置。
對 requests 請求到的數據進行分析,發現在返回的代碼中設置了 Cookie,該值進行反復測試之后,發現為固定值,后續直接通過 requests 參數 headers 設置即可。
獲取到目標頁面源碼之后,就可以通過 lxml 進行頁面提取操作了,在前文已經進行了簡單的描述。重點學習的分為兩個部分內容:
首先通過 lxml 模塊中的 etree 對象,將 HTML 源碼進行序列化,即轉化為 Element 對象;
然后對 Element 對象進行解析,這里用到的解析語法是 XPath,本文用到了路徑解析,在完整代碼部分有注釋說明。
完整代碼
import requests from lxml import etree from fake_useragent import UserAgent import time def save(src, title): try: res = requests.get(src) with open(f"imgs/{title}.jpg", "wb+") as f: f.write(res.content) except Exception as e: print(e) def run(url): # ua = UserAgent(cache=False) ua = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36" headers = { "User-Agent": ua, "Host": "www.19lou.com", "Referer": "https://www.19lou.com/r/1/19lnsxq-233.html", "Cookie": "_Z3nY0d4C_=37XgPK9h" # 從反爬代碼中獲取到的值 } try: res = requests.get(url=url, headers=headers) text = res.text # 將 html 轉換成 Element 對象 html = etree.HTML(text) # xpath 路徑提取 @class 為選取 class 屬性 divs = html.xpath("http://div[@class='pics']") # print(len(divs)) # 遍歷 Elements 節點 for div in divs: # 提取地址,注意提取的屬性為 data-src 而不是 src src = div.xpath("./img/@data-src")[0] # 提取標題 title = div.xpath("./img/@alt")[0] save(src, title) except Exception as e: print(e) if __name__ == '__main__': urls = ["https://www.19lou.com/r/1/19lnsxq.html"] for i in range(114, 243): urls.append(f"https://www.19lou.com/r/1/19lnsxq-{i}.html") for url in urls: print(f"正在抓取{url}") run(url) # time.sleep(5) print("全部爬取完畢")
為了提高效率,你可以取消 5 秒等待,也可以采用多線程,不過嘗試幾秒鐘就好了,不要過度抓取哦,畢竟咱們只為學習。
上述代碼還存在一個重要知識點,在獲取到的源碼中圖片的 src 屬性為 dot.gif(加載圖片),data-src 屬性存在值。
具體對比如下圖所示,上圖為直接查看頁面源碼,下圖為服務器直接返回源碼。
這部分給我們的爬取提示為,任何數據的解析提取,都要依據服務器直接返回的源碼。
抓取結果展示時間
爬蟲 120 例,第 11 例完成,希望本篇博客能帶給你不一樣的驚喜與知識。相關資料可以在下面直接獲取。
完整代碼-:https://codechina.csdn.net/hihell/python120,NO11。
爬取資源僅供學習使用,侵權刪。
Python 正則表達式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。