PS:這里關于開發(fā)者工具的操作不多展開。
1.2.2. 簡單思路
很多時候我們會發(fā)現(xiàn)爬蟲有時候并不是那么順利,有時候需要加入很多細節(jié),但整體思路都不會離開這三個步驟。顯然這遠遠不夠,因此需要更加詳細的步驟
1.2.3. 詳細思路
打開一個具體的網(wǎng)頁查看網(wǎng)頁的源代碼并查找(CTRL+F)自己所要找的數(shù)據(jù)是否在網(wǎng)頁中。
2.1. 如果有,這時候打開開發(fā)者模式,點擊,刷新。這個時候你會發(fā)現(xiàn)你所需要的數(shù)據(jù)剛好在第一個網(wǎng)址返回。如下
最后編寫代碼爬取網(wǎng)頁并使用xpath解析
2.2. 如果沒有,這時候需要打開開發(fā)者模式,點擊,刷新。這個時候你會發(fā)現(xiàn)并不能像2.1里面一樣,在第一個網(wǎng)站中就返回數(shù)據(jù)。這個時候數(shù)據(jù)是藏在其他的js等文件中。(這里需要一點前端開發(fā)的基礎)。我們需要找到數(shù)據(jù)存在哪個鏈接中,而查找的方法很多時候是手動以及根據(jù)經(jīng)驗篩選,可以優(yōu)先先篩選XHR數(shù)據(jù)。如圖:
通過上面那個案例,我們篩選到百度首頁的“百度”字樣如圖:
最后編寫代碼爬取網(wǎng)頁并使用json解析(多數(shù)情況下)
1.3. 需要安裝的第三方庫
: 獲取網(wǎng)絡數(shù)據(jù)
lxml:解析html等格式文件的數(shù)據(jù)2. 代碼示例2.1. 數(shù)據(jù)在目標URL中
Demo1:爬取熱門信息
from lxml import etree
import requests

# 要爬取的url,注意:在開發(fā)者工具中,這個url指的是第一個url
url = "https://www.bilibili.com/v/popular/rank/all"
# 模仿瀏覽器的headers
headers = {
"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請求,傳入?yún)?shù),返回結果集
resp = requests.get(url,headers=headers)
# 將結果集的文本轉化為樹的結構
tree = etree.HTML(resp.text)
# 定義列表存儲所有數(shù)據(jù)
dli = []
# 遍歷所有數(shù)據(jù)
for s in range(1,101):
li = []
#根據(jù)樹的路徑找到對應的數(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()")# 獲取標題
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()") # 獲取評論量
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)
運行結果如下:(這個案例中爬取下來的數(shù)據(jù)仍然需要進一步清洗,這個的話可以參考中處理字符串的方法)
2.2. 數(shù)據(jù)通過其他URL返回
Demo2:爬取指定用戶的主頁信息
# 導入requests第三方庫,導入報錯則需要安裝該庫
import requests
# 要爬取的url,注意:在開發(fā)者工具中這個時候是要找數(shù)據(jù)對應的url,而不是第一個url
url = "https://api.bilibili.com/x/space/arc/search"
# 模仿瀏覽器的headers
headers = {
"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"
}

# 調用get方法,傳入?yún)?shù),返回結果集
resp = requests.get(url,headers=headers,params=params)
# 將結果以轉化成js格式
js = 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)
運行結果如下:
3. 代碼分析3.1. 數(shù)據(jù)在目標URL中
上述代碼中的URL,和xpath的匹配都是直接在開發(fā)者工具中復制。
注:xpath完整路徑的復制:首先通過開發(fā)者工具的箭頭工具將自己所需要的元素選中,在中右鍵該元素網(wǎng)頁數(shù)據(jù)爬取工具網(wǎng)頁數(shù)據(jù)爬取工具,復制即可。
注:對復制后的xpath完整路徑要進一步進行調整
想要獲取該標簽的文本,在路徑后面加上/text()想要獲取該元素的某個標簽的標簽值,在路徑后面加上/@屬性名稱如果想要獲取多個同樣的數(shù)據(jù)(例如排名1,2…都要獲取),這個時候可以在xpath中拼接字符串,然后用循環(huán)將其一一遍歷出來。
3.2. 數(shù)據(jù)通過其他URL返回
這種類型的URL就不在是第一個了,而是我們找到的有數(shù)據(jù)的那個URL。其他規(guī)則基本與上一個相同。但在獲取數(shù)據(jù)這個地方,現(xiàn)在是解析js數(shù)據(jù),讀者可以自行查看一下圖片并對照上面的代碼,即可知道如何解析js數(shù)據(jù)。
3.3 小結以上列舉的兩種方式只是用爬蟲時遇到的最常見的,并不是說所有情況都合適這兩個案例只是在通常情況下適用,但真正的業(yè)務往往包含處理,處理防盜鏈,多線程,多進程等等。但由于本文只針對入門級別,因此這部分并沒有納入本文。在網(wǎng)上能看到的請求很多都是get和post,因此,我們針對這兩種來說,當我們在爬取網(wǎng)頁時,應該注意其用的是什么方法,不能搞錯,并且查看get方法是否需要參數(shù),post方法是否需要form參數(shù)。4. 原理解釋
實際上網(wǎng)頁中很多數(shù)據(jù)并不是都直接放到HTML中的,有些是通過js渲染的,因此,根據(jù)這兩點的不同,我們可以指定兩套不同的解決方案。當數(shù)據(jù)是放在HTML中時,我們采用xpath對數(shù)據(jù)進行解析;當數(shù)據(jù)是以js格式響應時,則直接根據(jù)層級關系獲取。
5. 項目地址
//ple