如何修改Scrapy代码提取ICLR 2019海报论文的标题与PDF链接?
修正ICLR 2019海报论文爬虫的方案
你的爬虫代码无法获取所有论文数据,主要是几个关键问题导致的,咱们来一步步修正:
原代码的核心问题
- 固定ID选择器:你用了
maincard_704这个单个论文卡片的ID,只能抓取这一篇论文,无法遍历页面上所有的海报论文。 - 独立提取标题和链接:分开提取所有标题和链接再用
zip拼接,很容易因为两者数量不匹配导致数据错位,而且无法保证标题和对应链接的关联性。 - XPath路径错误:提取链接时用了绝对路径
/@href,这会从根节点开始查找,而不是当前链接节点的属性,导致无法正确获取href值。
修改后的完整代码
class ICLRCrawler(Spider): name = "ICLRCrawler" allowed_domains = ["iclr.cc"] start_urls = ["https://iclr.cc/Conferences/2019/Schedule?type=Poster", ] def parse(self, response): # 获取所有论文卡片节点 papers = response.xpath('//*[@id="content"]/div/div[@class="paper"]') for paper in papers: item = PapercrawlerItem() # 从当前论文卡片内提取标题(相对路径) title_text = paper.xpath('./div[3]/text()').get() item['title'] = title_text.strip() if title_text else "无标题" # 提取PDF链接:用文本包含"PDF"的a标签,更鲁棒,不依赖固定位置 pdf_href = paper.xpath('.//a[contains(text(), "PDF")]/@href').get() item['pdf'] = response.urljoin(pdf_href) if pdf_href else "" item['sup'] = '' yield item
关键修改点说明
- 遍历单个论文卡片:先获取所有
class="paper"的节点,然后逐个处理每个卡片,确保标题和链接属于同一篇论文,彻底避免数据错位问题。 - 使用相对XPath:在每个
paper节点内部,用./开头的相对路径查找子元素,确保只在当前论文卡片范围内搜索。 - 鲁棒的链接匹配:用
contains(text(), "PDF")来定位PDF链接,比依赖固定的div[6]/a[2]更可靠,避免页面结构小变动导致爬虫失效。 - URL补全:用
response.urljoin()把相对路径的PDF链接补全为完整URL,确保链接可直接访问。 - 空值处理:添加了简单的空值判断,避免因为部分论文没有标题或PDF链接导致爬虫抛出异常。
内容的提问来源于stack exchange,提问作者GoingMyWay
相关产品推荐
相关产品推荐

