Я пытаюсь внедрить бота, который извлекает данные из Amazon.Я использовал два разных варианта: «Запросы» и «Селен».При поиске по ключевому слову в Amazon иногда Amazon возвращает только один результат, иногда он возвращает так много результатов.
Я пытался использовать разные IP-адреса, например запускать скрипт на облачных серверах.Я думаю, что проблема не в моем коде.Потому что я пытался только открыть браузер с Selenium, а затем искать вручную.Проблема все еще уходит.
У кого-нибудь когда-нибудь была такая проблема?У вас есть предложения?
Вы можете увидеть мою проблему в этом видео.Скрипт ищет те же ключевые слова.Там нет проблем при первом запуске.Он возвращает только 1 результат.Но второй запуск не нормально.Он возвращает столько данных, несмотря на одно и то же ключевое слово.
https://drive.google.com/file/d/1ewQEQoE0lesCBMM8euWSmg4udKJbdpv9/view?usp=sharing
Снимки экрана
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()