请考虑以下链接: https://www.michaelkors.com/logo-tape-ribbed-stretch-viscose-sweater/_/R-US_MH86NXK5ZW
向下滚动后,您会在此页面上看到建议。我想获得这些产品的标题。我试过使用这个:
response.xpath('//div[@class="product-tile-container"]/a/@src').getall()
但是,它什么也不返回。原因可能是产品是延迟加载的。我应该如何提取他们的标题。
答案 0 :(得分:0)
我不熟悉Python,但是您的XPath无法匹配。尝试使用//div[contains(@class, "product-tile-container")]//a//img/@src
。单斜杠表示该元素是前一个的直接子级。双斜杠表示您希望所提到的元素位于当前元素的层次结构中。
如果为类div
:product-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呈现页面,我建议您使用splash和scrapy-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']