您的位置:首页 > 运维架构 > 网站架构

数据抓取之(一):抓取北京交通管理网站的车辆违法信息(已完结)

2014-02-12 21:41 190 查看
http://blog.csdn.net/limenglin0927/article/details/17539171

本文地址:http://blog.csdn.net/limenglin0927/article/details/17539171

我的个人信息:

本猿92年小生一枚,10级三流本科院校的软件工程专业,今年2013年10月份开始实习,说长不长说短不短的时间混迹在中小型互联网公司,主要从事的java研发工作。更确切一点的职责则是数据方面的实现。

总的来说,还没彻底离开母校魔爪的我,并没有算法界底层级预研大牛们那么深厚的内功,也没有摸爬滚打项目之上十多年狮子(工程师)们那么华丽的招式,但我是一个深爱互联网行业的coder,哪怕是留下一点点足迹,我也要坚持的在这条路上走下去。

我的个人愿望:

希望大神也好、大虾也罢,对数据抓取这一块有研究或有兴趣的人士,能够一起讨论共磋技术、工程、爱好。谢谢!

最近开始进行一些数据的抓取工作,记得不知哪位业内大牛曾经说过:只要是在网页上能看到的东西,都可以获取过来,只是难易程度的问题。

互联网就像是一张充满神秘的大网,无数的行业、无数的机遇、无数的用户、无数的信息(数据)……在其上翻滚、沉涌,它充斥着数不尽的财富,能带给人们的也是不可想象的多。

心生了一个想法,把自己近期对不同网站数据进行的抓取,也有接下来会分析并抓取的

网上数据进行整理归档,也许沉淀久了之后会是一片数据抓取之路,也能和大家进行讨教、讨论和分享。生命不休,学习不止!

零、数据抓取的背景信息:

北京交通管理官网:http://www.bjjtgl.gov.cn/publish/portal0/tab72/
左边列框处有“车辆违法查询”模块

测试数据:京(车牌号+发动机号)
这个貌似是隐私,不便透露。所以如果各位自己有车的人士,可以使用自己的数据进行测试。

一、分析要抓取的站点

想要使用程序实现自动化获取某个站点的数据,第一步要做的当然就是手动的分析这个站点结构,数据生成的步骤,还有限制自动化的手段等等对接下来的自动化实现有帮助的信息。知己知彼,方能百战不殆!

这里我个人推荐的是一定要掌握使用 Chrome(谷歌浏览器) 对网站进行分析,能够熟练使用这个工具不仅仅能获益其中数据抓取方式,更是对你在前端技术的了解,系统架构设计上都有一些不大不小的知识学习到。厚积薄发,才是王道!

首先,手动的走一遍正常的查询流程:

图1-主页查询窗口

在chrome浏览器下按下F12按钮,启动chrome内置开发者调试工具。

既可以看到该页面的一些信息,如html源代码、页面元素结构树、css样式分布等等。

图2-chrome开发者调试工具截图

言归正传,更多的chrome使用规则和详情,不是我们要讨论的重点,这些内容还得大家自己去掌握和经常使用才能熟练。如果有需要的话,以后也会写专门的博文来进行分享和讨论。

输入正确信息,点击“查询”按钮之后,

页面跳转到http://sslk.bjjtgl.gov.cn/jgjwwcx/wzcx/wzcx_preview.jsp这个地址。



图3-验证码输入页面

走到这里就可以很清晰的看到网页的限制自动化条件,大致流程也能揣摩到个一二了。

需要点击“点击获取验证码”按钮,才能看到验证码,并且验证码为难度较高的验证,多刷新几次发现都是关于车辆驾驶的题目。

(真是阴魂不散的“科目一”题型啊~~)O(∩_∩)O~

打开调试工具(F12),选择“NetWork”按钮,选择调试工具的网络请求监听模块,再次刷新页面,可以看到该次刷新或者说访问请求,你的浏览器所发出的URL请求信息。

左列框中有很多如jsp服务器脚本、css文本样式、js浏览器脚本、jpg(png)图片、多媒体等等文件的请求,点击第一个wzcx_preview.jsp,并选择右边的Header选项,既可以看到该次“主请求”所提交的信息。如图示:



图4-验证码页面分析图

对http请求稍微熟悉一点的人,就能很轻易的发现,这个验证码页面其实已经接收了前面我们填写的城市(sf)-11、车牌号(carno)-XXXXXX、机动车号(fdjh)-XXXXX。

所以可以判定的说,前面第一个表单页面根本就没有存在的必要性。进一步发现这个页面在点击“点击获取验证码”按钮的时候,“NetWork”左列框的最下方又有一个新的请求发出,即为获得验证码图片数据的请求。点击这个请求查看相关Header信息,发现请求头信息中包含了前面访问jsp页面所生成的cookie信息。并经过有效求证,该图片内置session中的验证码答案与当前这次访问的cookie值进行绑定,通过cookie中保存的值验证用户的验证码输入的正确性,然后才可以进行后面的操作。


图5-获取验证码的请求信息

(有效的验证:个人猜想如果没有访问过jsp页面,而直接GET方式请求验证码会怎样,试验结果是YzmImg?t=XXXXX请求会在没有相应cookie的情况下response  set-cookie,也就是设置一个cookie,这也就证实了我刚刚前面的那个结论。)

最终证实我的“该网站系统是对session中的验证码答案和用户访问会话的cookie进行绑定的。”的结论的事件是如下:

当我右键“YzmImg?t=XXXX”,选择“在新的标签页打开”时,也就只显示一张验证码图片,然后F12调试,不断刷新,发现验证码图像在不断变化,而cookie却没有变化,然后比如原jsp验证码输入页面 的验证码是“示”,现在我这个新开的标签页的验证码经过无数次的刷新后变为“通”,那么我在那个jsp页面输入“通”才是正确的。至始至终,服务器端session中记录的都是最新的一次这个cookie请求的验证码答案。

接下来,输入正确的验证码,点击查询,进入主页面,同理,F12调试页面,分析所发出的URL请求。

 

现在,接着分析最后一个信息主页面的请求情况,看下面的贴图可以很清晰的看出,最终是一个action请求,并附带了好多个各种分支请求,现在我们只看这个主请求"getWzcxXx.action"即可。



图6-最终信息展示页面的请求结构



图7-action请求的头信息

 

在Form Date一栏就能清晰的看到表单提交数据,以及Request Header的cookie设置参数。

 

大致的网站结构、请求逻辑也就基本上理清楚了,这最重要的一个步骤完成了之后,剩下的事情就非常好办了吧。

我使用的是java语言,采用httpclient jar包 或者 java.net的原生网络连接类 或者spring 的XXXTemplate类都可以!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: