关于爬虫的瞎想

1.爬虫定义
爬虫就是用计算机代替人工去获取海量的web数据的程序。是获取数据的一种方式,也是数据分析的前提。

2.编写一个合格的爬虫程序
1)爬虫程序目的不是攻击网站,而是获取开放的数据。但是由于爬虫的程序特性,获取资源速度过快,可能会导致服务器瘫痪。因此爬取信息时需要尽量模仿人工获取行为,所以发送多个请求之间尽量间隔一个合理的随机时间。

2)有些网站对爬虫程序做了一些防备,比如请求头的验证。解决起来很简单,在请求头中加入一些客户端信息(如:User-Agent)或者上下文信息(如:Referer)。

3)有些信息需要登陆之后才能访问。于是模拟登陆就成了爬虫程序需要的基本功能,也是实现起来较为复杂的。
常见的网站登陆校验方式有两种,一种基于cookie,一种基于token。
cookie与服务器端的session一同保证交互的状态,用于克服http请求的无状态特性。这种情况的第一步当然是寻找登陆接口,该过程一般为手动寻找。通过向登陆接口提交账号密码,进行登陆,服务器端登陆校验过后,会在session中记录登录信息,所以只需要保留已验证的cookie,每次请求通过携带cookie信息,就能获得已登陆的权限。
不过模拟登陆实现起来并不简单,因为很多网站的登陆接口远远不止只输入账号密码这么简单。常见的防备有验证码,还有动态生成的一些认证字符串。这些都让爬虫程序的模拟登陆不能做到完全自动化。一些简单的验证码也许能够使用一些图像识别函数库进行自动解析。

简单的数字验证码
复杂一点的中文验证码

不过遇到一些高级的验证方式就可能非常困难了:

厉害了

更别说一些奇葩的验证码,连手动验证都有点小困难:


Paste_Image.png

以上纯属验证码搞笑,主要还是想说明模拟登陆的困难。

4)页面js的处理,有些数据可能需要执行js代码后才会显示在页面上,这就表示网页源代码中是没有我们需要的数据的。比如常见的ajax请求,获取到数据之后再利用js将数据插入页面。

3.扩展性的思考
对于爬虫程序,要做到有效,就必须要专一。因为web网页结构多种多样,数据在页面上的分布也不尽相同。可以说爬虫程序要做到抽象是很困难的。
不过这也不代表无法得到一个扩展性好的设计。
只要将爬取规则常见的情况列举出来,似乎就能够得到一些共性。
比如,webmagic中就将爬取规则抽象成了help url和target url。前者是列表页面的url,后者是数据实体的url。比如前者代表文章列表,后者就是某个文章页面。这样的设计符合大多数情况。

我们可以把最终要的数据分为三种。
1)一个页面代表一个数据实体。
2)一个接口返回的json或者xml数据代表一个数据实体。
3)一个数据实体的部分数据在一个页面上,部分数据又来自ajax请求。
其中第三种是复杂的,因为需要通过不同的接口拼装出一个数据实体。而程序是难以自行发现这些接口的。

虽然不同网站对登陆的实现不同,但无非是提交账号密码和验证数据给登陆接口。然后通过已认证的cookie或者token作为登陆凭证和服务器进行后续的交互。
难点是,如何让程序自行发现需要进行登陆,或者之前的登陆已失效。服务器肯定是会告诉客户端这些信息的,但是这里不同的网站实现又会不一样,有的网站是直接跳转至登陆页面,而有的网站是返回一个错误码,弹框确认之后再跳转,或者有些设计不佳的网站,登陆失效后什么也不提示,直接不返回任何数据。

总的来说,要把一个爬虫程序做好,最好还是先做到专一,根据不同的网站设计不同的爬取规则,编写不同的实现,这样虽然不易扩展,但实现起来要方便。等这般设计的系统稳定之后,如果业务所需的数据来源不再变化,再将已有的数据来源的通用部分进行抽象,再来考虑扩展性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,810评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,216评论 11 349
  • Q1:超级组,两个动作之间连续不间歇吗?两组超级组的组间休多久啊? A1:超级组训练法,一个超级组中的两个动作,要...
    硬派健身阅读 674评论 0 2
  • 读书群里好多人都有看过这本书,我最初以为它纯粹是国外的一系列书单的推荐书籍,看过后才明白不仅仅只是这样,围绕小岛书...
    啾啾fing阅读 265评论 0 1