-
參考博客
- selenium官方教程
-
注意事項
-
電腦版的網頁源碼中沒有文庫的內容,該方法適用於手機版的百度文庫
- 文檔的內容有多頁時需要點擊繼續閱讀和加載更多按鈕
在對這兩個標籤進行定位時,開始參考了這位博主寫的方法,由於文庫的網頁源碼更改故失敗了。
後來受這位博主啓發鏈接完成了‘繼續閱讀’的點擊,但是這種方式用到‘點擊加載更多’時又出現了標籤覆蓋的情況。具體見代碼。
# -*- coding:UTF-8 -*-
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 打開網頁
def connect():
options = webdriver.ChromeOptions()
options.add_argument(
'user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, '
'like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')
driver = webdriver.Chrome(executable_path='D:\chromedriver_win32\chromedriver.exe', chrome_options=options)
driver.get('https://wenku.baidu.com/view/aa31a84bcf84b9d528ea7a2c.html')
return driver
# 定位並點擊"繼續閱讀"和"點擊加載更多"
def locate(driver):
wait = WebDriverWait(driver, 10)
target = wait.until(EC.presence_of_element_located((
By.XPATH, '//*[@class="foldpagewg-root"]'
))) # 繼續閱讀按鈕所在區域
driver.execute_script("arguments[0].scrollIntoView();", target) # 滑動滾動條到按鈕所在位置
Butt = wait.until(EC.presence_of_element_located((
By.XPATH, '//*[@class="foldpagewg-root"]/div/div/div'
)))
Butt.click() # 點擊繼續閱讀
time.sleep(1)
htmlplus = driver.page_source # 得到網頁源碼
return htmlplus
# 判斷之後是否還有內容,內容關鍵字爲"點擊加載更多"
def juge(driver):
print(driver)
'''
#嘗試使用locate(driver)相同的方式失敗(失敗原因標籤被覆蓋)
wait = WebDriverWait(driver, 10)
target = wait.until(EC.presence_of_element_located((
By.XPATH, '//*[@class="pagerwg-root"]'
))) # 繼續閱讀按鈕所在區域
driver.execute_script("arguments[0].scrollIntoView();", target) # 滑動滾動條到按鈕所在位置
Butt = wait.until(EC.presence_of_element_located((
By.XPATH, '//*[@class="pagerwg-root"]'
)))
Butt.click() # 點擊加載更多
time.sleep(1)
'''
element = driver.find_element_by_xpath("//div[@class='pagerwg-button']")
# element = driver.find_element_by_css('div[class*="pagerwg-button"]')
driver.execute_script("arguments[0].click();", element)
htmlplus2 = driver.page_source # 得到網頁源碼
return htmlplus2
# 解析最終獲得的html文檔
def analysis(html):
#encoding="utf-8"防止遇到\xa0無法寫入
f = open('baidu.txt', 'w',encoding="utf-8")
bf1 = BeautifulSoup(html, 'lxml')
result = bf1.find_all(class_='rtcspage')
for each_result in result:
bf2 = BeautifulSoup(str(each_result), 'lxml')
texts = bf2.find_all('p')
for each_text in texts:
main_body = BeautifulSoup(str(each_text), 'lxml')
for each in main_body.find_all(True):
if each.name == 'br' or each.string == None:
print("")
else:
f.write(each.string)
print(each.string)
print('\n')
f.close()
if __name__ == '__main__':
driver = connect()
html = locate(driver)
htmlplus = juge(driver)
analysis(htmlplus)
代碼還有許多待完善的地方,例如對異常的處理,下載後文檔格式的調整等,以後還會完善。有什麼不妥的地方歡迎大家批評指正!!