【问题标题】:Scrapy + Splash: scraping element inside inner htmlScrapy + Splash:在内部 html 中抓取元素
【发布时间】: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


【解决方案1】:

问题是 iframe 内容没有作为 html 的一部分返回。您可以尝试直接获取 iframe 内容(通过其 src),或使用带有 iframes=1 选项的 render.json 端点:

# ...
    yield SplashRequest(url, self.parse_result, endpoint='render.json', 
                        args={'html': 1, 'iframes': 1})

def parse_result(self, response):
    iframe_html = response.data['childFrames'][0]['html']
    sel = parsel.Selector(iframe_html)
    item = {
        'my_field': sel.xpath(...),
        # ...  
    }

/execute 端点不支持从 Splash 2.3.3 获取 iframe 内容。

【讨论】:

  • “sel = parsel.Selector (...)”出现错误,这是我需要导入的库吗?
  • 是的,您需要导入它 (import parsel)。另请注意,xpath 不应包含 iframe 之外的任何内容 - 将 iframe 内容作为单独的文档处理。
  • 另外,您可能需要使用不同的 iframe;我写了['childFrames'][0] 作为示例-索引可能不同。
  • 我不明白 - 您的意思是您采用的数字索引 ([0]) 可能不同,或者 ['childFrames'] 的调用方式可能不同?
  • 如果网页有多个 iframe,而您感兴趣的 iframe 不是第一个,则必须使用适当的索引而不是 0。
【解决方案2】:

处理 iframe 的另一种方法可以是(响应主页):

    urls = response.css('iframe::attr(src)').extract()
    for url in urls :
            parse the url

这样 iframe 就像普通页面一样被解析, 但目前我无法将主页中的 cookie 发送到 iframe 中的 html,这是一个问题

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2019-06-18
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多