(注意:這僅僅是做為練習,爬取這個網站沒有必要使用 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 個視窗
按鈕點選無效
描述:能找到按鈕的元素,點選無效
解決方法:
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")))