Datawhale-爬蟲-Task7(實戰大專案)

TNTZS666發表於2019-03-07

實戰大專案

模擬登入丁香園,並抓取論壇所有的人員的基本資訊與回覆帖子的內容。
丁香園論壇:論壇登入連結

  • 首先使用Selenium模擬登入丁香園論壇。這裡模擬點選登入後若要使用賬號密碼登入還需要模擬點選返回電腦登入
    在這裡插入圖片描述
    登入程式碼如下:
def login_zhihu(browser):
    try:
        #點選登入
        browser.find_element_by_xpath('//div[@class="nav_account"]/a[1]').click()
        #點選返回電腦登入
        browser.find_element_by_xpath('//div[@class="login__tab_wp"]/a[2]/i').click()
        elem = browser.find_element_by_name("username")
        elem.clear()  # 清空
        elem.send_keys("*******")  # 自動填值

        #獲取登入密碼
        elem = browser.find_element_by_name("password")
        elem.clear()
        elem.send_keys("****")

        print("開始登陸...")
        browser.find_element_by_xpath("//button").click() #點選登入按鈕登入

    except TimeoutException:
        print("Time Out")
    except NoSuchElementException:
        print("No Element")
  • 獲取登陸後的論壇資訊,這邊我使用CSS選擇器爬取相應的資訊,很方便,但是爬取後暫時不知道該怎麼將論壇發言人和他們的發帖內容對應輸出,所以暫時先分開寫了

爬取資訊程式碼:

def get_information(browser):
    print("登入成功")
    time.sleep(10)
    print("開始獲取資訊。。。")
    elems = browser.find_elements_by_css_selector(".auth")  #發帖人姓名
#     conts = browser.find_elements_by_css_selector(".con")  發帖的資訊
    for elem in elems:
        auth = elem.find_element_by_tag_name("a")
        print(auth.text)
#     for con in conts:
#         content = con.find_element_by_tag_name("td")
#         print(content.text)
  • 今天在學習的時候還學到了如何載入動態頁面,即使用Selenium讓進度條自動下拉到最底部實現JS的載入,程式碼如下:
 def scroll_load(browser):
     #利用 execute_script() 方法將進度條下拉到最底部
     browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
     browser.implicitly_wait(2)  # 隱式等待

作業完整程式碼:

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException

# 宣告瀏覽器物件
browser = webdriver.Chrome()
browser.get("http://www.dxy.cn/bbs/thread/626626#626626")

def login_zhihu(browser):
    try:
        #點選登入
        browser.find_element_by_xpath('//div[@class="nav_account"]/a[1]').click()
        #點選返回電腦登入
        browser.find_element_by_xpath('//div[@class="login__tab_wp"]/a[2]/i').click()
        elem = browser.find_element_by_name("username")
        elem.clear()  # 清空
        elem.send_keys("*****")  # 填入你的賬號
        #獲取登入密碼
        elem = browser.find_element_by_name("password")
        elem.clear()
        elem.send_keys("********") #填上你的密碼

        print("開始登陸...")
        browser.find_element_by_xpath("//button").click() #點選登入按鈕登入

    except TimeoutException:
        print("Time Out")
    except NoSuchElementException:
        print("No Element")
        

def get_information(browser):
    print("登入成功")
    time.sleep(10)
    print("開始獲取資訊。。。")
    elems = browser.find_elements_by_css_selector(".auth")  #發帖人姓名
#     conts = browser.find_elements_by_css_selector(".con")  發帖的資訊
    for elem in elems:
        auth = elem.find_element_by_tag_name("a")
        print(auth.text)
#     for con in conts:
#         content = con.find_element_by_tag_name("td")
#         print(content.text)
            
# 滾動載入
# def scroll_load(browser):
#     #利用 execute_script() 方法將進度條下拉到最底部
#     browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
#     browser.implicitly_wait(2)  # 隱式等待
    
# 主函式
def main():
    login_zhihu(browser)  # 登入函式
    #for i in range(2):  #定義滾動次數
    get_information(browser)  # 獲取標題與連結
    #scroll_load(browser)  # 滾動
    time.sleep(1)  # 休眠


# 函式入口呼叫
if __name__ == '__main__':
    main()

    input("按任意鍵退出-> ")
    browser.quit()

執行結果(發帖人姓名部分):
在這裡插入圖片描述

相關文章