Отсканируйте каждый продукт, отфильтровав комментарии
Я пытаюсь соскрести каждую страницу товара с сайта aliexpress.
Я написал этот код, чтобы получить количество комментариев, количество фотографий, опубликованных пользователем, а также страну пользователя и поместить это в кадр данных. Но я хочу получить только комментарии, опубликованные определенным пользователем, другими словами, применить фильтр на комментарии по стране пользователя, например, получить комментарии, опубликованные пользователем, страна которого 'US', но на самом деле я не знаю, как установить этот фильтр :
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
url = 'https://www.aliexpress.com/item/1005003801507855.html?spm=a2g0o.productlist.0.0.1e951bc72xISfE&algo_pvid=6d3ed61e-f378-43d0-a429-5f6cddf3d6ad&algo_exp_id=6d3ed61e-f378-43d0-a429-5f6cddf3d6ad-8&pdp_ext_f=%7B%22sku_id%22%3A%2212000027213624098%22%7D&pdp_pi=-1%3B40.81%3B-1%3B-1%40salePrice%3BMAD%3Bsearch-mainSearch'
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(url)
wait = WebDriverWait(driver, 10)
driver.execute_script("arguments[0].scrollIntoView();", wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.tab-content'))))
driver.get(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#product-evaluation'))).get_attribute('src'))
data=[]
number_feedbacks = driver.find_element(By.XPATH, '//*[@id="transction-feedback"]/div[1]')
number_images = driver.find_element(By.XPATH, '//*[@id="transction-feedback"]//label[1]/em')
print(f'number_feedbacks = {number_feedbacks}\nnumber_images = {number_images}')
while True:
for e in driver.find_elements(By.CSS_SELECTOR, 'div.feedback-item'):
try:
country = e.find_element(By.CSS_SELECTOR, '.user-country > b').text
except:
country = None
data.append({
'country':country,
})
try:
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#complex-pager a.ui-pagination-next'))).click()
except:
break
pd.DataFrame(data).to_csv('filename.csv',index=False)
Любая помощь будет замечательной. Спасибо !
Вы можете использовать следующий код, чтобы получить все страны и количество изображений из отзывов в фрейм данных. Затем вы можете использовать стандартную фильтрацию pandas, чтобы выбрать отзывы только из определенной страны:
import re
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = "https://www.aliexpress.com/item/1005003801507855.html?spm=a2g0o.productlist.0.0.1e951bc72xISfE&algo_pvid=6d3ed61e-f378-43d0-a429-5f6cddf3d6ad&algo_exp_id=6d3ed61e-f378-43d0-a429-5f6cddf3d6ad-8&pdp_ext_f=%7B%22sku_id%22%3A%2212000027213624098%22%7D&pdp_pi=-1%3B40.81%3B-1%3B-1%40salePrice%3BMAD%3Bsearch-mainSearch"
api_url = "https://feedback.aliexpress.com/display/productEvaluation.htm"
data = {
"ownerMemberId": "",
"memberType": "seller",
"productId": "",
"companyId": "",
"evaStarFilterValue": "all+Stars",
"evaSortValue": "sortdefault@feedback",
"page": "",
"currentPage": "",
"startValidDate": "",
"i18n": "true",
"withPictures": "false",
"withAdditionalFeedback": "false",
"onlyFromMyCountry": "false",
"version": "",
"isOpened": "true",
"translate": "+Y+",
"jumpToTop": "true",
"v": "2",
}
page = requests.get(url).text
data["ownerMemberId"] = re.search(r'"sellerAdminSeq":(\d+)', page).group(1)
data["productId"] = re.search(r'"productId":(\d+)', page).group(1)
all_data, currentPage, page = [], 0, 1
while True:
print("Getting page no.", currentPage)
data["currentPage"] = currentPage
data["page"] = page
soup = BeautifulSoup(
requests.post(api_url, data=data).content, "html.parser"
)
items = soup.select(".feedback-item")
if len(items) == 0:
break
for i in items:
country = i.select_one(".css_flag").text
num_images = len(i.select(".pic-view-item"))
# get other data from comment here:
# ...
all_data.append({"country": country, "num_images": num_images})
currentPage += 1
page += 1
df = pd.DataFrame(all_data)
df.to_csv("data.csv", index=False)
Создается CSV файл с отзывами data.csv (скриншот из LibreOffice):
Для выбора только стран сформируйте US:
print(df[df.country == "US"])
Prints:
country num_images
49 US 0
87 US 0
97 US 0
