【发布时间】:2017-06-20 15:47:28
【问题描述】:
我正在使用 Scrapy + Splash 抓取网页并尝试从 google 广告横幅和其他广告中提取数据,但我很难通过 xpath 进入其中。
我正在使用Scrpay-Splash API 来呈现页面,以便加载它们的脚本和图像并截取屏幕截图,但似乎谷歌广告横幅是由 JS 脚本创建的,然后将其内容插入到 iframe 内的新 html 文档中在网页中,如:
Splash 确保代码已呈现,因此我不会遇到 scrapy 的脚本常见问题,即它读取脚本的内容而不是生成的 html——但我似乎无法找到一种方法来指示获取我需要的元素节点所必需的 XPath(广告的 href 链接)。
如果我在 google 中检查元素并复制它的 xpath,它只会给我//*[@id="aw0"],如果 iframe 的 html 就在这里,我觉得它会起作用,但无论我怎么写它都会返回空,我觉得这可能是因为 XPath 不能优雅地处理堆叠在 html 文档中的 html 文档。
包含 google 广告代码的 iframe 的 XPath 是
//*[@id="google_ads_iframe_/87824813/hola/blogs/home_0"]{数字不变}。
有没有办法将这些 XPath 堆叠在一起,让 scrapy 跟踪到我需要的容器中?或者我应该以其他方式直接解析 Splash 响应对象,并且我不能依赖 Response.Xpath/Response.CSS 吗?
【问题讨论】:
-
您是否尝试在 scrapy shell 中打开请求?请参阅this SO question,更具体地说是 Mikhail Korobov 的答案。将它与
view(response)一起使用应该让您有更好的机会找到错误/测试您的 xpath。 -
Mikhail 的回答 [关于您链接到的另一个 SO 问题] 似乎是朝着正确方向的一个很好的提示,不幸的是我不明白他的意思或如何按照他的建议去做。我尝试在scrapy shell中运行请求,但我可以看到他的响应是iframe的内容根本没有被解析——我理解这是正常的,因为scrapy不会渲染它们但splash会。我会尝试看看是否可以在飞溅外壳上执行此操作。
标签: xpath scrapy scrapy-splash