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)
关键修改说明
- 修正域名配置:把
allowed_domains改成['academic.oup.com'],确保后续翻页请求不会被过滤。 - 调整条目选择器:用
div.al-citation-list定位每个结果条目,确保能找到所有目标内容。 - 完善信息提取:新增标题、作者的提取逻辑,DOI链接用
response.urljoin转成绝对路径。 - 修复页码比较:把
current_page和total_pages转成整数,用<进行数值比较,逻辑更准确。 - 增加空值判断:对下一页链接做非空判断,避免出现无效请求。
运行修改后的代码,就能正常爬取多页的标题、作者、DOI信息,导出JSON也不会为空了。
内容的提问来源于stack exchange,提问作者stackword_0
相关产品推荐
相关产品推荐

