屏幕抓取陷阱

Din*_*nah 4 language-agnostic screen-scraping

当屏幕刮擦时,需要注意哪些"问题"?

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

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

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

And*_*ore 8

不要使用正则表达式刮

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

我建议你做的是使用DOM解析器,如BeautifulSoup或等效的(PHP中的SimpleHTMLDom).

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

可以设计正则表达式以实现相同的目标,但是会受到限制.例如,开发一个正则表达式以获取srcalt标签会强制该alt属性src在相反或相反之后,并且克服此限制会增加正则表达式的复杂性.

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

<\s*?img\s+?[^>]*?\s*?src\s*?=\s*?(["'])((\\?+.)*?)\1[^>]*?>
Run Code Online (Sandbox Code Playgroud)

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

  • 属性或标记名称为大写,并且不使用i修饰符.
  • src属性周围不使用引号.
  • 然后另一个属性src在其值的某处使用>字符.
  • 我没有预料到的其他一些原因.

因此,再次,不要使用正则表达式来解析dom文档.


Nel*_*son 7

我屏幕刮了很多.一些忠告:

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