不管你是因为什么缘由想作一个网络爬虫,首先作的第一件事情就是要了解它。php
在了解网络爬虫以前必定要牢记如下4个要点,这是作网络爬虫的基础:html
1.抓取正则表达式
py的urllib不必定去用,可是要学,若是你还没用过的话。比较好的替代品有requests等第三方更人性化、成熟的库,若是pyer不了解各类库,那就白学了。抓取最基本就是拉网页回来。数据库
若是深刻作下去,你会发现要面对不一样的网页要求,好比有认证的,不一样文件格式、编码处理,各类奇怪的url合规化处理、重复抓取问题、cookies跟随问题、多线程多进程抓取、多节点抓取、抓取调度、资源压缩等一系列问题。数组
因此第一步就是拉网页回来,慢慢你会发现各类问题待你优化。浏览器
2.存储服务器
抓回来通常会用必定策略存下来,而不是直接分析,我的以为更好的架构应该是把分析和抓取分离,更加松散,每一个环节出了问题可以隔离另一个环节可能出现的问题,好排查也好更新发布。cookie
那么存文件系统、SQLorNOSQL数据库、内存数据库,如何去存就是这个环节的重点。你能够选择存文件系统开始,而后以必定规则命名。网络
3.分析多线程
对网页进行文本分析,提取连接也好,提取正文也好,总之看你的需求,可是必定要作的就是分析连接了。能够用你认为最快最优的办法,好比正则表达式。而后将分析后的结果应用与其余环节:)
4.展现
要是你作了一堆事情,一点展现输出都没有,如何展示价值?因此找到好的展现组件,去show出肌肉也是关键。
若是你为了作个站去写爬虫,抑或你要分析某个东西的数据,都不要忘了这个环节,更好地把结果展现出来给别人感觉。
网络爬虫的定义
网络爬虫,即Web Spider,是一个很形象的名字。
把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。
网络蜘蛛是经过网页的连接地址来寻找网页的。
从网站某一个页面(一般是首页)开始,读取网页的内容,找到在网页中的其它连接地址,而后经过这些连接地址寻找下一个网页,这样一直循环下去,直到把这个网站全部的网页都抓取完为止。若是把整个互联网当成一个网站,那么网络蜘蛛就能够用这个原理把互联网上全部的网页都抓取下来。
这样看来,网络爬虫就是一个爬行程序,一个抓取网页的程序。
网络爬虫的基本操做是抓取网页。那么如何才能为所欲为地得到本身想要的页面?
咱们先从URL开始。
首先获取网页真正的url,简单的代码以下:
1
2
3
4
5
6
7
8
9
|
from urllib2 import Request, urlopen, URLError, HTTPError
#导入urllib2模块,且直接使用Request,不须要urllib2.Request(from... import...)
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:服务器端已经实现了请求,可是没有返回新的信 息。若是客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是做为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中可以处理,则进行进一步处理,若是程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就能够在未来经过该URL来访问此资源 处理方式:重定向到分配的URL
302:请求到的资源在一个不一样的URL处临时保存 处理方式:重定向到临时的URL
304 请求的资源未更新 处理方式:丢弃
400 非法请求 处理方式:丢弃
401 未受权 处理方式:丢弃
403 禁止 处理方式:丢弃
404 没有找到 处理方式:丢弃
5XX 回应代码以“5”开头的状态码表示服务器端发现本身出现错误,不能继续执行请求 处理方式:丢弃
这时候咱们该怎么办呢?其实很简单,让爬虫假装成正常IP访问网站就能够解决了。代码以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
---------------------------------------
程序: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 : 有些服务器或 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)
#客户端向服务器发送请求
response = urllib2.urlopen(req)
#服务器相应客户端的请求
print
'Old url :'
+ old_url
print
'Real url :'
+ response.geturl()
|