python爬虫多页爬取只返回第一页的问题

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

运行如下

img

img

img

我尝试了直接从第二页开始爬,发现仍然是第一页的数据,应该是遇到了反爬了吧

解决办法:手动登录网站,然后将cookie复制下来,添加到请求头中.

【以下回答由 GPT 生成】

问题的核心在于无法获取到所有页的数据,只能获取到第一页的数据。可以通过分析网页结构和反爬措施来解决这个问题。

首先,我们需要分析网页的结构。在网页上翻页后,可以发现每个商品的URL都包含在<a>标签内。所以我们需要从第一页的响应中获取所有页的URL,并且遍历每一页去提取商品的数据。

为了绕过反爬措施,可以采取如下措施:

  • 使用User-Agent:设置不同的User-Agent,可以模拟不同的浏览器请求,降低被反爬机制识别的概率。
  • 设置延时:在请求网页之间加入适当的延时,模拟人的行为,避免频繁请求被反爬机制识别。
  • 使用代理IP:使用代理IP发送请求,可以隐藏真实的请求IP,提高请求的安全性。

以下是优化后的代码:

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_requestsparse中都添加了headers,将随机生成的User-Agent添加到请求头中。

为了绕过反爬措施,我们在parse方法中使用time.sleep(1)设置了1秒的延时,模拟人的操作行为。

此外,我们还新添加了一个parse_item方法,用于解析每个商品的具体数据。你可以根据实际情况完善这个方法,提取商品的相关信息。

通过以上优化,应该可以解决只能获取第一页数据的问题,并且绕过反爬措施获取到多页的数据。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^