不管你是因为什么原因想做一个网络爬虫,首先做的第一件事情就是要了解它。
在了解网络爬虫之前一定要牢记下面4个要点,这是做网络爬虫的基础:
1.抓取
py的urllib不一定去用。可是要学。假设你还没用过的话。
比較好的替代品有requests等第三方更人性化、成熟的库,假设pyer不了解各种库。那就白学了。
抓取最基本就是拉网页回来。
假设深入做下去。你会发现要面对不同的网页要求。比方有认证的,不同文件格式、编码处理,各种奇怪的url合规化处理、反复抓取问题、cookies尾随问题、多线程多进程抓取、多节点抓取、抓取调度、资源压缩等一系列问题。
所以第一步就是拉网页回来,慢慢你会发现各种问题待你优化。
2.存储
抓回来通常会用一定策略存下来。而不是直接分析。个人认为更好的架构应该是把分析和抓取分离,更加松散,每一个环节出了问题可以隔离另外一个环节可能出现的问题,好排查也好更新公布。
那么存文件系统、SQLorNOSQL数据库、内存数据库。怎样去存就是这个环节的重点。你能够选择存文件系统開始,然后以一定规则命名。
3.分析
对网页进行文本分析。提取链接也好。提取正文也好,总之看你的需求。可是一定要做的就是分析链接了。能够用你觉得最快最优的办法。比方正則表達式。
然后将分析后的结果应用与其它环节:)
4.展示
要是你做了一堆事情。一点展示输出都没有,怎样展现价值?所以找到好的展示组件,去show出肌肉也是关键。
假设你为了做个站去写爬虫,抑或你要分析某个东西的数据。都不要忘了这个环节,更好地把结果展示出来给别人感受。
网络爬虫的定义
网络爬虫,即Web Spider,是一个非常形象的名字。
把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。
网络蜘蛛是通过网页的链接地址来寻找网页的。
从站点某一个页面(一般是首页)開始,读取网页的内容,找到在网页中的其他链接地址,然后通过这些链接地址寻找下一个网页。这样一直循环下去,直到把这个站点全部的网页都抓取完为止。假设把整个互联网当成一个站点,那么网络蜘蛛就能够用这个原理把互联网上全部的网页都抓取下来。
这样看来,网络爬虫就是一个爬行程序,一个抓取网页的程序。
网络爬虫的基本操作是抓取网页。那么怎样才干随心所欲地获得自己想要的页面?
我们先从URL開始。
首先获取网页真正的url。简单的代码例如以下:
from urllib2 import Request, urlopen, URLError, HTTPError
#导入urllib2模块。且直接使用Request。不须要urllib2.Request(from... import...)
old_url = 'http://rrurl.cn/b1UZuP' #写入网页显示的地址
req = Request(old_url)
response = urlopen(req)
print 'Old url :' + old_url
print 'Real url :' + response.geturl()
执行这串代码,会报HTTPError:403错误。表示网站拒绝网络爬虫訪问。以下列出HTTP状态码:
HTTP状态码通常分为5种类型,分别以1~5五个数字开头。由3位整数组成:
------------------------------------------------------------------------------------------------
200:请求成功 处理方式:获得响应的内容,进行处理
201:请求完毕。结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完毕 处理方式:堵塞等待
204:server端已经实现了请求,可是没有返回新的信 息。假设客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 仅仅是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中可以处理。则进行进一步处理。假设程序中不能处理。则丢弃
301:请求到的资源都会分配一个永久的URL,这样就能够在将来通过该URL来訪问此资源 处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处暂时保存 处理方式:重定向到暂时的URL
304 请求的资源未更新 处理方式:丢弃
400 非法请求 处理方式:丢弃
401 未授权 处理方式:丢弃
403 禁止 处理方式:丢弃
404 没有找到 处理方式:丢弃
5XX 回应代码以“5”开头的状态码表示server端发现自己出现错误,不能继续运行请求 处理方式:丢弃
这时候我们该怎么办呢?事实上非常easy,让爬虫伪装成正常IP訪问站点就能够攻克了。代码例如以下:
---------------------------------------
程序:twxs爬虫
版本号:0.1
作者:贪玩小神
日期:2015-07-29
语言:Python 2.7
功能:输出网站真实的url
---------------------------------------
import urllib
import urllib2
#导入urllib。urllib2模块,不推荐使用from ... import ...
old_url = 'http://www.zhubajie.com/wzkf/th1.html'
user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
#设置初始值old_url,user_agent
#User-Agent : 有些server或 Proxy 会通过该值来推断是否是浏览器发出的请求,这里设置User-Agent来伪装成浏览器
values = {'name' : 'Michael Foord',
'location' : 'Northampton',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
#初始化操作
data = urllib.urlencode(values)
req = urllib2.Request(old_url, data, headers=headers)
#client向server发送请求
response = urllib2.urlopen(req)
#server对应client的请求
print 'Old url :' + old_url
print 'Real url :' + response.geturl()