Селекторы Bs4: очистите Amazon с помощью Beautiful Soup

Я пытаюсь очистить сайт, на котором есть ссылки на Amazon, с помощью Python, используя эти фреймворки - селен, красивый суп.

Моя цель - очистить следующие сведения о продуктах Amazon -> Название, цена, описание, первый обзор

Но у меня проблемы с красивыми селекторами. Я пробовал много комбинаций, но получаю либо нулевой вывод, либо ошибку, к сожалению, не так, как Pro. Основная проблема в том, что Beautiful soup не имеет селекторов XPath (AFAIK). Должен ли я перейти на scrapy для этой задачи, или scrapy слишком утомителен для этого простого скребка?

Это первый продукт, который я повторю позже.

from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver.get('https://www.example.com')
driver.get('https://www.example.com')
first_article = driver.find_element_by_css_selector('div.button')
first_article.click()
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
# perform the operation

После этого мне нужно выбрать соответствующий путь, но как это сделать? В Xpath это примерно так,

Title = '//h1[@id="title"]//text()'

Price = '//span[contains(@id,"ourprice") or contains(@id,"saleprice")]/text()'

Category = //a[@class="a-link-normal a-color-tertiary"]//text()'

А вот подробностей о продукте и пути к первому обзору пока не могу. Я думаю, что красивые селекторы find_all здесь не помогут.


person Abhijeet Pal    schedule 08.06.2018    source источник
comment
Попробуйте lxml   -  person ᴘᴀɴᴀʏɪᴏᴛɪs    schedule 08.06.2018
comment
Я пробовал это с lxml html = driver.page_source soup.xpath('//*[@id="title"]') soup.xpath('//*[@id="title"]'), но получил эту ошибку - ›Объект« NoneType »не может быть вызван, почему этот объект не может быть вызван?   -  person Abhijeet Pal    schedule 08.06.2018


Ответы (4)


Если ваша цель - просто очистить веб-сайт, используйте только BeautifulSoup. Это сэкономит вам время выполнения и дополнительные строки кода по сравнению с использованием Selenium.

BeautifulSoup имеет функцию с именем findNext из текущего элемента направлен на ребенка, поэтому:

Попробуйте что-нибудь вроде этого -

    import bs4 
    import requests

    res = requests.get(url)
    soup = bs4.BeautifulSoup(self.res.text, "lxml")    #lxlm parser
    text = soup.findNext('div',{'class':'class_value'}).findNext('div',{'id':'id_value'}).findAll('a') 

Это похоже на xpath -

div[class=class_value]/div[id=id_value]
person Saurav    schedule 08.06.2018

Попробуйте использовать селен, он поддерживает селекторы xpath. driver.find_element_by_xpath (Заголовок) # Пример

person Goran    schedule 08.06.2018
comment
сэр, я пробовал это для названия продукта driver.find_element_by_xpath('//*[@id="productTitle"]'), но получаю ошибку - не удается найти - person Abhijeet Pal; 08.06.2018

Вы можете просто использовать BeautifulSoup для этого, это не очень сложно, и если вам интересно, я думаю, что для этого есть api.

Селен чаще используется для нажатия кнопок, и это может замедлить работу вашей программы, потому что для каждого нажатия кнопки вам нужно будет ждать страницы загрузки, а для того, что вам нужно сделать, у вас должна быть скорость, потому что это много ссылок: D.

По BeautifulSoup есть хорошая документация: http://www.pythonforbeginners.com/beautifulsoup/beautifulsoup-4-python

Хороший Api для python: aws.amazon.com/python

person Joao Pedro Lopes Mendes    schedule 08.06.2018
comment
Начальная страница - это страница JavaScript, мне нужен селен, чтобы нажимать кнопки - person Abhijeet Pal; 08.06.2018
comment
Затем используйте scrapy - person Joao Pedro Lopes Mendes; 08.06.2018
comment
Какой-либо причине? потому что я должен использовать там селен. Splash не работает на моей машине. - person Abhijeet Pal; 08.06.2018
comment
Попробуйте найти api для Amazon, я не знаю, есть ли для этого какой-нибудь api, но стоит попробовать: D - person Joao Pedro Lopes Mendes; 08.06.2018
comment
Scrapy действительно был лучшим способом сделать это. - person Joao Pedro Lopes Mendes; 08.06.2018

У Amazon есть механизмы защиты от соскабливания, которые при обнаружении соскабливания будут использовать капчу на скребке, поэтому ваша проблема в том, что он возвращает html для кода, а вы ничего не находите.

Единственный надежный способ очистить Amazon - использовать безголовую версию Selenium.

person Dennis Cafiero    schedule 29.05.2019