溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python使用selenium實現(xiàn)爬蟲知乎

發(fā)布時間:2020-10-29 14:58:42 來源:億速云 閱讀:282 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了python使用selenium實現(xiàn)爬蟲知乎,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

說起爬蟲一般想到的情況是,使用 python 中都通過 requests 庫獲取網(wǎng)頁內(nèi)容,然后通過 beautifulSoup 進行篩選文檔中的標簽和內(nèi)容。但是這樣有個問題就是,容易被反扒機制所攔住。

反扒機制有很多種,例如知乎:剛開始只加載幾個問題,當你往下滾動時才會繼續(xù)往下面加載,而且在往下滾動一段距離時就會出來一個登陸的彈框。

這樣的機制對于通過獲取服務(wù)器返回內(nèi)容的爬蟲方式進行了限制,我們只能獲得前幾個回答,而沒辦法或許后面的回答。

所以需要使用 selenium 模擬真實瀏覽器進行操作。

最終實現(xiàn)效果如下:

python使用selenium實現(xiàn)爬蟲知乎

前提是需要自行搜索教程安裝:

  • chromeDriver
  • selenium 庫

想要使用下面代碼的可以直接修改 driver.get() 里的地址,然后爬取結(jié)果最終會存在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 # 用于實例化一個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 這個參數(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)"""
  # 這個暫停一下是因為要等待頁面將下面的內(nèi)容加載出,這個 1500 可以根據(jù)自己的網(wǎng)絡(luò)快慢進行適當?shù)恼{(diào)節(jié)
  # 這里需要往上移動一下,因為不往上移動一下發(fā)現(xiàn)不會加載。
  driver.execute_script(js)

# selenium 可以獲取 瀏覽器中 js 的變量。調(diào)用的js return
def getHeight(nice):
  # 這里獲取 js 中的 checkBottom 變量,作為到底部時進行停止。
  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())

  # 點擊空白關(guān)閉登陸窗口
  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 文件內(nèi)')
finally:
  driver.close()  #close the driver

這套代碼實現(xiàn)了打開知乎,然后自動向下滑動,當彈出登陸框時,自動點擊左上角關(guān)閉登陸框。然后繼續(xù)向下滑動,加載頁面,直到滑動到底部。然后將內(nèi)容寫在 message.txt 文件里面。

selenium 功能非常強大, 可以模擬人為在瀏覽器的操作,進行輸入、點擊、滑動、播放、暫停等等操作,因此也可以用來寫一些腳本,用來刷學(xué)時,搶課等等。

上述內(nèi)容就是python使用selenium實現(xiàn)爬蟲知乎,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI