首先,咱们先来看看,若是是人正常的行为,是如何获取网页内容的。python
(1)打开浏览器,输入URL,打开源网页
(2)选取咱们想要的内容,包括标题,做者,摘要,正文等信息
(3)存储到硬盘中
上面的三个过程,映射到技术层面上,其实就是:网络请求,抓取结构化数据,数据存储。
咱们使用Python写一个简单的程序,实现上面的简单抓取功能。
- #!/usr/bin/python #-*- coding: utf-8 -*- ''
-
- @author: Kris
- ''' import def '''
- @summary: 网页抓取
- ''' def '''
- @summary: 网络请求
- ''' try
-
- , )
- , )
- finally if return def '''
- @summary: 抓取结构化数据
- '''
-
- if ]
- return def '''
- @summary: 数据存储
- ''' , )
- if:
-
- httpCrawler(url)
看着很简单,是的,它就是一个爬虫入门的基础程序。固然,在实现一个采集过程,无非就是上面的几个基础步骤。可是实现一个强大的采集过程,你会遇到下面的问题:
(1)须要带着cookie信息访问,好比大多数的社交化软件,基本上都是须要用户登陆以后,才能看到有价值的东西,其实很简单,咱们可使用Python提供的cookielib模块,实现每次访问都带着源网站给的cookie信息去访问,这样只要咱们成功模拟了登陆,爬虫处于登陆状态,那么咱们就能够采集到登陆用户看到的一切信息了。下面是使用cookie对httpRequest()方法的修改:web
- ckjar = cookielib.MozillaCookieJar()
-
- def '''
- @summary: 网络请求
- ''' try
-
- , )
- , )
-
- finally if return ret
(2)编码问题。网站目前最多的两种编码:utf-8,或者gbk,当咱们采集回来源网站编码和咱们数据库存储的编码不一致时,好比,163.com的编码使用的是gbk,而咱们须要存储的是utf-8编码的数据,那么咱们可使用Python中提供的encode()和decode()方法进行转换,好比:
- content = content.decode(, )
- , )
中间出现了unicode编码,咱们须要转为中间编码unicode,才能向gbk或者utf-8转换。
(3)网页中标签不完整,好比有些源代码中出现了起始标签,但没有结束标签,HTML标签不完整,就会影响咱们抓取结构化数据,咱们能够经过Python的BeautifulSoup模块,先对源代码进行清洗,再分析获取内容。
(4)某些网站使用JS来生存网页内容。当咱们直接查看源代码的时候,发现是一堆让人头疼的JS代码。可使用mozilla、webkit等能够解析浏览器的工具包解析js、ajax,虽然速度会稍微慢点。
(5)图片是flash形式存在的。当图片中的内容是文字或者数字组成的字符,那这个就比较好办,咱们只要利用ocr技术,就能实现自动识别了,可是若是是flash连接,咱们将整个URL存储起来了。
(6)一个网页出现多个网页结构的状况,这样咱们若是只是一套抓取规则,那确定不行,因此须要配置多套模拟进行协助配合抓取。
(7)应对源网站的监控。抓取别人的东西,毕竟是不太好的事情,因此通常网站都会有针对爬虫禁止访问的限制。
一个好的采集系统,应该是,无论咱们的目标数据在何处,只要是用户可以看到的,咱们都能采集回来。所见即所得的无阻拦式采集,不管是否须要登陆的数据都可以顺利采集。大部分有价值的信息,通常都须要登陆才能看到,好比社交网站,为了应对登陆的网站要有模拟用户登陆的爬虫系统,才能正常获取数据。不过社会化网站都但愿本身造成一个闭环,不肯意把数据放到站外,这种系统也不会像新闻等内容那么开放的让人获取。这些社会化网站大部分会采起一些限制防止机器人爬虫系统爬取数据,通常一个帐号爬取不了多久就会被检测出来被禁止访问了。那是否是咱们就不能爬取这些网站的数据呢?确定不是这样的,只要社会化网站不关闭网页访问,正常人可以访问的数据,咱们也能访问。说到底就是模拟人的正常行为操做,专业一点叫“反监控”。
源网站通常会有下面几种限制:
一、必定时间内单个IP访问次数,一个正经常使用户访问网站,除非是随意的点着玩,不然不会在一段持续时间内过快访问一个网站,持续时间也不会太长。这个问题好办,咱们能够采用大量不规则代理IP造成一个代理池,随机从代理池中选择代理,模拟访问。代理IP有两种,透明代理和匿名代理。
二、必定时间内单个帐号访问次数,若是一我的一天24小时都在访问一个数据接口,并且速度很是快,那就有多是机器人了。咱们能够采用大量行为正常的帐号,行为正常就是普通人怎么在社交网站上操做,而且单位时间内,访问URL数目尽可能减小,能够在每次访问中间间隔一段时间,这个时间间隔能够是一个随机值,即每次访问完一个URL,随机随眠一段时间,再接着访问下一个URL。
若是能把帐号和IP的访问策略控制好了,基本就没什么问题了。固然对方网站也会有运维会调整策略,敌我双方的一场较量,爬虫必需要能感知到对方的反监控将会对咱们有影响,通知管理员及时处理。其实最理想的是可以经过机器学习,智能的实现反监控对抗,实现不间断地抓取。ajax
下面是本人近期正在设计的一个分布式爬虫架构图,如图1所示:数据库

图1浏览器
纯属拙做,初步思路正在实现,正在搭建服务器和客户端之间的通讯,主要使用了Python的Socket模块实现服务器端和客户端的通讯。若是有兴趣,能够单独和我联系,共同探讨完成更优的方案。服务器