• Hawk使用补充说明



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

    感谢你使用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

  • 相关阅读:
    Dockerfile文件详解
    docker-compose.yml文件
    Linux集中日志服务器rsyslog
    数据库连接池DBUtils使用
    js开关插件使用
    flask基础
    redis系列--深入哨兵集群
    Python算法基础
    redis系列--主从复制以及redis复制演进
    redis系列--redis4.0深入持久化
  • 原文地址:https://www.cnblogs.com/buptzym/p/5686694.html
Copyright © 2020-2023  润新知