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

前提是需要自行搜索教程安裝:
chromeDriver
selenium 庫
想要使用下面代碼的可以直接修改 driver.get() 里的地址,然后爬取結果最侄訓存在message.txt檔案中
代碼如下:
from selenium import webdriver # 從selenium匯入webdriver
from selenium.webdriver.common.by import By # 內置定位器策略集
from selenium.webdriver.support.wait import WebDriverWait # 用于實體化一個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 這個引數設定之后可以隱藏瀏覽器
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)"""
# 這個暫停一下是因為要等待頁面將下面的內容加載出,這個 1500 可以根據自己的網路快慢進行適當的調節
# 這里需要往上移動一下,因為不往上移動一下發現不會加載,
driver.execute_script(js)
# selenium 可以獲取 瀏覽器中 js 的變數,呼叫的js return
def getHeight(nice):
# 這里獲取 js 中的 checkBottom 變數,作為到底部時進行停止,
js = """
return window.checkBottom;
"""
return driver.execute_script(js)
try:
# 先觸發登陸彈窗,
WebDriverWait(driver, 40, 1).until(EC.presence_of_all_elements_located(
(By.CLASS_NAME, 'Modal-backdrop')), waitFun())
# 點擊空白關閉登陸視窗
ActionChains(driver).move_by_offset(200, 100).click().perform()
# 當滾動到底部時
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 檔案內')
finally:
driver.close() #close the driver
這套代碼實作了打開知乎,然后自動向下滑動,當彈出登陸框時,自動點擊左上角關閉登陸框,然后繼續向下滑動,加載頁面,直到滑動到底部,然后將內容寫在 message.txt 檔案里面,
selenium 功能非常強大, 可以模擬人為在瀏覽器的操作,進行輸入、點擊、滑動、播放、暫停等等操作,因此也可以用來寫一些腳本,用來刷學時,搶課等等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/194085.html
標籤:其他
上一篇:MySQL 之 表的修改
