屏幕抓取陷阱

时间:2009-07-29 03:14:06

标签: language-agnostic screen-scraping

当屏幕抓取时,需要注意哪些“问题”?

这个的灵感来自:我的配偶的同事让我从Blogger托管的博客中抓取所有页面,她的癌症朋友在最后几个月保留了这个页面,这位女士希望保留所有帖子以防万一博客被删除了。我最终找到了一个几乎不够好的免费工具。

抓取许多Blogger页面的一个问题是,通常会有一个导航菜单,您可以在其中单击三角形以按年或月扩展帖子列表。这些小错误创建了大量的重复内容,因为您在扩展/折叠的菜单的不同组合中反复使用相同的页面。在Blogger的情况下,我不确定这是可以避免的,因为链接都被格式化为真正的http链接而不是明显的JavaScript调用。不过,它让我想到了:

如果你要抓一个网站,你可以补偿什么样的潜在非显而易见的事情?

6 个答案:

答案 0 :(得分:8)

不要使用正则表达式来刮

虽然正则表达式可以适用于各种各样的任务,但我发现解析HTML DOM时通常会遇到这种情况。 HTML的问题在于,文档的结构变化很大,难以准确(并且准确地说,我的意思是100%的成功率,没有误报)提取标签。

我建议您使用DOM解析器,例如BeautifulSoup或等效的(PHP中的SimpleHTMLDom)。

有些人可能认为这样做有点过分,但最终会更容易维护,并且还可以提供更多的可扩展性。

可以设计正则表达式来实现相同的目标,但是会受到限制。例如,开发正则表达式以获取srcalt标记会强制alt属性位于src之后或相反,并且要克服此限制会添加正则表达式更复杂。

另外,请考虑以下内容。要使用正则表达式正确匹配<img>标记并仅获取src属性(在第2组中捕获),您需要以下正则表达式:

<\s*?img\s+?[^>]*?\s*?src\s*?=\s*?(["'])((\\?+.)*?)\1[^>]*?>

然后,如果出现以上情况,则上述情况可能会失败:

  • 属性或标记名称为大写,并且不使用i修饰符。
  • src属性周围没有使用引号。
  • 然后src的另一个属性使用&gt;在他们的价值的某个地方。
  • 我没有预料到的其他一些原因。

所以再一次,不要使用正则表达式来解析dom文档。

答案 1 :(得分:7)

我屏幕刮了很多。一些建议:

  1. 为您要使用的某些浏览器模拟User-Agent string。根据您的用户代理的不同,不同的网站经常会返回截然不同的结果。如果他们不认识用户代理,他们通常会恢复到最低公分母,所以通常最好从最近的浏览器开始。 (例如,如果它认为你是最近的Firefox,那么魔兽世界军械库将返回漂亮,易于解析的XML。如果它不知道你是什么,它会发送可怕的HTML)。
  2. 对你正在抓的网站礼貌;不要太难打。如果你多线程,你的刮刀会更快,一次发出许多请求,但这会使网站所有者烦恼。
  3. 了解错误处理。不要写像while(1){makeRequest(); }。如果您的代码或服务器抛出错误,则此类循环将立即获取另一个请求,从而生成另一个错误。它很快就会变丑。如果发现很多错误,请妥善处理错误并考虑进入睡眠状态或退出。
  4. 在开发解析代码时,请针对缓存版本进行测试,而不是每次都要访问服务器。将使您的开发更快,并且是简单测试套件的基础。

答案 2 :(得分:3)

首先,我要检查RSS提要。在博客上,如果我没记错的话,你只需要将/rss添加到根网址即可。

然后我会检查是否还有一些工具可以抓取博主。

然后,如果没有RSS提要,也没有现有的工具,我会放弃并手工复制/粘贴。除非我们说5000页,否则它会更快更轻松。从尝试过的人那里拿走它。

如果您可以访问实际帐户,则博客具有导出功能。

编辑:当然,你可以尝试机械土耳其人。

答案 3 :(得分:2)

就陷阱而言。限制在一段时间内提出的请求数量通常是个好主意。在很短的时间内粉碎一个有很多请求的网站是拒绝您的请求的好方法。

答案 4 :(得分:1)

除技术考虑外,请确保您不要将自己置于法律风险之中。大多数大型网站在其使用条款中都有特定的法律语言,不允许通过自动计算机程序以编程方式访问其服务,以及明显的版权问题。

从技术角度来看,绝对使用DOM解析器库,您将节省大量时间。许多提供了将HTML读入XML结构的能力,可以使用XPath查询,以便准确找到所需内容。

答案 5 :(得分:0)

如果您认识有权访问该帐户的人,则可以使用Blogger's export "Export blog" feature