Отсканируйте каждый продукт, отфильтровав комментарии

Я пытаюсь соскрести каждую страницу товара с сайта 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):

enter image description here


Для выбора только стран сформируйте US:

print(df[df.country == "US"])

Prints:

   country  num_images
49      US           0
87      US           0
97      US           0
Вернуться на верх