Hawk使用补充说明
软件在发布后,收到了各方朋友的反馈和提问。此处统一对一部分问题作出回复。
感谢你使用Hawk,软件是我写的,坑是我挖的。做爬虫本来就比较复杂,一些公司有专门的程序员做爬虫工程师。因此如果你很沮丧,很有可能是网站做了不少策略,确实很难爬。哎,这也是没有办法的事情。
闲话不说,进入正题。
1.自动嗅探失败
网页采集器具备自动嗅探功能,本质上是替换掉了底层的代理。因此,所有的请求都通过Hawk内部,自然就能根据需求筛选出所需的请求。
但有些系统中安装了类似360等工具,会拒绝这类操作。导致嗅探失败。目前原因还没有找到。一些网站做了加密,因此即使输入检索字段,内容也不一定能检索得到。
即使嗅探失败也没有关系,如果你使用Chrome等浏览器,进入开发者工具(F12):
选择最上角的network卷展栏,之后刷新网页,chrome会列出所有的请求,一般最上面的就是真实请求:
点击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数据,单独作为一列。在网页采集器中如下配置:
注意列名需要用方括号括起来,否则每次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. 手气不错的问题
很多人使用手气不错会失败。这是因为:
不是所有的网页都支持直接点击【手气不错】
手气不错需要特定的网页结构(列表),如果整个网页没有显著的列表节点,则搜索失败,此时就会提示 手气不错失败。
手气不错会自动规约父节点
使用手气不错后,嗅探器会找到列表节点的父节点,以及挂载在父节点上的多个子节点,从而形成一个树状结构
有时候,父节点的xpath是不稳定的,举个例子,北京上海的二手房页面,上海会在列表上面增加一个广告banner,从而真正的父节点就会发生变化。为了应对这种变化,通常的做法是手工修改【父节点XPath】,继续举例子,父节点的id为house_list
,且在网页中全局唯一,你就可以使用另外一种父节点表示法//*[@id='house_list']
(写法可以参考其他XPath教程),而子节点表达式不变。
Hawk在【手气不错】得到【确定】后,会询问是否提取父节点XPath,此时Hawk会自动提取【父节点XPath】到属性对话框中,从而方便修改。
8.下一步计划
- 在右侧界面右键添加连接器,如果配置不正确可能会造成闪退,已经修复。
- 增加自动切换User-agent的功能
- 优化用户体验设计。
有任何问题,欢迎邮箱联系buptzym@qq.com
Hawk使用补充说明的更多相关文章
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- 设计爬虫Hawk背后的故事
本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)
在2.1.栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟. 其实只要在NuGet中安装两个包(Microsoft. ...
- Hawk 7. 常见问题
本页面您可以通过关键字搜索来获取信息. 理性使用爬虫 爬虫是一种灰色的应用,虽然作为Hawk的设计者,但我依然不得不这么说. 各大网站都在收集和整理数据上花费了大量的精力,因此抓取的数据应当仅仅作为科 ...
- Hawk 6. 编译和扩展开发
Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...
- Hawk 5.1 数据导入和导出
除了一般的数据库导入导出,Hawk还支持从文件导入和导出,支持的文件类型包括: Excel CSV(逗号分割文本文件) TXT (制表符分割文本文件) Json xml Excel 目前来看,Exce ...
- Hawk 5. 数据库系统
Hawk在设计之初,就是以弱schema风格定义的.没有严格的列名和列属性.用C#这样的静态强类型语言编写Hawk,其实并不方便.但弱schema让Hawk变得更灵活更强大. 因此,Hawk虽然之前支 ...
- Hawk 4.6 并行化
并行化 Hawk支持单机并行化,也就是使用多线程获取数据.它可以控制目前所有任务的数量,为了不给网站造成过大的压力,仅当任务池中的任务数量小于一定值后,才会插入新的任务. 你可以在数据清洗的 执行面板 ...
- Hawk 4.4 执行器
执行器是负责将Hawk的结果传送到外部环境的工具.你可以写入数据表,数据库,甚至执行某个特定的动作,或是生成文件等等. 在调试模式下,执行器都是不工作的.这是为了避免产生副作用.否则,每刷新一遍数据, ...
随机推荐
- 在php中定义常量时,const与define的区别?
问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...
- nmap
扫描端口 nmap -v -sS -open -iL iplist.txt -no-stylesheet -oX output.xml -p- -P0 -v 详细信息-sS 隐蔽扫描(半开syn).– ...
- MAC系统设置SSX教程与下载
http://ss.hongxingchajian.com MAC系统设置SSX教程与下载 1.下载客户端并安装,装完后打开 链接: http://pan.baidu.com/s/1o7ypp5g 密 ...
- 通过NFS(nfsroot)启动linux系统
Mounting the root filesystem via NFS (nfsroot) 英文原文位于inux内核源代码中的"Documentation/filesystems/nfs/ ...
- 新版 itextsharp pdf code
using System; using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; namespace iTextShar ...
- java实现全排列
前天上午的面试遇到了一个用java实现一串数字的全排列的题,想来想去用递归最方便,可是没有在规定的时间内完成555,今天上午有空便继续写,以下是完成后的代码: import java.util.Arr ...
- listview嵌套gridview,并实现grid元素部分显示以及点击展开与折叠
原文链接:http://blog.csdn.net/duguju/article/details/49538341 有时我们需要用GridView显示目录列表,有时甚至是二级的,即listview每一 ...
- 非常棒的Android对话框效果
FlycoDialog_Master http://www.see-source.com/androidwidget/detail.html?wid=488 带有各种动画效果的弹出对话框控件.你也可以 ...
- JQuery 获取父级元素、同级元素、子元素等
例: <div> <div id="div_1">这是内容1</div> <div id="div_2">这是内 ...
- CodeFirst实战:用文本数据库存档软件配置
背景: 以前要写软件的时候,在编写用户配置这一块时,由于存档数据库不靠谱或大题小作,所以一般是存在文本中. 一开始是一个文件保存一个配置(图个File.Read与File.Write的操作简单) 由于 ...