爬虫摸索中~~(PS:小小爬虫,何惧哉?且到明日,再看今朝。)
目錄
- 搭建環境
- 安裝爬蟲庫
- 爬蟲測試
- 獲取網頁整體信息
- 1.訪問目標網頁
- 2.引入Requests庫獲取請求響應
- 3.引入BeautifulSoup庫格式化處理響應數據
- 獲取網頁中特定信息
- 1.找到目標HTML標簽
- 2.獲取目標網頁定位
- 3.爬取指定數據信息
搭建環境
??在操作系統中安裝好Python,這里采用的是Python 3.9.9;選擇VS Code作為開發工具,安裝Python插件,方便代碼編輯和調試。
安裝爬蟲庫
??初入爬蟲世界,先要了解下今天用的常規工具庫——Requests和BeautifulSoup。
??Requests主要作用是請求網站獲取網頁數據,BeautifulSoup則可以輕松解析Requests庫獲得的網頁信息,并把網頁源代碼解析為Soup文檔,便于過濾提取數據。這里簡單介紹一種安裝方法如下,其它方法請大家自行搜索。
爬蟲測試
獲取網頁整體信息
1.訪問目標網頁
??使用Chromium內核的新版Edge瀏覽器打開任意網頁,下圖為網頁網頁,是一篇文章。
2.引入Requests庫獲取請求響應
??這里,我們新建一個python文件,引入Requests庫,通過requests.get()以GET方式發送請求,獲取響應信息。
import requests res = requests.get("https://*.*.*") print(res) print(res.text)??通過print()函數將響應結果的HTTP狀態碼響應消息內容輸出后,結果如下。可以看出,數據結構不清晰,不利于我們分析數據,因此,需要對數據進行處理,方便查找分析。
3.引入BeautifulSoup庫格式化處理響應數據
??我們在原有代碼的基礎上,添加BeautifulSoup相關代碼,對Requests庫獲得的響應信息進行處理,將數據格式化,形成一個具有內在結構的 BeautifulSoup對象。
import requests from bs4 import BeautifulSoup res = requests.get("https://*.*.*") soup = BeautifulSoup(res.text, 'html.parser') print(soup.prettify())??通過prettify()方法可以將Beautiful Soup文檔樹格式化,以Unicode編碼輸出,每個XML/HTML標簽都獨占一行,結果如下圖所示,格式清晰,可視化效果好,方便分析。
獲取網頁中特定信息
??對于一個網頁來說,我們感興趣的往往是一部分特定信息,因此,可以利用Beautiful Soup的選擇功能篩選出感興趣的內容,予以爬取。下面我們來看看怎么去做。
1.找到目標HTML標簽
??在網頁上右鍵選擇檢查,可以打開網頁調試工具,如下圖所示。
??點擊調試工具左上角的按鈕(如下圖所示)后,再點擊左邊網頁中的某個目標元素,在右邊調試部分便會高亮顯示當前元素的標簽信息。
2.獲取目標網頁定位
??以剛才打開的網頁為例,這篇文章有很多標題,假設我們想要獲取這些一級標題信息,該怎么辦呢?我們可能發現,頁面結構比較復雜,通過上一步操作無法獲得目標的完整標簽路徑,也就是無法得到目標的準確位置,進而無法通過代碼定位選擇出我們需要的信息。這時,該怎么辦呢?其實很簡單,我們選中感興趣的某個標題,比如Unicode編碼這行,在調試器中看到這個元素的標簽信息,如下圖所示。
??此時,在該部分信息上點擊右鍵->復制->復制Selector,可以獲得目標網頁定位#Unicode\%E7\%BC\%96\%E7\%A0\%81。于是,我們在代碼響應信息處理部分加入以下代碼,成功得到Unicode編碼這行文章信息。
??可是,利用這個標簽,我們無法獲得其他一級標題信息,因為在HTML中#ID信息是唯一的,就像我們利用一個人的身份證沒法找到另一個人一樣。因此,這里我們不能使用#開頭的元素ID信息。分析一級標題的標簽信息,可以知道,該元素有id、name,但兩者都有可能是網頁唯一的,不是一級標題的共同特點,因此,我們在調試器中將該元素的兩個屬性id、name刪除,使元素變成<h1>Unicode編碼</h1>,此時采用之前的方法,在該部分信息上點擊右鍵->復制->復制Selector,便可獲得新的目標網頁定位信息。
#react-root > div:nth-child(1) > div.J-body.col-body.pg-2-article > div.com-3-layout > div.layout-main > section.com-2-panel.col-2-article.J-articlePanel > div.com-markdown-collpase > div.com-markdown-collpase-main > div.rno-markdown.J-articleContent > h1:nth-child(8)??其中,定位信息最后的h1:nth-child(8) 表示的是滿足當前選擇器條件的第8個<h1>元素。所以,我們推測,其他一級標題應該也是類似<h1>元素,因此,把nth-child(8)去掉應該就是我們要獲取的一級標題的共同路徑。
3.爬取指定數據信息
??獲得一級標題共同路徑信息后,將信息遍歷輸出,便可得到我們想要的數據信息,代碼如下。
titles=soup.select("#react-root > div:nth-child(1) > div.J-body.col-body.pg-2-article > div.com-3-layout > div.layout-main > section.com-2-panel.col-2-article.J-articlePanel > div.com-markdown-collpase > div.com-markdown-collpase-main > div.rno-markdown.J-articleContent > h1") for title in titles:print(title.get_text())??titles參數存儲有相關元素的標簽信息,通過get_text()便可提取出該元素的文本信息,也就是最終我們感興趣的所有一級標題信息。至此,我們便完成了爬蟲第一步,雖然我們爬得很晚很慢,但我們依然有顆征服山頂的心。 加油,共勉!
概述 Unicode編碼 UTF-8 UTF-16 JavaScript中的string與DOMString 總結總結
以上是生活随笔為你收集整理的爬虫摸索中~~(PS:小小爬虫,何惧哉?且到明日,再看今朝。)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 员工到管理者的四点转变|智测优测总结
- 下一篇: 国家市场监督管理总局公布《国家标准管理办