selenium練習——爬取縱橫中文網

2020-10-29 10:00:28

任務

  1. 使用 selenium 爬取縱橫小說網任意 1 本小說
  2. 熟悉 selenium 的使用方法

(注意:這僅僅是做為練習,爬取這個網站沒有必要使用 selenium)

相關連結

使用 requests 爬取縱橫中文網
使用 scrapy 爬取縱橫中文網

程式碼實現

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
# from selenium.webdriver.common.by import By
# from selenium.webdriver.support import expected_conditions as EC
import os
import time


def switch_pages(n):
    # 切換到第 n 個頁面
    num = driver.window_handles
    driver.switch_to.window(num[n])     

def write_file(file,title,content):
    # 把標題和內容寫入檔案
    with open(file,'w',encoding='utf-8') as f:
        f.write('\t\t\t\t'+title+'\n\n')
        f.write(content) 

def content_processing(content):
    # 內容處理
    string = ""
    for c in content:
        string = string + c.text + '\n\n'
    return string


with webdriver.Chrome() as driver:
    driver.implicitly_wait(10)						# 隱式等待
    #wait = WebDriverWait(driver, 10)              
    driver.get("http://betawww.zongheng.com/")
    book = driver.find_element_by_xpath('//div[@class="bookname"]/a')       
    if os.path.exists(book.text):                   # 建立資料夾
        pass
    else:
        os.mkdir(book.text)
    novel_name = book.text
    print(novel_name)
    book.click()                # 點選第 1 本書


    switch_pages(1)             # 切換到第 2 個頁面

    driver.execute_script('document.querySelector(".all-catalog").click();')     # 點選全部目錄

    switch_pages(2)             # 切換到第 3 個頁面
    chapter = driver.find_element_by_xpath('//li[@class=" col-4"]/a').click()    # 點選第 1 個章節

    switch_pages(3)             # 切換到第 4 個頁面

    while True:
        title = driver.find_element_by_class_name("title_txtbox").text
        content = content_processing(driver.find_elements_by_xpath('//div[@class="content"]/p'))
                                                
        print(title,content)       
        
        write_file(novel_name+'\\'+title+'.txt',title,content)                    # 寫入檔案
        next_chapter = driver.find_element_by_class_name("nextchapter").click()   # 點選下一章節
        time.sleep(2)
        # 如果是最後 1 章,則結束
        end = driver.find_elements_by_tag_name("h4")
        for e in end:
            if e.text == "您已經讀完最新一章":
                break 

完成效果

在這裡插入圖片描述

常見問題

  • selenium獲取不到元素
    描述:selenium 開啟了另外的頁面,一直提示獲取不到元素

    解決方法:切換到新的控制程式碼

    num = driver.window_handles
    driver.switch_to.window(num[1])   # num[1] 為第 2 個視窗
    
  • 按鈕點選無效
    描述:能找到按鈕的元素,點選無效

    解決方法:

    • 使用按鍵來代替(如果能)
    • 使用 javascript
      driver.execute_script('document.querySelector(".all-catalog").click();')
      
  • Message: stale element reference: element is not attached to the page
    document
    原因:這樣的錯誤是說我已經點選了翻頁,但是還沒有完成翻頁,於是又爬了一次當前頁,然後再要執行翻頁時頁面已經重新整理了,前面找到的翻頁元素已經過期了,無法執行點選。

    解決方法:

    • 設定延遲

      time.sleep(2)
      
    • 顯示等待

      wait = WebDriverWait(browser,10)
      wait.until(EC.presence_of_element_located((By.XPATH,"//div[@class='bookreadercontent']/p")))