如何在网页上抓取建议

时间:2019-07-19 08:33:50

标签: python scrapy

请考虑以下链接: https://www.michaelkors.com/logo-tape-ribbed-stretch-viscose-sweater/_/R-US_MH86NXK5ZW

向下滚动后,您会在此页面上看到建议。我想获得这些产品的标题。我试过使用这个:

response.xpath('//div[@class="product-tile-container"]/a/@src').getall()

但是,它什么也不返回。原因可能是产品是延迟加载的。我应该如何提取他们的标题。

3 个答案:

答案 0 :(得分:0)

我不熟悉Python,但是您的XPath无法匹配。尝试使用//div[contains(@class, "product-tile-container")]//a//img/@src。单斜杠表示该元素是前一个的直接子级。双斜杠表示您希望所提到的元素位于当前元素的层次结构中。

如果为类divproduct-image-container

的任何//div[contains(@class, "product-tile-container")]//a/div[contains(@class, 'product-image-container')]//img/@src添加附加的路径检查,则可以使XPath更健壮。

我强烈建议您使用插件检查XPath,例如https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl

答案 1 :(得分:0)

您无法使用简单的抓取蜘蛛程序访问该数据,因为该页面是通过 JS 呈现的。您可以通过禁用浏览器的JS并刷新页面来尝试。您将看到一个空白页。如果进行检查,您会发现没有与产品相关的数据。

如果您想抓取该类型的JS呈现页面,我建议您使用splashscrapy-splash。它有据可查且易于使用。它是一种渲染服务,可让您抓取所需的数据。 (这是由scrapyhub(scrapy背后的精明大脑)支持的。)

答案 2 :(得分:0)

您可以使用selenium滚动到页面底部。但是,该站点仍然需要一段时间才能加载建议。因此,此解决方案通过使用while循环来等待,直到出现产品推荐部分:

from selenium import webdriver
from bs4 import BeautifulSoup as soup
import time
d = webdriver.Chrome('/Users/jamespetullo/Downloads/chromedriver')
d.get('https://www.michaelkors.com/logo-tape-ribbed-stretch-viscose-sweater/_/R-US_MH86NXK5ZW')
last_height = d.execute_script("return document.body.scrollHeight")
while True:
   d.execute_script("window.scrollTo(0, document.body.scrollHeight);")
   time.sleep(0.5)
   new_height = d.execute_script("return document.body.scrollHeight")
   if new_height == last_height:
     break
   last_height = new_height

start = soup(d.page_source, 'html.parser')
while start.find('div', {'class':'product-tile-rfk'}) is None:
   start = soup(d.page_source, 'html.parser')

products = [i.find_all('li', {'class':'product-name-container'})[0].text for i in start.find_all('div', {'class':'product-tile-rfk'})]

输出:

['Ribbed Stretch-Viscose Tank', 'Ribbed Stretch-Viscose Tank Top', 'Ribbed Stretch-Viscose Tank Top', 'Stretch-Viscose Tank', 'Striped Ribbed Sweater Tank', 'Tie-Dye Stretch-Viscose Sweater', 'Striped Stretch-Viscose Tank', 'Striped Stretch-Cotton Sweater', 'Rainbow Stretch-Viscose Short-Sleeve Sweater', 'Stretch-Viscose Cropped Tank', 'Neon Striped Stretch-Viscose Tank Top', 'Geometric Grid Stretch-Viscose Top', 'Logo Tape Stretch-Viscose Pullover', 'Logo Tape Stretch-Viscose Cropped T-Shirt', 'Logo Tape Cotton-Jersey Top', 'Logo Tape Viscose Joggers', 'Logo Tape Buttoned Track Pants', 'Contrast Stripe Joggers', 'Contrast Stripe Hooded Jacket', 'Logo Tape Stretch-Viscose Pencil Skirt', 'Logo Tape Stretch-Viscose Zip-Up Hoodie', 'Stretch-Viscose Joggers', 'Cotton Asymmetric Turtleneck', 'Logo Tape Ribbed Knit Dress']