I'm trying to scraping multi-page amazon comments. My code is not capturing any of the parts I wanted to get.
from bs4 import BeautifulSoup
import requests
import pandas as pd
url = "https://www.amazon.fr/AmazonBasics-600-sacs-déjections-canines-distributeur/product-reviews/B00NABTG60/ref=cm_cr_getr_d_paging_btm_next_"
amazon_reviews = []
for page in range(2, 5):
req = requests.get(url str(page) "?ie=UTF8&reviewerType=all_reviews&pageNumber=" str(page))
soup = BeautifulSoup(req.text, "html.parser")
# Getting desired data from our parsed soup
reviews = soup.find_all('div', {'data-hook': 'review'})
for item in reviews:
client = item.find('a', {'data-hook': 'genome-widget'}).text.strip()
title = item.find('a', {'data-hook': 'review-title'}).text.strip()
date = item.find('span', {'data-hook': 'review-date'}).text.strip()
rating = item.find('i', {'data-hook': 'review-star-rating'}).text.replace('out of 5 stars', '').strip()
text = item.find('span', {'data-hook': 'review-body'}).text.strip()
amazon_reviews.append(pd.DataFrame({'title': title, 'date': date, 'text': text, 'rating': rating, 'client': client}, index = [0]))
out = pd.concat(amazon_reviews, ignore_index = True)
My output:
ValueError: No objects to concatenate
CodePudding user response:
- You have to inject user-agent as headers parameter.
- You can't invoke DataFrame inside
for loop
- client's element selection was a bit wrong
- I've injected the pagination using dot format
Code:
from bs4 import BeautifulSoup
import requests
import pandas as pd
url = "https://www.amazon.fr/AmazonBasics-600-sacs-déjections-canines-distributeur/product-reviews/B00NABTG60/ref=cm_cr_arp_d_paging_btm_next_2?pageNumber={page}"
headers={'user-agent':'Mozilla/5.0'}
amazon_reviews = []
for page in range(1, 5):
req = requests.get(url.format(page=page),headers=headers)
soup = BeautifulSoup(req.text, "html.parser")
# Getting desired data from our parsed soup
reviews = soup.find_all('div', {'data-hook': 'review'})
for item in reviews:
client = item.find('div', {'class': 'a-profile-content'}).get_text(strip=True)
#print(client)
title = item.find('a', {'class': 'review-title'}).text.strip()
#print(title)
date = item.find('span', {'data-hook': 'review-date'}).text.strip()
#print(date)
rating = item.find('i', {'data-hook': 'review-star-rating'}).text.replace('out of 5 stars', '').strip()
#print(rating)
text = item.find('span', {'data-hook': 'review-body'}).text.strip()
#print(text)
amazon_reviews.append({'title': title, 'date': date, 'text': text, 'rating': rating, 'client': client})
df = pd.DataFrame(amazon_reviews)
print(df)
Output:
title ... client
0 Parfaits ... Client d'Amazon
1 Tellement pratique ... Karen M
2 Génial ... Constance Jourdain
3 Bon ... Bernardini
4 Très bon produit ... Floriane Le Loher
5 Produit simple et facile d'utilisation ... K4rm4_Ez
6 La solidité ... thierry
7 Sacs à dejection dévidoir ... M&N ABK
8 Bon produit ... Christophe FRANCOIS
9 Bonne qualité ... Neuray Gabriel
10 Très bien pour déjection canine ... PELEGRIN ERIC
11 Bonne idée ... Marine
12 Sac de qualité ... Jennifer A
13 conforme et pratique et solide ... G pay
14 Génial. ... Alban
15 Impeccable ... Marina C.
16 Pratique aux bonnes dimensions ... YVES CALVEZ
17 Solide et taille ok pour un labrador ... magnésium
18 Très pratique ... Client d'Amazon
19 très bon article ... berger fabienne
20 pratique ... Laetitia Hermann
21 Indispensable ... ronin
22 Pratique ... SylM
23 Top ... Emilie Ouviere
24 Bonne qualité ... Manon
25 Parfait ... Nicolas
26 Top ... Simon
27 Crochet énervant ! ... Jabousan
28 TOUJOURS LE MEILLEUR ... FRANKL FAN
29 Très bon produit ... Ludo96ci
30 Top pour le prix ! ... AlanLB
31 Très bien ! ... Client d'Amazon
32 Solide ... Lambourg
33 Sacs solides mais très difficiles à détacher l... ... Client d'Amazon
34 Bon rapport qualité prix ... GUYET
35 Top ... Client d'Amazon
36 Livraison rapide ... Yann
37 Il fait le job ... Rod
38 Bon produit ... Anais D
39 Pratique ... mario D.
[40 rows x 5 columns]