Как очистить данные, нажав кнопку «Подробнее» - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь очистить отзывы от https://www.mouthshut.com/product-reviews/ICICI-Lombard-Auto-Insurance-reviews-925641018, используя BeautifulSoup в python.

На самом деле содержание отзывов имеет кнопку "Подробнее ...".Как я могу вызвать эту кнопку для получения всего содержимого?

Я обнаружил, что XHR-запрос запускается, когда я нажимаю кнопку.Как я могу смоделировать это с помощью Python?

Кроме того, после проверки кнопки «Читать дальше ...» я получил следующее:

<a style="cursor:pointer" onclick="bindreviewcontent('2836986',this,false,'I found this review of ICICI Lombard Auto Insurance pretty useful',925641018,'.jpg','I found this review of ICICI Lombard Auto Insurance pretty useful %23WriteShareWin','https://www.mouthshut.com/review/ICICI-Lombard-Auto-Insurance-review-rmlrrturotn','ICICI Lombard Auto Insurance',' 1/5','rmlrrturotn');">Read More</a>

Как я могу вызвать событие onclick с помощью Python?

Ответы [ 2 ]

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

Извлечение всех отзывов с рейтингами и ссылками

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd


def add_reviews(s, soup, results):
    for review in soup.select('.review-article'):
        info = review.select_one('a')
        identifier = review.select_one('[reviewid]')['reviewid']
        data['reviewid'] = identifier
        title = info.text
        link = info['href']
        rating = len(review.select('.rated-star'))
        r = s.post('https://www.mouthshut.com/review/CorporateResponse.ashx', data)
        soup2 = bs(r.content, 'lxml')
        review = ' '.join([i.text for i in soup2.select('p')])
        row = [title, link, rating, review]
        results.append(row)

url = 'https://www.mouthshut.com/product-reviews/ICICI-Lombard-Auto-Insurance-reviews-925641018-page-{}'
data = {'type': 'review', 'reviewid': '', 'catid': '925641018', 'corp': 'false', 'catname': ''}
results = []

with requests.Session() as s:
    r = s.get('https://www.mouthshut.com/product-reviews/ICICI-Lombard-Auto-Insurance-reviews-925641018')
    soup = bs(r.content, 'lxml')
    pages = int(soup.select('#spnPaging .btn-link')[-1].text)
    add_reviews(s, soup, results)
    if pages > 1:
        for page in range(2, pages + 1):
            r = s.get(url.format(page))
            soup = bs(r.content, 'lxml')
            add_reviews(s, soup, results)

df = pd.DataFrame(results, columns = ['Title', 'Link', 'Rating', 'Review'])
print(df)      
0 голосов
/ 16 июня 2019

Есть два способа сделать это.Одним из способов является использование селена .Он позволяет программно управлять браузером (поддерживаются наиболее распространенные браузеры, такие как Firefox и Chrome).Я не знаком с ним, и это может быть излишним во многих ситуациях (я думаю, что браузер будет нести некоторые издержки), но это полезно знать.

Другой способ - это сделать еще один осмотр, чтобы увидеть, что происходитпри нажатии кнопки «Подробнее».Вкладка «Сеть» в инструментах разработчика (я использую Chrome, но я думаю, что Firefox также имеет то же самое) может помочь с этим, показывая вам все HTTP-запросы, отправляемые браузером.

Я считаю, чтопри нажатии кнопки «Подробнее» запрос POST отправляется на https://www.mouthshut.com/review/CorporateResponse.ashx со следующими данными:

type: review
reviewid: 2836986
corp: false
isvideo: false
fbmessage: I found this review of ICICI Lombard Auto Insurance pretty useful
catid: 925641018
prodimg: .jpg
twittermsg: I found this review of ICICI Lombard Auto Insurance pretty useful %23WriteShareWin
twitterlnk: https://www.mouthshut.com/review/ICICI-Lombard-Auto-Insurance-review-rmlrrturotn
catname: ICICI Lombard Auto Insurance
rating_str:  1/5
usession: 0

Однако, когда я только что отправил запрос POST с этими данными,это не сработало.Обычно это означает, что в заголовках HTTP есть что-то важное.Обычно это печенье;Я подтвердил, что это действительно так.Решение легко с пакетом requests (который вы должны полностью использовать в любом случае): Используйте requests.Session.

Вот подтверждение концепции:

import requests
with requests.Session() as s:
    s.get('https://www.mouthshut.com/product-reviews/ICICI-Lombard-Auto-Insurance-reviews-925641018')
    print(s.post('https://www.mouthshut.com/review/CorporateResponse.ashx',
                 data = {'type': 'review', 'reviewid': '2836986', 'catid': '925641018', 'corp': 'false', 'catname': ''}
                ).text)

Результатом является некотороеHTML, содержащий то, что вы ищете.Наслаждайтесь супингом!

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