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

Scrapy多页面爬取DOI失败求助:结果为空无法翻页

问题分析与修复方案

核心问题点

  • 域名配置错误:allowed_domains带了https://,Scrapy会过滤掉不符合域名的请求,导致多页爬取直接中断。
  • 条目选择器失效:原代码用a.al-citation-list定位结果条目,但实际页面中条目容器是div.al-citation-list,根本找不到目标元素,所以输出为空。
  • 页码比较逻辑错误:字符串类型的页码直接比较会出现逻辑偏差,比如"9"和"10"字符串对比时,"9"会被判定为大于"10",导致提前终止翻页。
  • 下一页URL未转绝对路径:提取的下一页链接可能是相对路径,直接请求会失败。

修改后的完整代码

import scrapy

class PhotosynSpiderSpider(scrapy.Spider):
    name = 'photosyn_spider'    
    allowed_domains = ['academic.oup.com']  # 去掉https://,只保留域名
    start_urls = ['https://academic.oup.com/plphys/search-results?q=photosynthesis&allJournals=1&fl_SiteID=6323']

    def parse(self, response):
        # 遍历每个结果条目
        for item in response.css('div.al-citation-list'):
            # 提取标题
            title = item.css('h3.al-citation-title a::text').get().strip()
            # 提取作者(处理多个作者的情况)
            authors = ', '.join(item.css('div.al-citation-authors a::text').getall())
            # 提取DOI链接(拼接成完整URL)
            doi_href = item.css('div.al-citation-links a[href*="/doi/"]::attr(href)').get()
            doi_url = response.urljoin(doi_href) if doi_href else None
            
            yield {
                'title': title,
                'authors': authors,
                'doi_url': doi_url
            }

        # 处理翻页逻辑
        page_numbers = response.css('div.pageNumbers.al-pageNumbers')
        current_page = int(page_numbers.css('span.current-page::text').get())
        total_pages = int(page_numbers.css('span.total-pages::text').get())

        if current_page < total_pages:
            next_page_href = response.css('a.sr-nav-next.al-nav-next::attr(href)').get()
            if next_page_href:
                next_page_url = response.urljoin(next_page_href)
                yield scrapy.Request(next_page_url, callback=self.parse)

关键修改说明

  1. 修正域名配置:把allowed_domains改成['academic.oup.com'],确保后续翻页请求不会被过滤。
  2. 调整条目选择器:用div.al-citation-list定位每个结果条目,确保能找到所有目标内容。
  3. 完善信息提取:新增标题、作者的提取逻辑,DOI链接用response.urljoin转成绝对路径。
  4. 修复页码比较:把current_page和total_pages转成整数,用<进行数值比较,逻辑更准确。
  5. 增加空值判断:对下一页链接做非空判断,避免出现无效请求。

运行修改后的代码,就能正常爬取多页的标题、作者、DOI信息,导出JSON也不会为空了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:38:27