#python-3.x #web-scraping #beautifulsoup
#python-3.x #очистка веб-страниц #beautifulsoup
Вопрос:
Я пытаюсь создать скрипт для отслеживания цен на Amazon. Но я не понимаю, почему это выдает мне эту ошибку :
Traceback (most recent call last):
File "scraping_amazon.py", line 12, in <module>
price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text
AttributeError: 'NoneType' object has no attribute 'text'
Вот мой сценарий до сих пор :
import requests
from bs4 import BeautifulSoup
URL = 'https://www.amazon.de/Sony-Vollformat-Digitalkamera-Megapixel-SEL-2870/dp/B00FWUDEEC/ref=sr_1_4?__mk_de_DE=ÅMÅŽÕÑamp;dchild=1amp;keywords=sony a7amp;qid=1604245969amp;quartzVehicle=5-672amp;replacementKeywords=sonyamp;sr=8-4'
page = requests.get(URL)
soup = BeautifulSoup(page.text, 'html.parser')
price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text
print(price)
Я следовал тому же процессу, что и с другим моим скриптом для создания веб-страниц, они работают, но не он.
Есть идеи? Спасибо.
Ответ №1:
Содержимое страницы динамически загружается с помощью javascript
. Вы должны использовать что-то вроде selenium
для очистки динамически загружаемых страниц. Вот полный код для этого:
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import time
URL = 'https://www.amazon.de/Sony-Vollformat-Digitalkamera-Megapixel-SEL-2870/dp/B00FWUDEEC/ref=sr_1_4?__mk_de_DE=ÅMÅŽÕÑamp;dchild=1amp;keywords=sony a7amp;qid=1604245969amp;quartzVehicle=5-672amp;replacementKeywords=sonyamp;sr=8-4'
driver = webdriver.Chrome()
driver.get(URL)
time.sleep(4)
soup = BeautifulSoup(driver.page_source,'html5lib')
price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text
print(price)
driver.close()
Вывод:
962,16 €
Комментарии:
1. Файл «scraping_amazon.py «, строка 7, в <module> driver = webdriver. Файл Chrome () «C:UsersEvanAnaconda3libsite-packagesseleniumwebdriverchromewebdriver.py «, строка 73, в файле init self.service.start() «C:UsersEvanAnaconda3libsite-packagesseleniumwebdrivercommonservice.py «, строка 83, в start os.path.basename(self.path), self.start_error_message) selenium.common.exceptions. Исключение WebDriverException: Сообщение: исполняемый файл ‘chromedriver’ должен находиться в PATH. Пожалуйста, посмотрите sites.google.com/a/chromium.org/chromedriver/home
2. Ваш chromedriver должен находиться в том же пути, что и ur script. Если это не тот же путь, тогда вам нужно указать полный путь к файлу
webdriver.Chrome()
. Вот пример:driver = webdriver.Chrome('D:\Python\chromedriver.exe')
3. Я не знаю, где мой chromedriver. Я никогда не использовал это раньше ^^
4. Хорошо … Если у вас нет chromedriver, загрузите его отсюда: chromedriver.chromium.org/downloads После загрузки поместите его в тот же каталог, что и ur script, и запустите ur script
Ответ №2:
Используйте HTMLsession с некоторым фиктивным пользовательским агентом
from bs4 import BeautifulSoup
from requests_html import HTMLSession
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'
}
session = HTMLSession()
response = session.get('https://www.amazon.de/Sony-Vollformat-Digitalkamera-Megapixel-SEL-2870/dp/B00FWUDEEC/ref=sr_1_4?__mk_de_DE=ÅMÅŽÕÑamp;dchild=1amp;keywords=sony a7amp;qid=1604245969amp;quartzVehicle=5-672amp;replacementKeywords=sonyamp;sr=8-4',headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text
print(price)
Комментарии:
1. Я пробовал использовать user agent раньше, но это не сработало :/
2. @LaurieFalcon Это работает для меня repl.it/repls/ParallelScratchyDisc