用scrapy爬取stockx的25页数据,但每次结果只返回第一页的数据
代码如下
import scrapy
from scrapy_stockx.items import ScrapyStockxItem
class SneakrsSpider(scrapy.Spider):
name = "sneakrs"
allowed_domains = ["stockx.com"]
start_urls = ["https://stockx.com/zh-cn/sneakers/top-selling"]
base_url = 'https://stockx.com/zh-cn/sneakers/top-selling?page='
page = 1
def parse(self, response):
print("=======================================")
#获得商品详情页的url(即第二页的url)
s_list = response.xpath('//div[@id="browse-grid"]//a')
for s in s_list:
href = s.xpath('./@href').extract_first()
url_second = 'https://stockx.com' + href
print(url_second)
#对25页的全部商品进行一一爬取
if self.page < 25:
self.page += 1
url_next = self.base_url + str(self.page)
yield scrapy.Request(url=url_next, callback=self.parse)
运行如下
我尝试了直接从第二页开始爬,发现仍然是第一页的数据,应该是遇到了反爬了吧
解决办法:手动登录网站,然后将cookie复制下来,添加到请求头中.
【以下回答由 GPT 生成】
问题的核心在于无法获取到所有页的数据,只能获取到第一页的数据。可以通过分析网页结构和反爬措施来解决这个问题。
首先,我们需要分析网页的结构。在网页上翻页后,可以发现每个商品的URL都包含在<a>
标签内。所以我们需要从第一页的响应中获取所有页的URL,并且遍历每一页去提取商品的数据。
为了绕过反爬措施,可以采取如下措施:
以下是优化后的代码:
import scrapy
from scrapy_stockx.items import ScrapyStockxItem
import time
from fake_useragent import UserAgent
class SneakrsSpider(scrapy.Spider):
name = "sneakrs"
allowed_domains = ["stockx.com"]
start_urls = ["https://stockx.com/zh-cn/sneakers/top-selling"]
base_url = 'https://stockx.com/zh-cn/sneakers/top-selling?page='
page = 1
def start_requests(self):
# 使用不同的User-Agent
ua = UserAgent()
headers = {'User-Agent': ua.random}
yield scrapy.Request(url=start_urls[0], headers=headers)
def parse(self, response):
print("=======")
# 获得商品详情页的URL(即第二页的URL)
s_list = response.xpath('//div[@id="browse-grid"]//a')
for s in s_list:
href = s.xpath('./@href').extract_first()
url_second = 'https://stockx.com' + href
print(url_second)
yield scrapy.Request(url=url_second, callback=self.parse_item)
# 对25页的全部商品进行逐页爬取
if self.page < 25:
self.page += 1
url_next = self.base_url + str(self.page)
# 设置延时,模拟人的行为
time.sleep(1)
# 使用不同的User-Agent
ua = UserAgent()
headers = {'User-Agent': ua.random}
yield scrapy.Request(url=url_next, headers=headers, callback=self.parse)
def parse_item(self, response):
# 解析每个商品的具体数据
item = ScrapyStockxItem()
# 提取数据的逻辑...
return item
在优化后的代码中,我们首先使用了fake_useragent
库来随机生成User-Agent,模拟不同的浏览器请求。在start_requests
和parse
中都添加了headers
,将随机生成的User-Agent添加到请求头中。
为了绕过反爬措施,我们在parse
方法中使用time.sleep(1)
设置了1秒的延时,模拟人的操作行为。
此外,我们还新添加了一个parse_item
方法,用于解析每个商品的具体数据。你可以根据实际情况完善这个方法,提取商品的相关信息。
通过以上优化,应该可以解决只能获取第一页数据的问题,并且绕过反爬措施获取到多页的数据。
【相关推荐】