日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

结合Selenium 和 Requests完成动态数据爬取

發(fā)布時(shí)間:2024/9/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结合Selenium 和 Requests完成动态数据爬取 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Selenium
簡(jiǎn)介
Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。Selenium測(cè)試直接調(diào)用操作瀏覽器,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。這個(gè)工具的主要功能包括:測(cè)試與瀏覽器的兼容性——測(cè)試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上。測(cè)試系統(tǒng)功能——?jiǎng)?chuàng)建回歸測(cè)試檢驗(yàn)軟件功能和用戶需求。支持自動(dòng)錄制動(dòng)作和自動(dòng)生成 .Net、Java、Perl等不同語(yǔ)言的測(cè)試腳本。

簡(jiǎn)言之,Selenium提供一套API,包含了元素定位、模擬操作(點(diǎn)擊、輸入…)等功能。在運(yùn)行時(shí)會(huì)啟動(dòng)一個(gè)處于調(diào)試狀態(tài)下的瀏覽器。需要注意的是,啟動(dòng)相應(yīng)的瀏覽器需要對(duì)應(yīng)的驅(qū)動(dòng)。下載完成后可以將驅(qū)動(dòng)放置在環(huán)境變量包含的路徑中,或是在代碼中指定路徑。

# 使用項(xiàng)目的相對(duì)路徑
chrome = webdriver.WebDriver(executable_path='./Driver/chromedriver_80.exe')
1
2
安裝
以python為例:

pip install selenium
1
Requests
Requests: HTTP for Humans?

簡(jiǎn)介
Requests是一個(gè)非常好用的Python的HTTP庫(kù),通過Requests我們可以向服務(wù)器發(fā)起GET、POST等請(qǐng)求。Requests也提供了對(duì)會(huì)話的支持。

安裝
pip install requests
1
靜態(tài)頁(yè)面與動(dòng)態(tài)頁(yè)面
靜態(tài)頁(yè)面是用戶發(fā)起請(qǐng)求后,在服務(wù)器端直接生成最終頁(yè)面,并發(fā)送回客戶端,客戶端直接進(jìn)行加載渲染即可。
動(dòng)態(tài)頁(yè)面往往在用戶發(fā)起請(qǐng)求后,服務(wù)器僅僅返回?cái)?shù)據(jù)部分,客戶端接收到數(shù)據(jù)后,再將數(shù)據(jù)填充進(jìn)頁(yè)面中,進(jìn)行渲染。

動(dòng)態(tài)頁(yè)面占用服務(wù)器資源少,以一個(gè)搜索任務(wù)為例,服務(wù)器僅僅是完成一個(gè)數(shù)據(jù)庫(kù)查詢后,將數(shù)據(jù)以特定格式返回給客戶端;靜態(tài)頁(yè)面則要求服務(wù)器完成查詢后,還需要將整個(gè)頁(yè)面“拼接”出來,再發(fā)送返回給客戶端。

靜態(tài)頁(yè)面的爬蟲相對(duì)容易完成,因?yàn)樗械脑囟寄茉贖TML源碼中找到,我們使用相應(yīng)的工具便可以快速定位元素路徑,進(jìn)行數(shù)據(jù)爬取,也就是說,對(duì)于靜態(tài)頁(yè)面,我們拿到頁(yè)面便拿到了數(shù)據(jù)。靜態(tài)頁(yè)面可以直接通過Requests庫(kù)來訪問鏈接進(jìn)行獲取。

動(dòng)態(tài)頁(yè)面在頁(yè)面解析時(shí)相對(duì)復(fù)雜麻煩一點(diǎn),因?yàn)槲覀儚臑g覽器看見的是通過js渲染完成后的界面,頁(yè)面源碼并不是最終產(chǎn)物,在進(jìn)行元素定位時(shí),因?yàn)轫?yè)面的動(dòng)態(tài)性,頁(yè)面源碼是隨著用戶操作而發(fā)生改變的,所以盲目使用元素定位往往結(jié)果難以令人滿意,而且容易丟失元素。如果直接通過Requests庫(kù)進(jìn)行獲取,獲取到的頁(yè)面僅僅是一個(gè)框架,是js還沒有執(zhí)行過的頁(yè)面。

動(dòng)態(tài)頁(yè)面爬取的兩種思路
既然我們直接進(jìn)行獲取的頁(yè)面是沒有執(zhí)行js進(jìn)行渲染過的界面,那么我們可以嘗試先對(duì)其調(diào)用js渲染,再獲取其頁(yè)面。(想方法獲取到最終頁(yè)面)
模擬瀏覽器,直接向服務(wù)器發(fā)起請(qǐng)求,獲取服務(wù)器返回?cái)?shù)據(jù)。(直接收集數(shù)據(jù))
這里著重講解第二種方法。

如何模擬瀏覽器
構(gòu)造請(qǐng)求
請(qǐng)求是什么
我們發(fā)起的每一個(gè)請(qǐng)求,都攜帶了額外的信息,當(dāng)我們想方設(shè)法將這些信息都通過代碼加入到我們的請(qǐng)求中時(shí),我們就完美模擬了瀏覽器。這些信息組成了請(qǐng)求頭和請(qǐng)求體。請(qǐng)求頭,用來說明服務(wù)器要使用的附加信息,請(qǐng)求體一般承載的內(nèi)容是 POST 請(qǐng)求中的表單數(shù)據(jù)(Payload),而對(duì)于 GET 請(qǐng)求,請(qǐng)求體則為空。

請(qǐng)求頭中常見的信息有Cookie、Referer、User-Agent等。

User-Agent
簡(jiǎn)稱 UA,它是一個(gè)特殊的字符串頭,可以使服務(wù)器識(shí)別客戶使用的操作系統(tǒng)及版本、瀏覽器及版本等信息。在做爬蟲時(shí)加上此信息,可以偽裝為瀏覽器;如果不加,很可能會(huì)被識(shí)別出為爬蟲。

Cookie
也常用復(fù)數(shù)形式 Cookies,這是網(wǎng)站為了辨別用戶進(jìn)行會(huì)話跟蹤而存儲(chǔ)在用戶本地的數(shù)據(jù)。它的主要功能是維持當(dāng)前訪問會(huì)話。例如,我們輸入用戶名和密碼成功登錄某個(gè)網(wǎng)站后,服務(wù)器會(huì)用會(huì)話保存登錄狀態(tài)信息,后面我們每次刷新或請(qǐng)求該站點(diǎn)的其他頁(yè)面時(shí),會(huì)發(fā)現(xiàn)都是登錄狀態(tài),這就是 Cookies 的功勞。Cookies 里有信息標(biāo)識(shí)了我們所對(duì)應(yīng)的服務(wù)器的會(huì)話,每次瀏覽器在請(qǐng)求該站點(diǎn)的頁(yè)面時(shí),都會(huì)在請(qǐng)求頭中加上 Cookies 并將其發(fā)送給服務(wù)器,服務(wù)器通過 Cookies 識(shí)別出是我們自己,并且查出當(dāng)前狀態(tài)是登錄狀態(tài),所以返回結(jié)果就是登錄之后才能看到的網(wǎng)頁(yè)內(nèi)容。

Cookie好比是游樂園里蓋在手背上的章,有了這個(gè)章才可以進(jìn)去玩。每一次進(jìn)出的時(shí)候,只需要給管理員看一下你的章,管理員就知道你是買過票的,就不需要再一次購(gòu)買。

Referer
此內(nèi)容用來標(biāo)識(shí)這個(gè)請(qǐng)求是從哪個(gè)頁(yè)面發(fā)過來的,服務(wù)器可以拿到這一信息并做相應(yīng)的處理,如做來源統(tǒng)計(jì)、防盜鏈處理等。

Payload
Payload是表單數(shù)據(jù),可能是我們搜索的關(guān)鍵字,也可能包含我們的篩選條件。

如何構(gòu)造請(qǐng)求
幸運(yùn)的是,Requests庫(kù)本身已經(jīng)為我們提供了構(gòu)造請(qǐng)求的方法,我們只需要拿到數(shù)據(jù)并填充即可。

Cookies
Cookies在需要登錄的情況下有用,當(dāng)我們通過Selenium打開網(wǎng)址完成登錄后,可以通過Selenium獲取到Cookies,以下代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的示例。

# 實(shí)例化一個(gè)瀏覽器
chrome = webdriver.WebDriver(executable_path='Driver/chromedriver_80.exe', options=option)

# 打開一個(gè)網(wǎng)頁(yè),以bilibili登錄頁(yè)面為例
# 在瀏覽器中輸入賬號(hào)與密碼,當(dāng)然也可以通過代碼實(shí)現(xiàn)查找對(duì)應(yīng)輸入框輸入文本
chrome.get("https://passport.bilibili.com/login")

# 構(gòu)造“會(huì)話”
sess = requests.Session()
# 獲取cookies
cookies = chrome.get_cookies()
# 填充
for cookie in cookies:
?? ?sess.cookies.set(cookie['name'], cookie['value'])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
請(qǐng)求其余信息
獲取請(qǐng)求內(nèi)容最準(zhǔn)確的方法是直接從瀏覽器的開發(fā)者工具中進(jìn)行拷貝。可以先通過瀏覽器進(jìn)行一次手動(dòng)請(qǐng)求,即可從瀏覽器的開發(fā)者工具中看見請(qǐng)求的詳細(xì)信息。

首先打開開發(fā)者工具,以Chrome為例,快捷鍵Ctrl + Shift + I即可。
設(shè)置過濾器為XHR。
點(diǎn)擊按鈕(查詢、提交等,即你發(fā)起請(qǐng)求需要點(diǎn)擊的那個(gè)按鈕)。
在開發(fā)者工具下面出現(xiàn)的響應(yīng)中找到你需要的那一條記錄。
復(fù)制信息到代碼中。
瀏覽器訪問的url和請(qǐng)求方法。

請(qǐng)求頭
請(qǐng)求體
下面展示一個(gè)較為完整的代碼。
import requests
import json?
from selenium.webdriver.chrome import webdriver

# 實(shí)例化一個(gè)瀏覽器
chrome = webdriver.WebDriver(executable_path='Driver/chromedriver_80.exe', options=option)

# 打開一個(gè)網(wǎng)頁(yè),以bilibili登錄頁(yè)面為例
# 在瀏覽器中輸入賬號(hào)與密碼,當(dāng)然也可以通過代碼實(shí)現(xiàn)查找對(duì)應(yīng)輸入框輸入文本
chrome.get("https://passport.bilibili.com/login")

# 構(gòu)造“會(huì)話”
sess = requests.Session()

sess.headers.clear()
# 依照實(shí)際情況一一復(fù)制
# 此處略有省略
sess.headers.setdefault('Accept', 'application/json, text/javascript, */*; q=0.01')
sess.headers.setdefault('Accept-Encoding', 'gzip, deflate, br')
sess.headers.setdefault('Accept-Language', 'en-US,en;q=0.9,zh-CN;q=0.8,zh-TW;q=0.7,zh;q=0.6')
sess.headers.setdefault('Content-Length', '3293')
sess.headers.setdefault('Content-Type', 'application/json')
sess.headers.setdefault('Origin', 'https://www.bilibili.com')
sess.headers.setdefault('Referer', 'https://www.bilibili.com/v/douga/?spm_id_from=333.5.b_70______________________56c4d656e75.1')
sess.headers.setdefault('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36')


# 獲取cookies
cookies = chrome.get_cookies()
# 填充cookies
for cookie in cookies:
?? ?sess.cookies.set(cookie['name'], cookie['value'])

# 直接將瀏覽器開發(fā)者工具中顯示的Requests Payload復(fù)制下來,然后包成一個(gè)字符串
payload = '{"uploads":[{"src_id":154,"ad_server":"bilibili","is_ad":1,"area":1,"ad_cb":"CPraDRCfuk4Y3tjgHyCPBygBMPIyOJoBQh8SNS0mLWjLlIG57u16ZizWgblm5vlt51iBuS4luZWQscGxheXBhZ2VjdHI6ZW5hYmxlX25vX2VjcG1fdGhyZXNob2xkLG5vX2FkX2Zsb3dfY29udHJvbDp1bmRlZmluZWQsYnJ1c2h……'

url = 'https://cm.bilibili.com/cm/api/fees/pc'
response = sess.post(url, data=payload)
json_data = response.text
json_data = json.loads(json_data)
————————————————
版權(quán)聲明:本文為CSDN博主「程序猿D」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/JunhuanPeng/article/details/105903626

總結(jié)

以上是生活随笔為你收集整理的结合Selenium 和 Requests完成动态数据爬取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。