#python-2.7 #soap #beautifulsoup
#python-2.7 #soap #beautifulsoup
Вопрос:
Я исследовал здесь, и решения, которые я нашел для своей проблемы, не смогли решить.
Я пытаюсь создать очистку страницы Amazon, которая фиксирует название и цену продукта, но когда я пытаюсь ее запустить, я всегда получаю сообщение об ошибке:
Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘getText’
Что я нахожу странным, так это то, что эта ошибка прерывистая, время работает, и время выдает ошибку, я считаю, что для отображения содержимого для soap есть какой-то другой способ, кроме time.
Я уже пытался использовать time.sleep с несколькими секундами, чтобы попытаться обойти эту проблему, но безуспешно…
Вот выдержка из моего кода:
import requests
import time
from bs4 import BeautifulSoup
def StoreAmazon():
URL = ['www.amazon.com.br/Notebook-Acer-AN515-54-58CL-Endless-GTX1650/dp/B0883VMXX4?ref_=Oct_s9_apbd_otopr_hd_bw_bHrUqLTamp;pf_rd_r=1ZG49PCAZV8RN8CK6QDQamp;pf_rd_p=ae2a6e14-5e57-57d1-a7c7-38f2deae6a08amp;pf_rd_s=merchandised-search-10amp;pf_rd_t=BROWSEamp;pf_rd_i=16364755011','www.amazon.com.br/Monitor-Gamer-Samsung-LS24D332HSX-ZD/dp/B07MVPD3VK?ref_=Oct_s9_apbd_otopr_hd_bw_bHrUqbbamp;pf_rd_r=D34JDZ7EBFS7CTZ3X5CWamp;pf_rd_p=dfd6eead-be55-57b6-bdaf-226199170f0aamp;pf_rd_s=merchandised-search-10amp;pf_rd_t=BROWSEamp;pf_rd_i=16364756011']
headers = {'User-Agent': 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0'}
for x in range(len(URL)):
time.sleep(1)
page = requests.get(URL[x], headers=headers)
soup = BeautifulSoup(page.content, 'lxml')
productName = soup.find('span', {'id':'productTitle'}).getText()
productPrice = soup.find('span', {'id':'priceblock_ourprice'}).getText()
print (productName.strip())
print (productPrice)
print()
# converted_price = float(productPrice[0:5])
# print (converted_price)
StoreAmazon ()
Ответ №1:
Я напечатал суп, предоставленный вашим кодом. Amazon обнаружил, что это автоматическая попытка, и предоставил это уведомление
Для обсуждения автоматического доступа к данным Amazon, пожалуйста, свяжитесь с api-services-support@amazon.com . Для получения информации о переходе на наши API-интерфейсы обратитесь к нашим API-интерфейсам Marketplace по адресу https://developer.amazonservices.com/ref=rm_c_sv , или наш Рекламный API продукта на https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html/ref=rm_c_ac для рекламных вариантов использования.
Я все равно мог бы получить его с помощью selenium:
URL = ['https://www.amazon.com.br/Notebook-Acer-AN515-54-58CL-Endless-GTX1650/dp/B0883VMXX4']
for x in range(len(URL)):
soup = return_page_source_soup(URL[x])
# print(soup)
productName = soup.find('span', {'class':'product-title-word-break'}).get_text(strip=True)
print (productName)
это мой код для переноса исходного кода из selenium в BeautifulSoup
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException
chromeOptions = Options()
chromeOptions.headless = False
PATH = "D:chromedriver.exe"
driver = webdriver.Chrome(PATH, options=chromeOptions)
driver.set_page_load_timeout(20)
def return_page_source_soup(link):
# pass
while True:
try:
driver.get(link)
except TimeoutException:
print("timeout, retrying")
continue
else:
break
response = driver.page_source
soup = BeautifulSoup(response,"lxml")
return soup
Примечание 1: Вы вставляете идентификатор ссылки в URL. это не что-то постоянное. вы должны удалить from ?ref из URL.
Примечание 2: у Amazon есть партнерская программа. итак, я не думаю, что вам нужно таким образом извлекать данные из Amazon.