除了在本地iframe中加载数据之外,还有其他方法可以实现可视化Web刮刀吗?

时间:2016-09-01 17:53:04

标签: web-scraping extract screen-scraping

我看到了Portia的视频,我正在考虑如何实施这样的工具。基本上,有一个Web应用程序,您将在其中输入URL,它将加载(如果您将其加载到独立的浏览器选项卡中),然后您将能够单击页面中的元素,并直观地选择您要提取的数据。

我目前的想法是:

  1. 使用无头浏览器检索网站内容
  2. 在网络应用中有一条路线,可以提供抓取的内容
  3. 将路线嵌入数据选择页面的iframe中,以绕过相同的原始政策
  4. 集成一些JavaScript元素检查器库,以便能够直观地标记要被删除的元素
  5. 生成一组选择器
  6. 使用选择器提取数据
  7. 我很感兴趣是否有/其他方法来处理这个问题,特别是第1部分到第3部分。

2 个答案:

答案 0 :(得分:2)

这可能不是问题的完整答案,而是与我分享我的经验。

在我参与的其中一个项目中,我们有一个 Chrome浏览器扩展程序,可以在页面上直观地查明/选择元素,给他们"名称&# 34;并保存(我们称之为进程"注释"),这导致在数据库中创建包含目标站点URL,字段名称和生成的CSS选择器或XPath表达式的记录。

扩展程序基于selectorgadget library

根据我的记忆,生成的定位器要么是绝对的(从htmlbody根开始),要么只能使用元素的id属性或父元素之一元素 - 类似于"复制XPath"和"复制CSS路径"工具在FireBug中工作。

然后,我们有一个非常广泛的Scrapy蜘蛛,它使用数据库中准备好的注释来抓取任何网站。嗯,这太好了,很容易成为现实。当然,我们必须添加自定义代码来处理重型动态网页,机器人检测,flakiness和不同的网站特定逻辑。

(将更多地改进答案)。

答案 1 :(得分:2)

请注意,您想要抓取的对象可能不活跃(例如,他们不会对点击或按键做出响应)。

即使他们这样做,他们也可能无法处理元键,例如Ctrl或Shift。

所以你可以做的就是像对待代理一样构建你的系统,重写内部URL(你无论如何都需要这样做),除了你还要注入Javascript代码对点击做出反应。

然后您不需要IFRAME,只需导航到www.your-scraper.com,在表单中请求www.site-to-scrape.com,随机分配dab3b19f并重定向到dab3b19f.your-scraper.com - 并且会看到www.site-to-scrape.com的版本,其中所有(文本?)对象对Ctrl-Click作出反应。

然后,用户应该可以正常移动到站点,除了持有例如单击时按Ctrl键不会将单击传递给单击的对象,而是传递给可以识别事件目标并计算其CSS路径的处理程序,然后在按需附加到DOM的固定DIV中弹出一个抓取菜单,并且在关闭时删除。

这意味着您需要检测并劫持网站可能加载的几个可能的Javascript库。如果事情继续下去,可能你还需要修改一些反刮除代码(例如,网站可能会检查DOM完整性或尝试将处理程序重写为默认状态)。

同时,您还可以拦截并记录正常点击,以便能够复制,直到某一点(这取决于网站的动态程度,以及如何与无头浏览器进行交互)。这将允许您自动重新导航网站,更改页面等,以达到各种对象。然后,您将得到一系列选择器和导航提示,可用于从导航页面中提取数据:

start
click        #menu ul[2] li[1] span
click        .right.sidebar[1] ul[1] li[5] input[type="checkbox"]
click        .right.sidebar[1] ul[1] li[5] button
scrape(TICK) #prices div div[2] div div span p
scrape(PRIC) #prices div div[2] div div span div span[2] p

然后可以修改抓取脚本以添加循环。不过这是后来的事。

你最终会得到与Selenium不太相似的东西。实际上,您可能需要考虑turning Selenium to your purpose的可能性。