国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁 > 營銷資訊 > 電子商務(wù) > 一文教你爬取一個(gè)網(wǎng)頁并解析數(shù)據(jù)

一文教你爬取一個(gè)網(wǎng)頁并解析數(shù)據(jù)

時(shí)間:2023-03-14 07:16:01 | 來源:電子商務(wù)

時(shí)間:2023-03-14 07:16:01 來源:電子商務(wù)




想要學(xué)習(xí)更多的Java和Python知識(shí)歡迎關(guān)注我的CSDN頻道: )

CSDN個(gè)人主頁

1. 爬蟲準(zhǔn)備

1.1. Python基礎(chǔ)語法

首先,當(dāng)你看到這篇文章的時(shí)候,我們假定你本身了解Python的基礎(chǔ)語法以及熟悉如何安裝Python第三方庫。在這個(gè)基礎(chǔ)上,我們就可以繼續(xù)往下看啦。

1.2. 爬取一個(gè)網(wǎng)頁的整體思路

1.2.1. 基礎(chǔ)概念

網(wǎng)頁:網(wǎng)頁是構(gòu)成網(wǎng)站的基本元素,是承載各種網(wǎng)站應(yīng)用的平臺(tái).
例:百度首頁

URL:在WWW上,每一信息資源都有統(tǒng)一的且在網(wǎng)上唯一的地址.
例:百度首頁 https://www.baidu.com/

網(wǎng)頁源代碼:一個(gè)網(wǎng)頁的HTML文件內(nèi)容。
例:谷歌瀏覽器打開百度首頁,右鍵,查看網(wǎng)頁源代碼

調(diào)試模式:谷歌瀏覽器自帶的開發(fā)者工具。
例:百度首頁

PS:這里關(guān)于開發(fā)者工具的操作不多展開。

1.2.2. 簡單思路

很多時(shí)候我們會(huì)發(fā)現(xiàn)爬蟲有時(shí)候并不是那么順利,有時(shí)候需要加入很多細(xì)節(jié),但整體思路都不會(huì)離開這三個(gè)步驟。顯然這遠(yuǎn)遠(yuǎn)不夠,因此需要更加詳細(xì)的步驟

1.2.3. 詳細(xì)思路

  1. 打開一個(gè)具體的網(wǎng)頁
  2. 查看網(wǎng)頁的源代碼并查找(CTRL+F)自己所要找的數(shù)據(jù)是否在網(wǎng)頁中。
    2.1. 如果有,這時(shí)候打開開發(fā)者模式,點(diǎn)擊network,刷新。這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)你所需要的數(shù)據(jù)剛好在第一個(gè)網(wǎng)址返回。如下

最后編寫代碼爬取網(wǎng)頁并使用xpath解析
2.2. 如果沒有,這時(shí)候需要打開開發(fā)者模式,點(diǎn)擊network,刷新。這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)并不能像2.1里面一樣,在第一個(gè)網(wǎng)站中就返回?cái)?shù)據(jù)。這個(gè)時(shí)候數(shù)據(jù)是藏在其他的js等文件中。(這里需要一點(diǎn)前端開發(fā)的基礎(chǔ))。我們需要找到數(shù)據(jù)存在哪個(gè)鏈接中,而查找的方法很多時(shí)候是手動(dòng)以及根據(jù)經(jīng)驗(yàn)篩選,可以優(yōu)先先篩選XHR數(shù)據(jù)。如圖:

通過上面那個(gè)案例,我們篩選到百度首頁的“百度”字樣如圖:

最后編寫代碼爬取網(wǎng)頁并使用json解析(多數(shù)情況下)

1.3. 需要安裝的第三方庫

requests: 獲取網(wǎng)絡(luò)數(shù)據(jù)
lxml: 解析html等格式文件的數(shù)據(jù)

2. 代碼示例

2.1. 數(shù)據(jù)在目標(biāo)URL中

Demo1:爬取bilibili熱門信息

from lxml import etreeimport requests# 要爬取的url,注意:在開發(fā)者工具中,這個(gè)url指的是第一個(gè)urlurl = "https://www.bilibili.com/v/popular/rank/all"# 模仿瀏覽器的headersheaders = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}# get請(qǐng)求,傳入?yún)?shù),返回結(jié)果集resp = requests.get(url,headers=headers)# 將結(jié)果集的文本轉(zhuǎn)化為樹的結(jié)構(gòu)tree = etree.HTML(resp.text)# 定義列表存儲(chǔ)所有數(shù)據(jù)dli = []# 遍歷所有數(shù)據(jù)for s in range(1,101): li = [] #根據(jù)樹的路徑找到對(duì)應(yīng)的數(shù)據(jù)集 num = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[1]/text()") # 獲取熱搜排序 name = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/a/text()")# 獲取標(biāo)題 url = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/a/@href")#獲取鏈接 look = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[1]/span[1]/text()")# 獲取播放量 say = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[1]/span[2]/text()") # 獲取評(píng)論量 up = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[1]/a/span/text()") # 獲取up主 score = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[2]/div/text()") # 獲取綜合得分 #獲取數(shù)據(jù)集中的元素 li.append(num[0]) li.append(name[0]) li.append(url[0]) li.append(look[0]) li.append(say[0]) li.append(up[0]) li.append(score[0]) dli.append(li)# 打印數(shù)據(jù)for dd in dli: print(dd)

運(yùn)行結(jié)果如下:(這個(gè)案例中爬取下來的數(shù)據(jù)仍然需要進(jìn)一步清洗,這個(gè)的話可以參考python中處理字符串的replace方法)

2.2. 數(shù)據(jù)通過其他URL返回

Demo2:爬取bilibili指定用戶的主頁信息

# 導(dǎo)入requests第三方庫,導(dǎo)入報(bào)錯(cuò)則需要安裝該庫import requests# 要爬取的url,注意:在開發(fā)者工具中這個(gè)時(shí)候是要找數(shù)據(jù)對(duì)應(yīng)的url,而不是第一個(gè)urlurl = "https://api.bilibili.com/x/space/arc/search"# 模仿瀏覽器的headersheaders = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}# 需要的參數(shù)params = { "mid": 387694560, "pn": 1, "ps": 25, "index": 1, "jsonp": "jsonp"}# 調(diào)用get方法,傳入?yún)?shù),返回結(jié)果集resp = requests.get(url,headers=headers,params=params)# 將結(jié)果以轉(zhuǎn)化成js格式j(luò)s = resp.json()# 獲取js中我們需要的數(shù)據(jù)集infos = js['data']['list']['vlist']# 以下代碼為遍歷數(shù)據(jù)bli = []for info in infos: li = [] author = info['author'] bvid = info['bvid'] pic = info['pic'] title = info['title'] li.append(author) li.append(bvid) li.append(pic) li.append(title) bli.append(li)# 輸出完整數(shù)據(jù)for ll in bli: print(ll)運(yùn)行結(jié)果如下:

3. 代碼分析

3.1. 數(shù)據(jù)在目標(biāo)URL中

上述代碼中的URL,headers和xpath的匹配都是直接在開發(fā)者工具中復(fù)制。
注:xpath完整路徑的復(fù)制:首先通過開發(fā)者工具的箭頭工具將自己所需要的元素選中,在elements中右鍵該元素,復(fù)制即可。
注:對(duì)復(fù)制后的xpath完整路徑要進(jìn)一步進(jìn)行調(diào)整

  1. 想要獲取該標(biāo)簽的文本,在路徑后面加上/text()
  2. 想要獲取該元素的某個(gè)標(biāo)簽的標(biāo)簽值,在路徑后面加上/@屬性名稱
  3. 如果想要獲取多個(gè)同樣的數(shù)據(jù)(例如排名1,2…都要獲?。?,這個(gè)時(shí)候可以在xpath中拼接字符串,然后用循環(huán)將其一一遍歷出來。


3.2. 數(shù)據(jù)通過其他URL返回

這種類型的URL就不在是第一個(gè)了,而是我們找到的有數(shù)據(jù)的那個(gè)URL。其他規(guī)則基本與上一個(gè)相同。但在獲取數(shù)據(jù)這個(gè)地方,現(xiàn)在是解析js數(shù)據(jù),讀者可以自行查看一下圖片并對(duì)照上面的代碼,即可知道如何解析js數(shù)據(jù)。

3.3 小結(jié)

  1. 以上列舉的兩種方式只是用python爬蟲時(shí)遇到的最常見的,并不是說所有情況都合適
  2. 這兩個(gè)案例只是在通常情況下適用,但真正的業(yè)務(wù)往往包含處理cookie,處理防盜鏈,多線程,多進(jìn)程等等。但由于本文只針對(duì)入門級(jí)別,因此這部分并沒有納入本文。
  3. 在網(wǎng)上能看到的請(qǐng)求很多都是get和post,因此,我們針對(duì)這兩種來說,當(dāng)我們?cè)谂廊【W(wǎng)頁時(shí),應(yīng)該注意其用的是什么方法,不能搞錯(cuò),并且查看get方法是否需要params參數(shù),post方法是否需要form參數(shù)。

4. 原理解釋

實(shí)際上網(wǎng)頁中很多數(shù)據(jù)并不是都直接放到HTML中的,有些是通過js渲染的,因此,根據(jù)這兩點(diǎn)的不同,我們可以指定兩套不同的解決方案。當(dāng)數(shù)據(jù)是放在HTML中時(shí),我們采用xpath對(duì)數(shù)據(jù)進(jìn)行解析;當(dāng)數(shù)據(jù)是以js格式響應(yīng)時(shí),則直接根據(jù)層級(jí)關(guān)系獲取。

5. 項(xiàng)目地址

https://github.com/zhizhangxuezhang/CrawlerEntryCodeExample

關(guān)鍵詞:數(shù)據(jù),文教

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉