python selenium爬取百度文庫

  1. 電腦版的網頁源碼中沒有文庫的內容,該方法適用於手機版的百度文庫

  2. 文檔的內容有多頁時需要點擊繼續閱讀和加載更多按鈕

在對這兩個標籤進行定位時,開始參考了這位博主寫的方法,由於文庫的網頁源碼更改故失敗了。

後來受這位博主啓發鏈接完成了‘繼續閱讀’的點擊,但是這種方式用到‘點擊加載更多’時又出現了標籤覆蓋的情況。具體見代碼。

# -*- 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)

代碼還有許多待完善的地方,例如對異常的處理,下載後文檔格式的調整等,以後還會完善。有什麼不妥的地方歡迎大家批評指正!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章