You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬虫指定分页URL却抓取首页数据的问题求助

问题

我正在开发一个Scrapy爬虫用于抓取某网站的ETF数据,需要实现分页抓取功能。我将第二页的URL设置为start_urls,但实际运行时,控制台显示已爬取指定的分页URL,却抓取到了基础URL(即第一页)的数据。

代码

class EtfsSpider(scrapy.Spider):
    name = "etfs"
    start_urls = ['https://etfdb.com/etfs/asset-class/bond/#etfs&sort_name=assets_under_management&sort_order=desc&page=2']

def parse(self, response):
        etf_table = response.css('table#etfs tbody')

        for etf in etf_table.css('tr'):
            symbol = etf.css('td[data-th="Symbol"] a::text').get()
            name = etf.css('td[data-th="ETF Name"] a::text').get()
            total_assets = etf.css('td[data-th="Total Assets ($MM)"]::text').get()
            avg_daily_vol = etf.css('td[data-th="Avg. Daily Volume"]::text').get()
            closing_price = etf.css('td[data-th="Previous Closing Price"]::text').get()

            yield {
                "symbol": symbol,
                "name": name,
                "total assets": total_assets,
                "average daily volume": avg_daily_vol,
                "last closing price": closing_price
            }

控制台输出

2022-08-13 22:36:44 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://etfdb.com/robots.txt> (referer: None)
2022-08-13 22:36:45 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://etfdb.com/etfs/asset-class/bond/#etfs&sort_name=assets_under_management&sort_order=desc&page=2> (referer: None)
2022-08-13 22:36:46 [scrapy.core.scraper] DEBUG: Scraped from <200 https://etfdb.com/etfs/asset-class/bond/>
{'symbol': 'BND', 'name': 'Vanguard Total Bond Market ETF', 'total assets': '$84,446.60', 'average daily volume': None, 'last closing price': '$75.95'}

解决方案

问题出在URL的参数位置——#后面的内容是锚点(fragment),只会被浏览器解析,服务器不会处理这些参数,所以请求实际返回的还是第一页的数据。

1. 修正URL参数位置

把分页、排序参数移到#前面,作为查询参数(用?开头,参数间用&分隔),正确的第二页URL应该是:

https://etfdb.com/etfs/asset-class/bond/?sort_name=assets_under_management&sort_order=desc&page=2#etfs

修改start_urls为这个地址即可。

2. 验证请求有效性

修改后运行爬虫,检查控制台输出的Scraped from地址是否包含分页参数,同时确认抓取到的数据是否为第二页内容(比如BND是第一页的第一个条目,第二页不会出现它)。

3. 多页自动抓取扩展

如果需要自动爬取所有分页,可以在parse方法中提取下一页按钮的href属性,然后通过scrapy.Request发送请求,继续调用parse方法处理后续页面。

内容的提问来源于stack exchange,提问作者YungOne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:06:48