Hawk使用补充说明

  1. 云栖社区>
  2. 博客>
  3. 正文

Hawk使用补充说明

长征6号 2016-06-26 11:03:00 浏览559
展开阅读全文

软件在发布后,收到了各方朋友的反馈和提问。此处统一对一部分问题作出回复。

感谢你使用Hawk,软件是我写的,坑是我挖的。做爬虫本来就比较复杂,一些公司有专门的程序员做爬虫工程师。因此如果你很沮丧,很有可能是网站做了不少策略,确实很难爬。哎,这也是没有办法的事情。
闲话不说,进入正题。

1.自动嗅探失败

网页采集器具备自动嗅探功能,本质上是替换掉了底层的代理。因此,所有的请求都通过Hawk内部,自然就能根据需求筛选出所需的请求。

但有些系统中安装了类似360等工具,会拒绝这类操作。导致嗅探失败。目前原因还没有找到。一些网站做了加密,因此即使输入检索字段,内容也不一定能检索得到。

即使嗅探失败也没有关系,如果你使用Chrome等浏览器,进入开发者工具(F12):
image_1ao1q9le113a01mn4scu1q22g7mm.png-118.2kB

选择最上角的network卷展栏,之后刷新网页,chrome会列出所有的请求,一般最上面的就是真实请求:
image_1ao1qf5fo1geqsf13be1mpi1lia9.png-68.5kB
点击view source,将所有文本,拷贝到网页采集器,对应的高级设置-请求参数里即可。其实,Hawk做的也是类似的操作。

2.被封锁问题

被封锁有几个原因:

2.1 被网站识别为非浏览器

出现这种情况的原因是请求参数为空,没有模拟为浏览器(user-agent),如大众点评只防此类爬虫。

最新改进的版本中,Hawk默认请求参数已经加入了user-agent,因此能解决掉一大部分初级问题。

2.2 频繁访问

这取决于网站如何认定是同一个使用者。

  • 有的网站认为同一台机器的不同浏览器也是不同的用户。
  • 有的网站认为只要IP相同,则使用者一定相同

对前一种情况,可以随机在一大批User-agent列表中挑选一条,模拟为不同的浏览器,就能大大降低被PB的概率。典型的例子如豆瓣。

对后一种情况,很不幸需要使用真正的代理,或使用分布式方案。免费代理通常都不稳定,而付费代理则需要付费,很少有人愿意为了爬虫付钱(一脸黑线)。

因此,Hawk会考虑提供第一种情况的解决方案,但不会自动开启,而是在用户需要的时候手工开启。

而自动代理切换,目前Hawk不会提供支持。原因更多考虑的是技术之外的因素。

3.抓取动态请求

这是被问的最多的问题。加载一个完整的网页,可能需要几十次请求,不少请求是ajax和动态的,而不少数据都保存在这些请求之中。

最早版本的Hawk内置了一个IE内核的浏览器,后来取消了这个功能。原因很简单:

  • 内置浏览器,导致过分复杂
  • 无法多线程抓取
  • 大量无用的请求,导致抓取速度变慢
  • 即使内置浏览器,也不见得能抓取所有动态请求

因此,纯HttpClient能够精确并只抓取你想要的内容,只要正确构造它即可。
如何使用?你需要配置一个网页采集器
将它的行为,模拟到和浏览器一致。

第一种方法,查看浏览器的请求,参考本文的第一条方法,将请求详情复制过来,注意选择GET和POST。

之后,将嗅探到的地址拷贝到网页采集器的URL输入框中,查看是否能正确获取内容。
如果是POST请求,就更复杂一些。在数据清洗模块中,网页采集器拖入的列需要是对应的URL,你还需要构造出每次访问的post数据,单独作为一列。在网页采集器中如下配置:
image_1ao1rk5bb1am4pl31j2l1a0l1otpm.png-18.7kB
注意列名需要用方括号括起来,否则每次POST数据都会是所填的数据。

第二种方法,自动嗅探,下一篇文章我们去抓淘宝,该文章会详细介绍如何使用自动嗅探来模拟动态请求。

4.分布式方案

真正的爬虫是分布式的。用客户端去抓取,只适合于小打小闹的场合。后来的实际情况也证明了这点,分布式能够充分利用网络带宽,将任务分配到不同地域的计算机上,还能避免被封锁。

Hawk当然没有支持分布式方案,但我完成的etlpy已经初步具备了这个功能。但是因为恼人的Python和C#的XPath兼容性问题,我一直不能保证Hawk生成的xml一定被etlpy解析。

同样,etlpy做了非常大的变动,之前为了节省几行代码而使用的诡异的FP的风格被我改成了OO。etlpy是我重点发展的方向,Hawk在未来的发展并不明朗,也许不会继续做大的维护了。因为目前来看,C#可能在我之后的工作生涯中都不会使用了。

5.验证码问题

这也是问的非常多的问题,很不幸,不支持。验证码各种各样,简单到纯数字,复杂到12306,图像转文本涉及到太多的不确定因素。

解决方案也有,一些网站提供识别验证码的接口API,因此你可以让Hawk去模拟网站的API,将图片地址传递过去,API会自动返回验证码。坏消息是这个一般需要收费。
不过,能配置Hawk去做这样的请求的人,一定也能够写Python了,算了,他还是去写Python吧,别跳Hawk这个坑了。

6.XPath搜索相关问题

网页采集器中,填写关键字,却发现无法找到XPath。
可能的原因:

网页是动态网页

因此本链接不包含该关键字,建议考虑使用嗅探方案

关键字太长

是文本中包含不可见字符时经常出现。例如 340[制表符]万,但用户可能会直接输入340万。Hawk搜索是按照严格字符串匹配的,就会匹配不成功,因此输入短一些,如340

和 Chrome等浏览器得到的XPath不同

一方面,XPath的表示方法有很多种,这和正则类似。可能看起来不一样的XPath指代的都是同一个节点。
另一方面,Chrome会执行js代码,而js可能会改变网页的结构,因此XPath也就对应地发生变化了。这会通常会导致从Chrome拷贝出来的XPath在Hawk中不能使用。
Hawk未来不会考虑支持加入执行js代码的功能,因此,如果搜索XPath,还请以Hawk得到的结果为准。多搜多看,通常就能建立感觉。

7. 手气不错的问题

很多人使用手气不错会失败。这是因为:

不是所有的网页都支持直接点击【手气不错】

手气不错需要特定的网页结构(列表),如果整个网页没有显著的列表节点,则搜索失败,此时就会提示 手气不错失败。

手气不错会自动规约父节点

使用手气不错后,嗅探器会找到列表节点的父节点,以及挂载在父节点上的多个子节点,从而形成一个树状结构

  • 父节点(/html/div2/div3/div[4])
  • 子节点1(/a1)
  • 子节点2(/a2/@href)
  • 其他省略

有时候,父节点的xpath是不稳定的,举个例子,北京上海的二手房页面,上海会在列表上面增加一个广告banner,从而真正的父节点就会发生变化。为了应对这种变化,通常的做法是手工修改【父节点XPath】,继续举例子,父节点的id为house_list,且在网页中全局唯一,你就可以使用另外一种父节点表示法//*[@id='house_list'](写法可以参考其他XPath教程),而子节点表达式不变。
Hawk在【手气不错】得到【确定】后,会询问是否提取父节点XPath,此时Hawk会自动提取【父节点XPath】到属性对话框中,从而方便修改。

8.下一步计划

  • 在右侧界面右键添加连接器,如果配置不正确可能会造成闪退,已经修复。
  • 增加自动切换User-agent的功能
  • 优化用户体验设计。

有任何问题,欢迎邮箱联系buptzym@qq.com


作者:热情的沙漠
出处:http://www.cnblogs.com/buptzym/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


 本文转自FerventDesert博客园博客,原文链接:http://www.cnblogs.com/buptzym/p/5686694.html,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
长征6号
+ 关注