除了将数据加载到本地 iframe 之外,还有其他方法可以实现可视化网络抓取工具吗?
Are there other ways of implementing a visual web scraper besides loading the data inside a local iframe?
我看了 Portia 的视频,我在想如何实现这样的工具。基本上,拥有一个网络应用程序,您可以在其中输入 URL,它会加载(就像您将它加载到独立的浏览器选项卡中一样),然后您就可以单击页面中的元素,并在视觉上 select 您要提取的数据。
我目前的一个想法是:
- 使用无头浏览器检索网站内容
- 在 web 应用程序中有一个路由,可以为抓取的内容提供服务
- 在数据 selection 页面的 iframe 中嵌入路由,以绕过同源策略
- 集成一些 JavaScript 元素检查器库,以便能够直观地标记要抓取的元素
- 生成一组select或
- 使用 selectOR 提取数据
我很感兴趣是否有 are/what 其他方法来处理这个问题,特别是第 1 部分到第 3 部分。
这可能不是问题的完整答案,但可以分享我的经验。
在我参与的其中一个项目中,我们有一个 Chrome 浏览器扩展 允许 pinpoint/select 在页面上可视化元素,给它们 "names" 并保存(我们称该过程为 "annotation"),这导致在数据库中创建一条记录,其中包含目标站点 URL、字段名称和生成的 CSS 选择器或 XPath 表达式。
扩展基于 selectorgadget
library。
根据我的记忆,生成的定位符要么是绝对的(从非常 html
或 body
根开始),要么只能使用元素的 id
属性或一个父元素 - 类似于 "Copy XPath" 和 "Copy CSS Path" 工具在 FireBug.
中的工作方式
然后,我们有一个非常广泛的 Scrapy 蜘蛛,它使用数据库中准备好的注释来抓取任何网站。好吧,那太好了,太容易成为事实。当然,我们必须添加自定义代码来处理繁重的动态网页、机器人检测、脆弱性和不同的网站特定逻辑。
(将进一步改进答案)。
考虑到您要抓取的对象可能不活跃(例如,它们不响应点击或按键)。
即使他们这样做,他们也可能不会处理 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 路径,然后在固定的 DIV 中弹出一个抓取菜单根据需要附加到 DOM,并在关闭时删除。
这意味着您需要检测并劫持站点可能正在加载的几个可能的 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. In fact you might want to consider the possibility of turning Selenium to your purpose 的东西。
我看了 Portia 的视频,我在想如何实现这样的工具。基本上,拥有一个网络应用程序,您可以在其中输入 URL,它会加载(就像您将它加载到独立的浏览器选项卡中一样),然后您就可以单击页面中的元素,并在视觉上 select 您要提取的数据。
我目前的一个想法是:
- 使用无头浏览器检索网站内容
- 在 web 应用程序中有一个路由,可以为抓取的内容提供服务
- 在数据 selection 页面的 iframe 中嵌入路由,以绕过同源策略
- 集成一些 JavaScript 元素检查器库,以便能够直观地标记要抓取的元素
- 生成一组select或
- 使用 selectOR 提取数据
我很感兴趣是否有 are/what 其他方法来处理这个问题,特别是第 1 部分到第 3 部分。
这可能不是问题的完整答案,但可以分享我的经验。
在我参与的其中一个项目中,我们有一个 Chrome 浏览器扩展 允许 pinpoint/select 在页面上可视化元素,给它们 "names" 并保存(我们称该过程为 "annotation"),这导致在数据库中创建一条记录,其中包含目标站点 URL、字段名称和生成的 CSS 选择器或 XPath 表达式。
扩展基于 selectorgadget
library。
根据我的记忆,生成的定位符要么是绝对的(从非常 html
或 body
根开始),要么只能使用元素的 id
属性或一个父元素 - 类似于 "Copy XPath" 和 "Copy CSS Path" 工具在 FireBug.
然后,我们有一个非常广泛的 Scrapy 蜘蛛,它使用数据库中准备好的注释来抓取任何网站。好吧,那太好了,太容易成为事实。当然,我们必须添加自定义代码来处理繁重的动态网页、机器人检测、脆弱性和不同的网站特定逻辑。
(将进一步改进答案)。
考虑到您要抓取的对象可能不活跃(例如,它们不响应点击或按键)。
即使他们这样做,他们也可能不会处理 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 路径,然后在固定的 DIV 中弹出一个抓取菜单根据需要附加到 DOM,并在关闭时删除。
这意味着您需要检测并劫持站点可能正在加载的几个可能的 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. In fact you might want to consider the possibility of turning Selenium to your purpose 的东西。