Просмотры веб-парсинга, рейтинги и дата публикации с использованием beautifulsoups в python - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь получить просмотры, оценки и дату публикации каждого обзора, указанного в приведенной ниже ссылке. Рейтинги не похожи на рейтинги Amazon. Думаю, я должен применить al oop, но не знаю, как бы я это сделал в этой ситуации. Мне нужна помощь с просмотрами, рейтингами и датой.

https://www.mouthshut.com/product-reviews/Kotak-811-Mobile-Banking-reviews-925917218

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

URL = ""
Final = []
for x in range(0, 8):
    if x == 1:
        URL = "https://www.mouthshut.com/product-reviews/Kotak-811-Mobile-Banking-reviews-925917218"
    else:
        URL ="https://www.mouthshut.com/product-reviews/Kotak-811-Mobile-Banking-reviews-925917218-page-{}".format(x)

    r = requests.get(URL)
    soup = BeautifulSoup(r.content, 'html5lib')
    reviews = []  # a list to store reviews

    # Use a CSS selector to extract all the review containers
    review_divs = soup.select('div.col-10.review')
    for element in review_divs :
        review = {'Review_Title': element .a.text, 'URL': element .a['href'], 'Review': element .find('div', {'class': ['more', 'reviewdata']}).text.strip(),
                  'Rating': element.find('div', {'class': ['rating']}), 'Views': element.find('span', {'class': ['views']}).text.strip()
                  'Date': element.find('span', 'id').text.strip()}
        reviews.append(review)

    Final.extend(reviews)

df = pd.DataFrame(Final)
print(df)

Буду очень признателен за помощь в этом вопросе. Спасибо

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Данные загружаются динамически через JavaScript. Вы можете смоделировать это с помощью requests модуля:

import re
import requests
from bs4 import BeautifulSoup


url = 'https://www.mouthshut.com/product-reviews/Kotak-811-Mobile-Banking-reviews-925917218-page-{page}'
review_info_url = 'https://www.mouthshut.com/review/CorporateResponse.ashx?type=GetProfileData&rev_id={rev_id}&user_id={user_id}&post_s=0&tcount=1&is_del=0&img=.jpg&corp=false&show_userid=0'

page = 1
html_data = requests.get(url.format(page=page)).text

for rev_id, user_id in re.findall(r'getuserprofile\((\d+),(\d+)', html_data):
    soup = BeautifulSoup( requests.get(review_info_url.format(rev_id=rev_id, user_id=user_id)).content, 'html.parser' )
    data = soup.get_text(strip=True, separator='^').split('^')
    if len(data) == 9:
        username, reviews, views, date = data[0], data[-6], data[-4], data[-3]
    else:
        username, reviews, views, date = data[0], data[-7], data[-4], data[-3]
    print('{:<30} {:<20} {:<20} {}'.format(username, reviews, views, date))

Печать:

9967206109a                    1 Review             197 Views            10 days ago
dhanrahe2017                   1 Review             887 Views            Feb 27, 2020 09:21 AM
anudhiman824                   1 Review             1295 Views           Jan 15, 2020 11:03 AM
yuvi60780                      22 Reviews           1416 Views           Jan 07, 2020 03:13 PM
dhirajrakhecha14               13 Reviews           3781 Views           Sep 04, 2019 07:20 PM
surinderpunia569               2 Reviews            5446 Views           Apr 26, 2019 04:29 PM
prakashjg86                    15 Reviews           6539 Views           Jan 09, 2019 10:30 AM
gaurangshukla32                20 Reviews           7744 Views           Oct 01, 2018 10:41 PM
astonic9                       35 Reviews           7910 Views           Jul 25, 2018 12:31 PM
surajraikar2                   26 Reviews           9462 Views           Jul 14, 2018 02:11 PM
raja26                         55 Reviews           8797 Views           Jul 12, 2018 06:29 PM
sameerbarbil                   41 Reviews           7664 Views           Jul 06, 2018 07:13 AM
BusiRajendar                   42 Reviews           9326 Views           Jun 03, 2018 04:25 PM
akmittal0901                   29 Reviews           7046 Views           Jun 03, 2018 03:44 PM
britishbazar                   6 Reviews            7334 Views           May 21, 2018 06:37 PM
amandarora876                  39 Reviews           6114 Views           May 09, 2018 04:02 PM
abhi1010                       21 Reviews           7373 Views           May 07, 2018 02:52 PM
rahulsreflection               5 Reviews            6415 Views           Apr 18, 2018 07:28 AM
ask12345                       2 Reviews            5789 Views           Apr 09, 2018 06:49 PM
ankitdarji153                  62 Reviews           5829 Views           Apr 04, 2018 12:04 PM
0 голосов
/ 21 июня 2020

Я действительно не знаю о модуле pandas, поэтому я не буду его использовать, но вы можете сделать это для очистки необходимых данных:

import requests
from bs4 import BeautifulSoup as BS

for x in range(0, 8):
    if x == 1:
        URL = "https://www.mouthshut.com/product-reviews/Kotak-811-Mobile-Banking-reviews-925917218"
    else:
        URL ="https://www.mouthshut.com/product-reviews/Kotak-811-Mobile-Banking-reviews-925917218-page-{}".format(x)

    r = requests.get(URL)
    soup = BS(r.content, 'html.parser')
    reviews = []  # a list to store reviews

    # i'm not going to use CSS selectors
    review_divs = soup.find_all('div', class_='row review-article')
    for review_div in review_divs :
        title_anchor = review_div.find('a')
        title_text = title_anchor.text
        title_url = title_anchor['href']
    
        rating_div = review_div.find('div', class_='rating')
        rating_stars = len(rating_div.find_all('i', class_='icon-rating rated-star'))
        date = review_div.find('div', class_='rating').find_all('span')[1].text.strip()
        views = rating_div.find('span', class_='total-views').find('span', class_='views').text
    
        review_text = review_div.find('div', class_='more reviewdata').text.strip()
        review_text = review_text.replace('\n', ' ')
        review = {
            'title_text': title_text,
            'title_url': title_url,
            'rating': rating_stars,
            'date': date,
            'views': views,
            'review_text': review_text
        }
    
        reviews.append(review)

Примечание: Я новичок в парсинге веб-страниц так же, как и вы, и у меня возникли две проблемы с моим кодом: во-первых, я не могу получить номер views, он выдаст мне странный текст Read, я не знаю, почему; Во-вторых, я просто могу получить текст обзора до Read More..., а не дальше.

Я думаю, если вы хотите получить весь текст обзора, вам следует использовать selenium, потому что вам нужно нажать на Read More... ссылка и прочтите текст отзыва.

...