python優雅地爬蟲

来源:https://www.cnblogs.com/hahaa/archive/2023/08/11/17623182.html
-Advertisement-
Play Games

我需要獲得新聞,然後tts,在每天上班的路上可以聽一下。具體的方案後期我也會做一次分享。先看我喜歡的萬能的老路:獲得html內容-> python的工具庫解析,獲得元素中的內容,完成。 好家伙,我知道我爬取失敗了。一堆js代碼,看得我煩。我一去看頁面發現:原來新聞的獲得是走的介面,然後js插入文檔的 ...


我需要獲得新聞,然後tts,在每天上班的路上可以聽一下。具體的方案後期我也會做一次分享。先看我喜歡的萬能的老路:獲得html內容-> python的工具庫解析,獲得元素中的內容,完成。

好家伙,我知道我爬取失敗了。一堆js代碼,看得我煩。我一去看頁面發現:原來新聞的獲得是走的介面,然後js插入文檔的,於是啃介面。

又被難住了!介面的pageCallback是什麼,感覺我的經驗,這個是複雜的js加密之後的,因為沒有帶這個參數,可以輕易的通過介面獲得想要的數據。

假如沒有這個參數,我其實可以為所欲為了。所以,分析pageCallback這個參數的加密非常耗時間了。也不打算研究,我決定換一種方式去研究。

拿出我的終極大招:Selenium。模擬用戶的操作,該不會攔截我吧。

爬蟲2.0

使用Selenium模擬用戶爬取頁面內容,並輸出成文件。關於Selenium是什麼,歡迎看這篇文章:selenium Python教程。在這裡,我只講我主要的實現。

首先作為一款工具腳本,我們應該不喜歡視窗界面吧,除非你需要動態的觀察程式的操作。所以,我開啟了無頭瀏覽器模式。

# 無頭瀏覽器
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)

 

關鍵的driver拿到之後,剩下的過程就簡單了。和一般的requests、spider爬蟲一樣,需要獲得頁面的代碼,然後解析對應的元素,拿到屬性或者文本。

# titles
title_elems = driver.find_elements(by=By.CLASS_NAME, value="item-title")
titles = [title_elem.text for title_elem in title_elems]

 

是不是很神奇,看到了By.CLASS_NAME,是不是一下子聯想到了CSS了。是的,你的預感足夠的正確。如果以上的內容帶給你足夠的震撼和驚奇,請繼續往下看,

# 所有的更新時間
related_elems = driver.find_elements(by=By.CSS_SELECTOR, value="div.item-related > span.time")
relateds = [related_elem.text for related_elem in related_elems]
# 所有的描述信息
desc_elems = driver.find_elements(by=By.CSS_SELECTOR, value="div.item-desc > span")
# 需要去除新聞摘要結尾的()內容
descs = [desc_item.text[:desc_item.text.rfind('')] for desc_item in desc_elems]

 

沒錯,"div.item-related > span.time"這個是什麼選擇起來著?後代選擇器。nice,CSS的選擇器它都支持。

來個小插曲:你知道的CSS選擇器有哪些?

  • 元素選擇器 p div
  • 類選擇器 .highlight
  • ID選擇器 #id
  • 屬性選擇器 [type=‘text’]
  • 後代選擇器 ul li
  • 子元素選擇器 ul > li
  • 相鄰兄弟選擇器 h2+p
  • 通用選擇器 *

不要覺得我是多餘的了,其實這些選擇器會了,基本上在頁面的爬取上就是無敵了。另外,selenium還有這幾種選擇器:

class By:
    """Set of supported locator strategies."""
# Python學習交流q裙:708525271


    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

 

常用的還是XPATH TAD_NAME CLASS_NAME CSS_SELECTOR 大家感興趣的話可以自行的研究。

最後插一句話哈,作為後端的開發人員,我很希望我的介面、網站是可以正常訪問的,給用戶提供穩定的服務。但是,爬蟲的話,對網站的危害很大的,特別是電腦的運行速度要比人快很多倍,相當於一下子加重了伺服器的負擔,類似於DOS攻擊了。一旦爬蟲劫持了流量,其它的用戶就不能正常的訪問了。

所以,在後端的介面設計上一般採取的是限流,但是也會降低用戶的使用體驗。所以,適當的學習學習就可以啦。也得守住法律的底線,話說:“python是包四餐的學科”。

好了文章分享就到這結束了,對於想把爬蟲學好,或者想學了去接單就業的小伙伴,我還給大家準備了這些資料。

1、Python基礎入門教程

萬丈高樓平地起,基礎學好了,後面學習其它方向才會穩穩噹噹,所以給大家準備了Python基礎的詳細教程 。

2、Python爬蟲實戰

爬蟲是接單需求最多,學習起來也比較快的方向之一。

所以給大家準備了爬文本+爬數據+爬音樂+爬視頻+ 爬圖片+爬音頻+網站驗證碼 +搶購等教程,視頻和源碼我都打好了,直接上面最後一段代碼里自取。

好了,文章到這裡真的結束 ,咱們下次再見!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先看效果,整體界面結構如下 ![image](https://jsd.cdn.zzko.cn/gh/YuanjunXu/Images@main/src/image.4few4wtl3uyo.jpg) 點擊左側菜單欄,右側切換顯示不同頁面內容。 [Vue3使用路由–南河小站](https://www. ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1、效果圖 用手機錄屏再用小程式轉換的gif,可能精度上有點欠缺。 2、實現過程 1、觀察及思考 開始編碼前我們首先觀察展開後的結構:兩個四分之一的圓加三個圓形菜單項。 文章名為用css畫扇形,如上圖所示沒有任何Javascript輔助卻 ...
  • ## 關於 uniapp 許可權申請和跳轉系統頁面 * 查詢許可權 * 跳轉到應用詳情 * 跳轉到系統設置 * 參考 ### `此文中所有 IOS 中使用的代碼,因為沒有設備所以均未經過實機測試` ### 查詢許可權 > uni.authorize 獲取許可權只支持微信小程式不支持app,只能用 Nativ ...
  • # Vue基礎學習 HTML+CSS+JS基礎文檔: Vue3官網文檔: | Vue2文檔: 個人建議:對於小白和新手,以及只會HTML+CSS+JS基礎的人來說,別上來就搞那一套高度封裝的開發方式,開發是很方便,調bug也是非常麻煩的。先以這種腳本引入+HTML的**混合開發**入手,熟悉之後再用 ...
  • 在本篇文章中,我們將深入學習 Flutter UI 的進階技巧,涵蓋了佈局原理、動畫實現、自定義繪圖和效果、以及 Material 和 Cupertino 組件庫的使用。通過實例演示,你將更加瞭解如何創建複雜、令人印象深刻的用戶界面。 ...
  • 在開發中,文件的上傳和下載是常見的需求。然而,當面對大型文件時,直接的上傳和下載方式可能會遇到一些問題,比如網路傳輸不穩定、文件過大導致傳輸時間過長等等。為瞭解決這些問題,我們可以使用文件分片上傳和下載的方式來提高效率和穩定性。 文件分片上傳的主要思想是將大文件分解成多個較小的部分,然後分別進行上... ...
  • ## 概述 在本文中,我們將介紹`IoC`(控制反轉)和`DI`(依賴註入)的概念,以及如何在`Spring`框架中實現它們。 ## 什麼是控制反轉? 控制反轉是軟體工程中的一個原則,它將對象或程式的某些部分的控制權轉移給容器或框架。我們最常在面向對象編程的上下文中使用它。 與傳統編程相比,傳統編程 ...
  • Redis一直是後端面試的熱門提問點,是“兵家必爭之地”,本文是Redis詳解系列的第一部分,介紹了Redis的基本概念,並輔以面試題進行知識點鞏固。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...