
在使用scrapy进行网页抓取时,开发者常常会遇到一个令人困惑的问题:精心调试的css选择器在浏览器开发者工具中能够准确匹配元素,但在scrapy爬取时却一无所获。这通常并非选择器本身有误,而是scrapy所见的网页内容与用户在浏览器中看到的内容存在本质差异。本文将深入探讨这一现象的原因,并提供实用的方法来验证scrapy实际获取的html,从而有效解决此类问题。
考虑一个典型的场景:你正在爬取两个结构相似的页面,例如https://dicionario.priberam.org/putear和https://dicionario.priberam.org/puteares。你使用了一个CSS选择器,例如div.dp-conteudo__esquerda span.varpb,期望从中提取特定的文本。在第一个页面上,该选择器成功返回了结果,但在第二个页面上,它却返回空值。
初步检查页面源代码可能会发现,第二个页面上确实存在一个带有varpb类的span标签,甚至可能出现在不同的父级元素下,但无论如何,Scrapy似乎都无法找到它。这种不一致性让开发者感到困惑,因为理论上,只要元素存在于HTML中,选择器就应该能够匹配。
问题的核心在于浏览器和Scrapy处理网页内容的方式不同。
回到我们的例子,第二个页面https://dicionario.priberam.org/puteares上的目标span.varpb元素很可能就是通过JavaScript在页面加载完成后动态添加到DOM中的。由于Scrapy不执行JavaScript,它在抓取时就无法“看到”这个动态添加的元素,因此选择器自然会失效。而第一个页面https://dicionario.priberam.org/putear上的相应元素可能直接包含在初始HTML中,所以Scrapy能够成功获取。
立即学习“前端免费学习笔记(深入)”;
理解了原因之后,解决问题的关键就是确保你的CSS选择器是基于Scrapy实际获取到的HTML内容来编写的。以下是两种验证Scrapy所见内容的方法:
Scrapy Shell是一个强大的交互式环境,允许你在不运行整个爬虫的情况下测试代码和检查响应。view(response)命令可以让你在浏览器中打开Scrapy当前处理的response对象所包含的HTML内容。这能直观地展示Scrapy到底“看到了”什么。
操作步骤:
scrapy shell 'https://dicionario.priberam.org/puteares'
In [1]: view(response)
这会打开一个新的浏览器窗口,显示Scrapy抓取到的原始HTML。你可以使用浏览器开发者工具检查这个页面,看看目标元素是否真的存在。
另一种更直接、更方便离线分析的方法是将Scrapy获取到的原始HTML内容保存到一个本地文件。
操作步骤:
在Scrapy Shell中fetch目标URL:
In [2]: fetch('https://dicionario.priberam.org/putear')
2023-12-28 00:22:01 [scrapy.core.engine] INFO: Spider opened
2023-12-28 00:22:01 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://dicionario.priberam.org/putear> (referer: None)将response.text写入一个本地HTML文件:
In [3]: with open('putear.html', 'wt', encoding='utf8') as fd:
...: fd.write(response.text)
...:对第二个页面重复上述步骤:
In [4]: fetch('https://dicionario.priberam.org/puteares')
2023-12-28 00:23:09 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://dicionario.priberam.org/puteares> (referer: None)
In [5]: with open('puteares.html', 'wt', encoding='utf8') as fd:
...: fd.write(response.text)
...:现在,你可以在本地文件系统找到putear.html和puteares.html这两个文件。用任何文本编辑器或浏览器打开它们,检查它们的源代码。你会发现,在puteares.html中,你期望的div.dp-conteudo__esquerda span.varpb结构很可能是不存在的,或者span.varpb元素位于完全不同的位置,导致你的原始选择器失效。
通过理解Scrapy与浏览器在处理动态内容上的差异,并利用上述验证方法,你将能更有效地调试和开发你的Scrapy爬虫,从而避免因HTML内容不一致而导致的抓取失败。
以上就是Scrapy CSS选择器失效:深入理解浏览器与爬虫获取HTML内容的差异的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号