#python-3.x #web-scraping #beautifulsoup #lxml #python-webbrowser
Вопрос:
У меня есть список python, содержащий эти пять ссылок:
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-angel-light-w1030269a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-rose-bud-teething-ring-w1030273a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-cloud-projector-light-w869154a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-bunny-projector-light-w869153a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-fairy-light-w1030270a.html
Я пытаюсь перебирать ссылки , чтобы извлечь определенные элементы со страницы, извлечение отлично работает для большинства элементов, но я не могу получить «РЕЙТИНГ» и «NUM_REVIEWS» с веб-страницы для заполнения столбца. Может кто-нибудь, пожалуйста, помочь мне получить это. Спасибо
Рабочий код:
import pandas as pd
import requests
from bs4 import BeautifulSoup
from lxml import html
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}
list_urls = [
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-angel-light-w1030269a.html',
'https://en-ae.namshi.com/buy-american-eagle-straight-dark-wash-jeans-w925887a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-rose-bud-teething-ring-w1030273a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-cloud-projector-light-w869154a.html',
]
all_data = []
for lnk in list_urls:
page=requests.get(lnk)
tree = html.fromstring(page.content)
f = requests.get(lnk, headers=headers).text
hun = BeautifulSoup(f,'html.parser')
product_name=hun.find("h1",{"class":"product__name"}).text.replace('n',"")
brand_name = hun.find("h2",{"class":"product__brandname"}).text.replace('n',"")
price = str(tree.xpath('//*[@id="content"]/div/div[3]/section[1]/div/div[1]/div/div[2]/header/div/p[1]/span[1]/text()')[0])
reduced_price = str(tree.xpath('//*[@id="content"]/div/div[3]/section[1]/div/div[1]/div/div[2]/header/div/p[1]/span[2]/text()')[0])
rating = str(tree.xpath('/html/body/div[1]/div[7]/div/div[3]/section[1]/div/div[2]/div/div[1]/text()'))
num_reviews = str(tree.xpath('/html/body/div[1]/div[7]/div/div[3]/section[1]/div/div[2]/div/div[1]/div[1]/span[2]/text()'))
sub_cat_1 = str(tree.xpath('//*[@id="content"]/div/div[3]/ul/li[3]/a/text()')[0])
sub_cat_2 = str(tree.xpath('//*[@id="content"]/div/div[3]/ul/li[4]/a/text()')[0])
sub_cat_3 = str(tree.xpath('//*[@id="content"]/div/div[3]/ul/li[5]/a/text()')[0])
row = {"Product_Name": product_name, "Brand_Name" : brand_name, "Original_Price" : price,
"Discounted_Price" : reduced_price ,"Rating" : rating, "Num_Reviews" : num_reviews,
"Sub_cat_1" : sub_cat_1, "Sub_cat_2" : sub_cat_2, "Sub_cat_3" : sub_cat_3}
all_data.append(row)
df = pd.DataFrame(all_data)
print(df.head(5))
Не могли бы вы , пожалуйста, помочь мне в получении оценок и отзывов, а также, заранее спасибо.
Ожидаемые значения в обоих кольцах :
Комментарии:
1. ваш рейтинг xpath не работает ни для одной из этих ссылок. Для этих ссылок, пожалуйста, укажите, какое значение следует извлечь.
2. @QHarr Я добавил изображение , чтобы указать значение на странице , спасибо, очень ценю вашу помощь.
3. @QHarr Возможно, вам придется немного прокрутиться вниз, чтобы увидеть раздел «Рейтинги».
4. @QHarr Ссылка, которую я использовал на скриншоте : en-ae.namshi.com/…
Ответ №1:
Эти оценки поступают из динамического запроса на другую конечную точку на основе текущего артикула. Это покажет вам, как получить данные.
Этот:
if 'message' in review_info:
Проверяет, действительно ли существуют рейтинги.
Я использую Session
для повышения эффективности повторного использования tcp с несколькими запросами.
import pandas as pd
import requests
from bs4 import BeautifulSoup
import re
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}
list_urls = [
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-angel-light-w1030269a.html',
'https://en-ae.namshi.com/buy-american-eagle-straight-dark-wash-jeans-w925887a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-rose-bud-teething-ring-w1030273a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-cloud-projector-light-w869154a.html',
]
all_data = []
with requests.Session() as s:
s.headers = headers
for lnk in list_urls:
f = s.get(lnk).text
sku = re.search(r'"sku":"(.*?)"', f).group(1)
review_info = s.get(f'https://en-ae.namshi.com/_svc/reviews/{sku}').json()
print(lnk)
if 'message' in review_info:
print('No averageRating')
print('No totalAvailableRatings')
else:
print(review_info['averageRating'])
print(review_info['totalAvailableRatings'])
hun = BeautifulSoup(f,'html.parser')
Комментарии:
1. не могли бы вы помочь, пожалуйста, столбцы все еще пусты, когда я запускаю его. Большое спасибо, чувак. Я отредактировал вопрос и код.
2. Я добавил код в отредактированный раздел , я назначил переменные печати переменным, которые должны были быть записаны во фрейм данных.
3. извините , что я обнаружил свою ошибку , я не удалил старые переменные, глупый я!
4. Не беспокойтесь. Это часто случается, особенно при использовании Jupyter.