Не в состоянии перебрать все отзывы - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь почистить этот веб-сайт и пытаюсь получить отзывы, но у меня возникает проблема,

  • На странице загружено только 50 отзывов.
  • Чтобы загрузить больше, вы должны нажать «Показать больше отзывов», и я не знаю, как получить все данные, так как нет ссылки на страницу, также «Показать больше отзывов» не имеет URL-адреса дляисследовать, адрес остается прежним.

url = "https://www.capterra.com/p/134048/HiMama-Preschool-Child-Care-App/#reviews"

import requests
from bs4 import BeautifulSoup
import json
import pandas as pd
a = []

url = requests.get(url)
html = url.text
soup = BeautifulSoup(html, "html.parser")

table = soup.findAll("div", {"class":"review-comments"})
#print(table)
for x in table:
    a.append(x.text)
df = pd.DataFrame(a)
df.to_csv("review.csv", sep='\t')

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

1 Ответ

1 голос
/ 01 июня 2019

Глядя на веб-сайт, кнопка «Показать больше отзывов» делает вызов ajax и возвращает дополнительную информацию, все, что вам нужно сделать, это найти ее ссылку и отправить запрос на получение (что я сделал с некоторыми простыми регулярное выражение):

import requests
import re
from bs4 import BeautifulSoup
headers = {
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) snap Chromium/74.0.3729.169 Chrome/74.0.3729.169 Safari/537.36"
}
url = "https://www.capterra.com/p/134048/HiMama-Preschool-Child-Care-App/#reviews"
Data = []
#Each page equivalant to 50 comments:
MaximumCommentPages = 3 

with requests.Session() as session:
    info = session.get(url)
    #Get product ID, needed for getting more comments
    productID = re.search(r'"product_id":(\w*)', info.text).group(1)
    #Extract info from main data
    soup = BeautifulSoup(info.content, "html.parser")
    table = soup.findAll("div", {"class":"review-comments"})
    for x in table:
        Data.append(x)
    #Number of pages to get:
    #Get additional data:
    params = {
        "page": "",
        "product_id": productID
    }
    while(MaximumCommentPages > 1): # number 1 because one of them was the main page data which we already extracted!
        MaximumCommentPages -= 1
        params["page"] = str(MaximumCommentPages)
        additionalInfo = session.get("https://www.capterra.com/gdm_reviews", params=params)
        print(additionalInfo.url)
        #print(additionalInfo.text)
        #Extract info for additional info:
        soup = BeautifulSoup(additionalInfo.content, "html.parser")
        table = soup.findAll("div", {"class":"review-comments"})
        for x in table:
            Data.append(x)

#Extract data the old fashioned way:
counter = 1
with open('review.csv', 'w') as f:
    for one in Data:
        f.write(str(counter))
        f.write(one.text)
        f.write('\n')
        counter += 1

Обратите внимание, как я использую сеанс для сохранения файлов cookie для вызова ajax.

Редактировать 1: Вы можете перезагрузить веб-страницу несколько раз и снова вызвать ajax, чтобы получить еще больше данных.

Редактировать 2: сохранить данные, используя свой собственный метод.

Редактировать 3: некоторые вещи изменены, теперь получает любое количество страниц для вас, сохраняет в файл с хорошим 'ol open ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...