Этот код должен возвращать название продукта, но вместо названия я получаю "Нет" в ответ - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь сделать трекер цен для Amazon, просмотрев учебник на YouTube, я новичок в Python и веб-скраппинге, как-то я написал этот код, и он должен вернуть название продукта, но вместо этого он дает мне «None» как выход, не могли бы вы помочь мне с этим?

Я пытался с другим URL-адресом по-прежнему не работает.

import requests
from bs4 import BeautifulSoup 

URL = 'https://www.amazon.com/Nike-Rival-Track-Field-Shoes/dp/B07HYNB7VV/'

headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/57.36 (HTML, like Gecko) Chrome/75.0.30.100 Safari/537.4'}

page =requests.get(URL,headers)

soup = BeautifulSoup(page.content,'html.parser')

title = soup.find(id="productTitle")

print(title)import requests

Ответы [ 3 ]

0 голосов
/ 05 июля 2019

Вы можете сделать свой локатор более конкретным, используя .select().Вам также нужно изменить парсер.

Попробуйте вместо этого:

import requests
from bs4 import BeautifulSoup 

URL = 'https://www.amazon.com/Nike-Rival-Track-Field-Shoes/dp/B07HYNB7VV/'

page = requests.get(URL,headers={"User-Agent":'Mozilla/5.0'})
soup = BeautifulSoup(page.text,'lxml') #make sure you use "lxml' or "html5lib" parser instead of "html.parser"
title = soup.select_one("h1 > #productTitle").get_text(strip=True)
print(title)

Вывод:

Nike Men's Zoom Rival M 9 Track and Field Shoes
0 голосов
/ 05 июля 2019

Я проверял возвращенный HTML и понял, что Amazon отправляет (несколько искаженный?) HTML, который отключает значение по умолчанию html.parser, но, используя lxml, я смог просто отлично очистить заголовок.

import requests
from bs4 import BeautifulSoup 

def make_soup(url: str) -> BeautifulSoup:
    res = requests.get(url, headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'
    })
    res.raise_for_status()
    return BeautifulSoup(res.text, 'lxml')

def parse_product_page(soup: BeautifulSoup) -> dict:
    title = soup.select_one('#productTitle').text.strip()
    return {
        'title': title
    }

if __name__ == "__main__":
    url = 'https://www.amazon.com/Nike-Rival-Track-Field-Shoes/dp/B07HYNB7VV/'
    soup = make_soup(url)
    info = parse_product_page(soup)
    print(info) 

вывод:

{'title': "Nike Men's Zoom Rival M 9 Track and Field Shoes"}
0 голосов
/ 05 июля 2019

Обнаружение ботов в наши дни довольно распространено. Ни один крупный сайт, на котором стоит добывать какие-либо данные, особенно в розницу, не разрешит вам использовать запросы на своем сайте.

Вам понадобится, по крайней мере, использовать Selenium / ChromeDriver, чтобы получить ответ от любого авторитетного сайта. Даже если они используют что-то вроде Distil для обнаружения ботов, они остановят даже Selenium.

Попробуйте менее популярный сайт с Selenium, и вы получите данные обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...