используя SPA страницу поиска селена, получите неверные данные - PullRequest
1 голос
/ 20 мая 2019

инструмент:

Селен

окружающая среда

есть пять списков комментариев под одним и тем же URL (SPA), который загружается динамически при нажатии кнопки

веб-сайт https://www.icourse163.org/course/PKU-1205962805 при необходимости, но на китайском.

ошибка:

ожидаемое значение
page1: 
<page1 comment list> 
page2:
<page2 comment list>
page3:
<page3 comment list>
page4:
<page4 comment list>
page5:
<page5 comment list>
что я получаю
page1: 
<page2 comment list>
page2:
<page3 comment list>
page3:
<page3 comment list>
page4:
<page4 comment list>
page5:
<page5 comment list>
код
import requests
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.chrome.options import Options
'''
API:
    dict get_comment(url:string)
    return dict of all comments:string
'''

def get_comment(url):
    '''
    div.ux-mooc-comment-course-comment_comment-list_item div.ux-mooc-comment-course-comment_comment-list_item_body_content
    '''
    driver = WebDriver()
    driver.get(url)
    driver.find_element_by_id("review-tag-button").click()
    # 1,2,3,..button
    comment_page_btns = driver.find_elements_by_class_name("th-bk-main-gh")
    page = 1
    file = open("comment.txt","w")
    for btn in comment_page_btns:
        btn.click()
        soup = BeautifulSoup(driver.page_source,"lxml")
        #comment list for one subpage 
        comment_tag_list = soup.select("div.ux-mooc-comment-course-comment_comment-list_item div.ux-mooc-comment-course-comment_comment-list_item_body_content")
        comment_count = len(comment_tag_list)
        print("in:",page," comment count: ", comment_count)
        index = "page"+str(page)+"\n"
        file.write(index)
        for tag in comment_tag_list:
            text = tag.get_text().rstrip().lstrip()+"\n"
            file.write(text.encode("utf-8"))
        page = page+1
    file.close()
    driver.quit()



if __name__ == "__main__":
    get_comment("https://www.icourse163.org/course/PKU-1205962805")

1 Ответ

0 голосов
/ 18 июня 2019

Это может быть немного поздно. Вот код, который я изменил по сравнению с вашим, чтобы этого не произошло. По сути, вы нажали следующую кнопку, прежде чем читать комментарии. Я также изменил код, чтобы он исключил Beautifulsoup.

import time
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.chrome.options import Options
'''
API:
    dict get_comment(url:string)
    return dict of all comments:string
'''

def get_comment(url):
    '''
    div.ux-mooc-comment-course-comment_comment-list_item div.ux-mooc-comment-course-comment_comment-list_item_body_content
    '''
    driver = WebDriver()
    driver.get(url)
    driver.find_element_by_id("review-tag-button").click()
    # 1,2,3,..button
    page = 1
    file = open("comment.txt","w", encoding = 'utf-8')
    for x in range(15):
        time.sleep(0.5)
        #comment list for one subpage
        comment_tag_list = driver.find_elements_by_xpath("//div[@class='ux-mooc-comment-course-comment_comment-list_item_body_content']/span")
        comment_count = len(comment_tag_list)
        print("in:",page," comment count: ", comment_count)
        index = "page"+str(page)+"\n"
        file.write(index)
        for tag in comment_tag_list:
            text = tag.text.rstrip().lstrip()+"\n"
            file.write(text)
        page = page+1
        btn = driver.find_element_by_xpath("//a[.='下一页']")
        btn.click()

    file.close()
    driver.quit()



if __name__ == "__main__":
    get_comment("https://www.icourse163.org/course/PKU-1205962805")

...