我试图得到的https://www.salewa.com/de-de/herren产品使用下面的代码.问题是,当next_page
转到/de-de/herren?p=4
时,它不产生任何项。在浏览器上,它是无限滚动的,一直滚动到p=9
。因此,我的代码只产生108个项目,而不是295个项目。之前我认为问题是空页,所以我想跳过它的if len(products) > 0:
,但现在它停止在第3页,并没有得到更多的产品。
import scrapy
from scrapy.selector import Selector
import re
import json
from scrapy import Spider, Request
from datetime import datetime as dt
import csv
class Salewa_Spider(Spider):
name = "salewa"
allowed_domains = ["salewa.com"]
start_urls = ["https://www.salewa.com/de-de/herren"]
def parse(self, response):
products = response.css('div.product--info')
for product in products:
yield{
'name' : product.css('h2.product--title::text').get().strip(),
'price': product.css('span.price--default::text').get().strip(),
'url' : product.css('a.product--information-box').attrib['href'],
}
if len(products) > 0:
try:
next_page = response.css('a[class^="listing-page--nav page--next"]').attrib['href']
except:
next_page = []
if next_page is not None:
next_page_url = 'https://www.salewa.com' + next_page
yield response.follow(next_page_url, callback=self.parse)
1条答案
按热度按时间p8h8hvxi1#
这是因为无限滚动是从一个不同的url调用获取信息,以填充产品信息。
中间页面的url可以通过浏览器开发工具的网络标签找到。你需要发现这个url是什么,并在你的scrapy请求中复制它,以便从无限滚动中获取其余的项目。
对于这个网站,具体的API URL是“https://www.salewa.com/de-de/widgets/listing/listingCount/sCategory/316582?p=1&c=316582&part={page number}&o=1&n=36&loadProducts=1”返回一个JSON对象,该对象包含该页面的所有HTML元素。
你可以做的是为每个页面发送单独的请求,从json对象中提取html,将其转换为scrapy选择器,然后你就可以像解析第一个页面一样解析信息。使用这种策略,我能够产生296个独特的结果
举例来说:
输出