Scrapy运行时修改Request URL翻页爬取失效问题
问题原因
你的代码有3个核心bug直接导致分页逻辑失效:
- 取值逻辑错误:你用
extract_first()拿到的results是单个字符串值(比如第一页取到的是"2"),后续写for result in results是在遍历这个字符串的每一个字符,根本不是遍历页码,拼出来的URL完全不符合预期,页码大于等于10的时候问题会更明显,会拆成单个字符生成错误地址。 - URL拼接逻辑错误:你硬编码依赖
self.start_urls[0]拼接分页地址,没有做路径适配,很容易出现路径层级错误、双斜杠等问题,请求到错误的页面地址自然拿不到目标DOM元素。 - 请求特征被站点识别:你没有配置正常的浏览器请求头,站点识别到是Scrapy爬虫请求后,第二页及后续页面会返回结构简化的响应内容,根本不带
id=load-more的元素,所以XPath永远取空,直接走到“last page”的终止逻辑。
补充:你贴的代码里parse方法缩进错误,没有归到PostsSpider类内部,如果实际运行也是这个缩进,第一页根本不可能正常执行,应该是复制代码的时候格式错位了。
修复后可运行代码
import scrapy from scrapy import Spider class PostsSpider(Spider): name = "posts" start_urls = [ 'https://www.boston.com/category/news/' ] # 配置浏览器UA,模拟正常用户请求,避免被站点返回差异化页面 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } def parse(self, response): # 这里写当前页的文章内容提取逻辑,先处理完当前页数据再翻页 print(f"当前处理页面地址:{response.url}") # 提取下一页页码,get()是Scrapy新版推荐写法,等价于旧版extract_first(),无匹配时返回None next_page_num = response.xpath("//*[contains(@id, 'load-more')]/@data-next-page").get() print(f"提取到的下一页标识:{next_page_num}") if next_page_num: # 用Scrapy自带的urljoin做路径拼接,自动适配当前页域名和路径,不需要硬编码起始地址 next_url = response.urljoin(f"page/{next_page_num}") yield scrapy.Request(url=next_url, callback=self.parse) else: print("所有分页遍历完成")
排查提示
如果改完后还是无法提取第二页的XPath内容,直接在parse方法里加print(response.text)打印第二页的原始响应内容,对照实际返回的HTML写XPath即可——不要直接抄浏览器开发者工具Elements面板里的DOM结构,异步加载的分页内容很多是JS动态插入的,原始响应的结构和渲染后结构经常不一致。
内容的提问来源于stack exchange,提问作者Shahab Ali
相关产品推荐
相关产品推荐

