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
相关产品推荐
相关产品推荐

