python使用selenium爬蟲知乎的方法示例
說起爬蟲一般想到的情況是,使用 python 中都通過 requests 庫獲取網(wǎng)頁內(nèi)容,然后通過 beautifulSoup 進(jìn)行篩選文檔中的標(biāo)簽和內(nèi)容。但是這樣有個(gè)問題就是,容易被反扒機(jī)制所攔住。
反扒機(jī)制有很多種,例如知乎:剛開始只加載幾個(gè)問題,當(dāng)你往下滾動(dòng)時(shí)才會(huì)繼續(xù)往下面加載,而且在往下滾動(dòng)一段距離時(shí)就會(huì)出來一個(gè)登陸的彈框。
這樣的機(jī)制對(duì)于通過獲取服務(wù)器返回內(nèi)容的爬蟲方式進(jìn)行了限制,我們只能獲得前幾個(gè)回答,而沒辦法或許后面的回答。
所以需要使用 selenium 模擬真實(shí)瀏覽器進(jìn)行操作。
最終實(shí)現(xiàn)效果如下:

前提是需要自行搜索教程安裝:
- chromeDriver
- selenium 庫
想要使用下面代碼的可以直接修改 driver.get() 里的地址,然后爬取結(jié)果最終會(huì)存在message.txt文件中
代碼如下:
from selenium import webdriver # 從selenium導(dǎo)入webdriver
from selenium.webdriver.common.by import By # 內(nèi)置定位器策略集
from selenium.webdriver.support.wait import WebDriverWait # 用于實(shí)例化一個(gè)Driver的顯式等待
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
option = webdriver.ChromeOptions()
option.add_argument("headless")
driver = webdriver.Chrome() # chrome_options=option 這個(gè)參數(shù)設(shè)置之后可以隱藏瀏覽器
driver.get('https://www.zhihu.com/question/22110581') #修改這里的地址
file = open("./messages.txt", "w")
def waitFun():
js = """
let equalNum = 0;
window.checkBottom = false;
window.height = 0;
window.intervalId = setInterval(()=>{
let currentHeight = document.body.scrollHeight;
if(currentHeight === window.height){
equalNum++;
if(equalNum === 2){
clearInterval(window.intervalId);
window.checkBottom = true;
}
}else{
window.height = currentHeight;
window.scrollTo(0,window.height);
window.scrollTo(0,window.height-1000);
}
},1500)"""
# 這個(gè)暫停一下是因?yàn)橐却撁鎸⑾旅娴膬?nèi)容加載出,這個(gè) 1500 可以根據(jù)自己的網(wǎng)絡(luò)快慢進(jìn)行適當(dāng)?shù)恼{(diào)節(jié)
# 這里需要往上移動(dòng)一下,因?yàn)椴煌弦苿?dòng)一下發(fā)現(xiàn)不會(huì)加載。
driver.execute_script(js)
# selenium 可以獲取 瀏覽器中 js 的變量。調(diào)用的js return
def getHeight(nice):
# 這里獲取 js 中的 checkBottom 變量,作為到底部時(shí)進(jìn)行停止。
js = """
return window.checkBottom;
"""
return driver.execute_script(js)
try:
# 先觸發(fā)登陸彈窗。
WebDriverWait(driver, 40, 1).until(EC.presence_of_all_elements_located(
(By.CLASS_NAME, 'Modal-backdrop')), waitFun())
# 點(diǎn)擊空白關(guān)閉登陸窗口
ActionChains(driver).move_by_offset(200, 100).click().perform()
# 當(dāng)滾動(dòng)到底部時(shí)
WebDriverWait(driver, 40, 3).until(getHeight, waitFun())
# 獲取回答
answerElementArr = driver.find_elements_by_css_selector('.RichContent-inner')
for answer in answerElementArr:
file.write('==================================================================================')
file.write('\n')
file.write(answer.text)
file.write('\n')
print('爬取成功 '+ str(len(answerElementArr)) +' 條,存入到 message.txt 文件內(nèi)')
finally:
driver.close() #close the driver
這套代碼實(shí)現(xiàn)了打開知乎,然后自動(dòng)向下滑動(dòng),當(dāng)彈出登陸框時(shí),自動(dòng)點(diǎn)擊左上角關(guān)閉登陸框。然后繼續(xù)向下滑動(dòng),加載頁面,直到滑動(dòng)到底部。然后將內(nèi)容寫在 message.txt 文件里面。
selenium 功能非常強(qiáng)大, 可以模擬人為在瀏覽器的操作,進(jìn)行輸入、點(diǎn)擊、滑動(dòng)、播放、暫停等等操作,因此也可以用來寫一些腳本,用來刷學(xué)時(shí),搶課等等。
到此這篇關(guān)于python使用selenium爬蟲知乎的方法示例的文章就介紹到這了,更多相關(guān)python selenium爬蟲知乎內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)美化版端口進(jìn)程管理工具
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)一個(gè)美化版的端口進(jìn)程管理工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-03-03
在Apache服務(wù)器上同時(shí)運(yùn)行多個(gè)Django程序的方法
這篇文章主要介紹了在Apache服務(wù)器上同時(shí)運(yùn)行多個(gè)Django程序的方法,Django是Python各色高人氣web框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07
攻擊者是如何將PHP Phar包偽裝成圖像以繞過文件類型檢測(cè)的(推薦)
這篇文章主要介紹了攻擊者是如何將PHP Phar包偽裝成圖像以繞過文件類型檢測(cè)的,需要的朋友可以參考下2018-10-10
JavaScript實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組
下面小編就為大家分享一篇JavaScript實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
一文了解python 3 字符串格式化 F-string 用法
本文介紹在python 3 編程中,如何進(jìn)行字符串格式化。介紹了F-string的用法,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-03-03
Python實(shí)現(xiàn)智慧校園自動(dòng)評(píng)教全新版
上一次的智慧校園自動(dòng)評(píng)教是用的selenium庫去模擬人去對(duì)瀏覽器進(jìn)行點(diǎn)擊操作,雖然比手動(dòng)評(píng)教要快,但是效率還是不高.從而想去嘗試重新寫一份不用selenium的評(píng)教方案,功夫不負(fù)有心人,最終成功了,需要的朋友可以參考下2021-06-06
Python基礎(chǔ)教程之錯(cuò)誤和異常的處理方法
程序在運(yùn)行時(shí),如果python解釋器遇到一個(gè)錯(cuò)誤,會(huì)停止程序的執(zhí)行,并且提示一些錯(cuò)誤信息,這就是異常,下面這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之錯(cuò)誤和異常的處理方法,需要的朋友可以參考下2022-05-05
淺談哪個(gè)Python庫才最適合做數(shù)據(jù)可視化
數(shù)據(jù)可視化是任何探索性數(shù)據(jù)分析或報(bào)告的關(guān)鍵步驟,目前有許多非常好的商業(yè)智能工具,比如Tableau、googledatastudio和PowerBI等,本文就詳細(xì)的進(jìn)行對(duì)比,感興趣的可以了解一下2021-06-06

