Penyeleksi Bs4: Kikis Amazon menggunakan Sup Cantik

Saya mencoba mengikis situs yang memiliki tautan ke Amazon dengan Python menggunakan kerangka kerja ini - selenium, sup yang indah.

Tujuan saya adalah mengikis detail produk Amazon Berikut --> Judul, Harga, Deskripsi, Ulasan Pertama

Tetapi saya mengalami kesulitan dengan penyeleksi Cantik. Saya mencoba banyak kombinasi tetapi saya mendapatkan keluaran nol atau Kesalahan, Sayangnya Tidak begitu Pro. Masalah utamanya adalah Sup Cantik tidak memiliki penyeleksi XPath (AFAIK). Haruskah saya beralih ke scrapy untuk tugas ini, atau apakah scrapy terlalu berlebihan untuk scraper sederhana ini?

Ini untuk produk pertama yang akan saya ulangi nanti

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

Setelah itu saya harus memilih jalur masing-masing tetapi bagaimana cara melakukannya? Di Xpath kira-kira seperti ini,

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()'

Tapi detail produk dan jalur review pertama saja saya belum bisa. Saya rasa, penyeleksi find_all Sup Cantik tidak akan membantu di sini.


person Abhijeet Pal    schedule 08.06.2018    source sumber
comment
Coba lxml   -  person ᴘᴀɴᴀʏɪᴏᴛɪs    schedule 08.06.2018
comment
Saya mencobanya dengan lxml html = driver.page_source soup.xpath('//*[@id="title"]') soup.xpath('//*[@id="title"]') tetapi mendapatkan kesalahan ini --› Objek 'NoneType' tidak dapat dipanggil, mengapa objek tersebut tidak dapat dipanggil?   -  person Abhijeet Pal    schedule 08.06.2018


Jawaban (4)


Jika tujuan Anda hanya menggores situs web, gunakan BeautifulSoup saja. Ini akan menghemat waktu eksekusi dan baris kode tambahan dibandingkan dengan menggunakan Selenium.

BeautifulSoup memiliki fungsi bernama findNext dari elemen saat ini diarahkan ke anak-anak, jadi:

Cobalah sesuatu seperti ini-

    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') 

Ini mirip dengan xpath -

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

Coba gunakan Selenium yang mendukung penyeleksi xpath. driver.find_element_by_xpath(Judul) # Contoh

person Goran    schedule 08.06.2018
comment
Pak Saya mencoba ini untuk judul produk driver.find_element_by_xpath('//*[@id="productTitle"]') tetapi mendapatkan kesalahan - Tidak dapat menemukan - person Abhijeet Pal; 08.06.2018

Anda cukup menggunakan BeautifulSoup untuk itu, tidak terlalu sulit, dan jika Anda tertarik saya rasa ada api untuk itu.

Selenium lebih sering digunakan untuk mengklik tombol, dan ini dapat memperlambat program Anda, karena untuk setiap klik tombol Anda harus menunggu halaman dimuat, dan untuk melakukan apa yang perlu Anda lakukan, Anda harus memiliki kecepatan karena banyak tautan :D.

Ada dokumentasi bagus tentang BeautifulSoup: http://www.pythonforbeginners.com/beautifulsoup/beautifulsoup-4-python

Api yang bagus untuk python: aws.amazon.com/python

person Joao Pedro Lopes Mendes    schedule 08.06.2018
comment
Halaman awal adalah halaman JavaScript. Saya memerlukan Selenium untuk mengklik tombol - person Abhijeet Pal; 08.06.2018
comment
Kemudian gunakan scrapy - person Joao Pedro Lopes Mendes; 08.06.2018
comment
Alasan apapun? karena saya harus menggunakan Selenium di sana juga Splash tidak berfungsi di mesin saya - person Abhijeet Pal; 08.06.2018
comment
Coba cari api amazon, saya tidak tahu apakah ada api untuk itu, tapi patut dicoba :D - person Joao Pedro Lopes Mendes; 08.06.2018
comment
Scrapy benar-benar cara terbaik untuk melakukannya. - person Joao Pedro Lopes Mendes; 08.06.2018

Amazon memiliki mekanisme anti-scraping yang jika mendeteksi scraping, Amazon akan menggunakan captcha pada scraper sehingga masalah Anda adalah ia mengembalikan html untuk captcha dan Anda tidak menemukan apa pun.

Satu-satunya cara yang dapat diandalkan untuk mengikis amazon adalah dengan menggunakan Selenium versi tanpa kepala.

person Dennis Cafiero    schedule 29.05.2019