python優雅地爬蟲!

背景

我需要獲得新聞,然后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拿到之后,剩下的過程就簡單了。和一般的requestsspider爬蟲一樣,需要獲得頁面的代碼,然后解析對應的元素,拿到屬性或者文本。

# 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."""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是包四餐的學科”。

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

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

相關文章

視頻云存儲/安防監控/視頻匯聚EasyCVR平臺新增設備經緯度選取

視頻云存儲/安防監控EasyCVR視頻匯聚平臺基于云邊端智能協同,支持海量視頻的輕量化接入與匯聚、轉碼與處理、全網智能分發、視頻集中存儲等。音視頻流媒體視頻平臺EasyCVR拓展性強,視頻能力豐富,具體可實現視頻監控直播、視頻輪播、視頻錄像、…

公網遠程連接Redis數據庫「內網穿透」

文章目錄 1. Linux(centos8)安裝redis數據庫2. 配置redis數據庫3. 內網穿透3.1 安裝cpolar內網穿透3.2 創建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一個固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址連接 前言 潔潔的個人主頁 我就問你有沒有發揮&#xff0…

藍牙資訊|蘋果Apple Watch可手勢操控Mac和Apple TV等設備

根據美國商標和專利局(USPTO)公示的清單,蘋果公司近日獲得了一項技術專利,概述了未來的 Apple Watch 手表,使用手勢等操控 Mac 和 Apple TV 等設備。 該專利描述未來 Apple Watch 可以交互實現編輯圖像、繪圖、處理文…

02:STM32--EXTI外部中斷

目錄 一:中斷 1:簡歷 2:AFIO 3:EXTI ?編輯 4:NVIC基本結構 5:使用步驟 二:中斷的應用 A:對外式紅外傳感計數器 1:連接圖?編輯 2:函數介紹 3:硬件介紹 4:計數代碼 B;旋轉編碼計數器 1:連接圖 2:硬件介紹 3:旋轉編碼器代碼: 一:中斷 1:簡歷 中斷:在主程…

Flutter 測試小結

Flutter 項目結構 pubspec.yaml 類似于 RN 的 package.json,該文件分別在最外層及 example 中有,更新該文件后,需要執行的 Pub get lib 目錄下的 dart 文件為 Flutter 插件封裝后的接口源碼,方便在其他 dart 文件中調用 example 目…

python通過S7協議讀取西門子200smart數據

發現網上很多關于python通過s7協議控制200smart的代碼都失敗,我猜應該是版本的問題。自己搗鼓了半天,終于測試成功 from snap7 import util,clientmy_plc client.Client() #建立一個客戶端對象 my_plc.set_connection_type(3) #如果是200smart,必須有此…

Flink流批一體計算(14):PyFlink Tabel API之SQL查詢

舉個例子 查詢 source 表,同時執行計算 # 通過 Table API 創建一張表: source_table table_env.from_path("datagen") # 或者通過 SQL 查詢語句創建一張表: source_table table_env.sql_query("SELECT * FROM datagen&quo…

QT實現天氣預報

1. MainWindow類設計的成員變量和方法 public: MainWindow(QWidget* parent nullptr); ~MainWindow(); protected: 形成文本菜單來用來右鍵關閉窗口 void contextMenuEvent(QContextMenuEvent* event); 鼠標被點擊之后此事件被調用 void mousePressEvent(QMouseEv…

Leetcode每日一題:1444. 切披薩的方案數(2023.8.17 C++)

目錄 1444. 切披薩的方案數 題目描述: 實現代碼與解析: 二維后綴和 動態規劃 原理思路: 1444. 切披薩的方案數 題目描述: 給你一個 rows x cols 大小的矩形披薩和一個整數 k ,矩形包含兩種字符: A …

Spring(三):Spring中Bean的生命周期和作用域

前言 在 Spring 中,那些組成應用程序的主體及由 Spring IOC 容器所管理的對象,被稱之為 bean。簡單地講,bean 就是由 IOC 容器初始化、裝配及管理的對象,除此之外,bean 就與應用程序中的其他對象沒有什么區別了。而 b…

Oracle數據庫運維大全

以下是一些常見的Oracle數據庫運維任務和對應的語句腳本示例: 檢查數據庫實例狀態: SELECT instance_name, status, startup_time FROM v$instance; 查看數據庫版本和補丁級別: SELECT * FROM v$version; SELECT patch_id, action, status …

LeetCode 熱題 100(四):48. 旋轉圖像、240. 搜索二維矩陣 II、234. 回文鏈表

一.48. 旋轉圖像 題目要求:就是一個順時針的旋轉過程。 思路:觀察矩陣,得出翻轉前第i行的第J個元素 等于 翻轉后倒數第i列的第J個元素,舉例說明,第1行第2個元素為“2”,翻轉后到了 倒數第1列的第2個元素…

MAC環境,在IDEA執行報錯java: -source 1.5 中不支持 diamond 運算符

Error:(41, 51) java: -source 1.5 中不支持 diamond 運算符 (請使用 -source 7 或更高版本以啟用 diamond 運算符) 進入設置 修改java版本 pom文件中加入 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin&l…

vue項目預覽pdf功能(解決動態文字無法顯示的問題)

最近&#xff0c;因為公司項目需要預覽pdf的功能&#xff0c;開始的時候找了市面上的一些pdf插件&#xff0c;都能用&#xff0c;但是&#xff0c;后面因為pdf變成了需要根據內容進行變化的&#xff0c;然后&#xff0c;就出現了需要動態生成的文字不顯示了。換了好多好多的插件…

Flink安裝與使用

1.安裝準備工作 下載flink Apache Flink: 下載 解壓 [dodahost166 bigdata]$ tar -zxvf flink-1.12.0-bin-scala_2.11.tgz 2.Flinnk的standalone模式安裝 2.1修改配置文件并啟動 修改&#xff0c;好像使用默認的就可以了 [dodahost166 conf]$ more flink-conf.yaml 啟動 …

【辦公自動化】使用Python批量生成PPT版榮譽證書

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

RocketMQ消費者可以手動消費但無法主動消費問題,或生成者發送超時

1.大多數是配置問題 修改rocketmq文件夾broker.conf 2.配置與集群IP或本地IPV4一樣 重啟 在RocketMQ獨享實例中支持IPv4和IPv6雙棧&#xff0c;主要是通過在網絡層面上同時支持IPv4和IPv6協議棧來實現的。RocketMQ的Broker端、Namesrv端和客戶端都需要支持IPv4和IPv6協議&…

Python土力學與基礎工程計算.PDF-螺旋板載荷試驗

python 求解代碼如下&#xff1a; 1. import numpy as np 2. 3. # 已知參數 4. p_a 100 # 標準壓力&#xff0c; kPa 5. p np.array([25, 50, 100, 200) # 荷載&#xff0c; kPa 6. s np.array([2.88, 5.28, 9.50, 15.00) / 10 # 沉降量&#xff0c; cm 7. D 10 # 螺旋板直…

C語言:選擇+編程(每日一練)

目錄 選擇題&#xff1a; 題一&#xff1a; 題二&#xff1a; 題三&#xff1a; 題四&#xff1a; 題五&#xff1a; 編程題&#xff1a; 題一&#xff1a;尼科徹斯定理 示例1 題二&#xff1a;等差數列 示例2 本人實力有限可能對一些地方解釋和理解的不夠清晰&…

Redis知識(一)

目錄 Redis過期刪除和內存淘汰策略&#xff1a; 過期刪除策略&#xff1a; 內存淘汰策略&#xff08;解決內存過大問題&#xff09;&#xff1a; LRU和LFU以及他們在Redis里的實現 主從復制 哨兵模式 緩存 緩存雪崩 緩存擊穿 緩存穿透 數據庫和緩存一致性問題 Redis…