Amazon возвращает другой результат поиска - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь внедрить бота, который извлекает данные из Amazon.Я использовал два разных варианта: «Запросы» и «Селен».При поиске по ключевому слову в Amazon иногда Amazon возвращает только один результат, иногда он возвращает так много результатов.

Я пытался использовать разные IP-адреса, например запускать скрипт на облачных серверах.Я думаю, что проблема не в моем коде.Потому что я пытался только открыть браузер с Selenium, а затем искать вручную.Проблема все еще уходит.

У кого-нибудь когда-нибудь была такая проблема?У вас есть предложения?

Вы можете увидеть мою проблему в этом видео.Скрипт ищет те же ключевые слова.Там нет проблем при первом запуске.Он возвращает только 1 результат.Но второй запуск не нормально.Он возвращает столько данных, несмотря на одно и то же ключевое слово.

https://drive.google.com/file/d/1ewQEQoE0lesCBMM8euWSmg4udKJbdpv9/view?usp=sharing

Снимки экрана amazon1 amazon1

import time
import re
import random
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import NoSuchElementException


class Amazon:
    def __init__(self, keyword):
        """ """
        self.keyword = keyword
        self.price = self.rating = self.number_of_reviews = self.number_of_sellers = self.product_url = ''
        self.driver = None
        self.data = {}
        self.base_url = "https://www.amazon.in"


    def open_browser(self):
        options = Options()
        #options.add_argument("--headless")
        self.driver = webdriver.Firefox(firefox_options=options)


    def go_homepage(self):
        self.driver.get(self.base_url)
        try:
            WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@id='pageContent']")))
            return True
        except:
            return False


    def search(self):
        try:
            WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='twotabsearchtextbox']")))
            input_elem = self.driver.find_element_by_xpath("//input[@id='twotabsearchtextbox']")
            input_elem.clear()
            input_elem.send_keys(self.keyword, Keys.ENTER)
        except NoSuchElementException:
            print("Search bar not found.. AMAZON")
            return False

        try:
            WebDriverWait(self.driver, 15).until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@class, 's-result-item')]"))) ##########33
            self.driver.find_element_by_xpath("//div[contains(@class, 's-result-item')]") ###########
            return True
        except:
            print("There are no result for {} AMAZON".format(self.keyword))
            return False


    def find_product(self):
        soup = BeautifulSoup(self.driver.page_source, 'html.parser')

        products = soup.find_all('div', class_='s-result-item')
        print(len(products))
        for product in products:
            product_url = product.find('h2').find('a').get('href')

            # splitting the url for prevent sponsored products.
            splitted_url = product_url.split("/ref")[0]
            if (self.keyword in splitted_url) or (self.keyword[3:9] in splitted_url) or (len(products) < 2):
                self.product_url = '{}{}'.format(self.base_url, product_url)
                return True
        print("{} product is not found in result... AMAZON".format(self.keyword))
        return False


    def go_product(self):
        try:
            url = self.product_url
            self.driver.get(url)

            WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h1[@id='title']")))
            return True
        except:
            return False


    def parse_product(self):
        soup = BeautifulSoup(self.driver.page_source, 'html.parser')

        # price -- get only Paperback prices --
        formats_div = soup.find('div', id='formats')
        if formats_div:
            formats = formats_div.find_all('span', class_='a-list-item')
            for format in formats:
                if 'Paperback' in format.text:
                    self.price = format.find('a', class_='a-button-text').text.replace("Paperback", "").split("₹")[-1].strip()

                    # number of sellers
                    number_of_sellers = format.find('span', class_='olp-new')
                    if number_of_sellers:
                        self.number_of_sellers = number_of_sellers.text.strip().split("New")[0]
                    break

        # rating
        rating_elem = soup.find('i', class_='a-icon-star')
        if rating_elem:
            self.rating = ''.join(rating_elem.text.split('out')[0])

        # number of reviews
        number_of_reviews_elem = soup.find('span', id='acrCustomerReviewText')
        if number_of_reviews_elem:
            self.number_of_reviews = number_of_reviews_elem.text.split("customer")[0]


    def get_data(self):
        self.data['Isbn'] = self.keyword
        self.data['Amazon Price'] = self.price
        self.data['Amazon Rating'] = self.rating
        self.data['Amazon Number Of Reviews'] = self.number_of_reviews
        self.data['Amazon Number Of Sellers'] = self.number_of_sellers
        return self.data


    def main(self):
        self.open_browser()
        self.go_homepage()
        if self.search():
            time.sleep(2)
            if self.find_product():
                time.sleep(1)
                self.go_product()
                self.parse_product()
        self.driver.quit()
...