汪海爬虫学习笔记1

网络爬虫

网络爬虫就是一个爬行程序,一个抓取网页的程序,有的人说抓取数据很简单,但是管理爬虫就很困难,现在我还不太明白,多学习以后就懂了。其实网络爬虫抓取网页的过程和我们平时用浏览器登陆网页的原理是一样的,打开网页的过程就是浏览器作为一个浏览的“客户端”,向服务器端发送了 一次请求,把服务器端的文件“抓”到本地,再进行解释、展现。浏览器的功能是将获取到的HTML代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。

URL是URI的子集,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它 进行进一步的处理。因此,准确地理解URL对理解网络爬虫至关重要。

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 

类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源。

入门的时候就可以拿python中的urllib2包来练练手,这个是python2中的包,在python3中就将其整合成一个包了,urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。它以urlopen函数的形式提供了一个非常简单的接口。

除了"http:",URL同样可以使用"ftp:","file:"等等来替代。HTTP是基于请求和应答机制的:客户端提出请求,服务端提供应答。

在HTTP请求时,允许你做额外的两件事。

1.发送data表单数据

而发送数据有两种方式分别是GET和POST,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。

有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。在HTTP中,这个经常使用熟知的POST请求发送。这个通常在你提交一个HTML表单时由你的浏览器来做。并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。编码工作使用urllib的函数而非urllib2。

如果没有传送data参数,urllib2使用GET方式的请求。GET和POST请求的不同之处是POST请求通常有"副作用",它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。Data同样可以通过在Get请求的URL本身上面编码来传送。

2.设置Headers到http请求

默认的urllib2把自己作为“Python-urllib/x.y”,有的网站却不识别这个头就拒绝其访问,所以可以伪装一下,模拟成浏览器去访问,浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。

异常的处理

当urlopen不能够处理一个response时,产生urlError。HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

1.URLError
通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),包含了一个错误号和一个错误信息。

2.HTTPError
服务器上每一个HTTP 应答对象response包含一个数字"状态码"。有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答。例如:假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理。其他不能处理的,urlopen会产生一个HTTPError。典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。HTTP状态码表示HTTP协议所返回的响应的状态。比如客户端向服务器发送请求,如果成功地获得请求的资源,则返回的状态码为200,表示响应成功。如果请求的资源不存在, 则通常返回404错误。 HTTPError实例产生后会有一个整型'code'属性,是服务器发送的相关错误号。因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

3.捕捉错误

所以如果你想为HTTPError或URLError做准备,将有两个基本的办法。

第一种就是使用try和except Error来配合,先捕捉HTTPError,再捕获URLError,分两个except来捕捉,分别处理,一定要注意顺序,因为HTTPError是URLError的子集。

而第二种方法同样是try和except Error来配合,但是只有一个except来捕获,他通过hasattr()函数来确定这个错误是否有reason属性和code属性来分别判断是什么错误,分别输出。它是在一个except里面判断错误的分类。

 

 

urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

1.geturl():

这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。

2.info():

这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。经典的headers包含"Content-length","Content-type",和其他内容。

Openers and Handlers还不是太明白,日后再补吧

 

#-*- coding:utf-8 -*-
'''
#打开百度主页,返回其网站的源代码。
#urllib2是获取URL的组件,urlopen可以用来打开网页。
import urllib2
response = urllib2.urlopen('http://www.baidu.com')
html = response.read()
print html
'''

'''
import urllib2
#网站去必须加http://或ftp://,不然会报错,因为程序不识别。
#urllib2用一个Request对象来映射你提出的HTTP请求。
req = urllib2.Request('http://www.baidu.com')
response = urllib2.urlopen(req)
page = response.read()
print page
'''

'''
import urllib,urllib2
data = {'name':'www','password':'123456'}
f = urllib2.urlopen(url='http://www.jb51.net/',data = urllib.urlencode(data))
print f.read()
'''

'''
#POST发送数据到url
import urllib  
import urllib2  

url = 'http://www.someserver.com/register.cgi'  
  
values = {'name' : 'WHY',  'location' : 'SDU',  'language' : 'Python' }  

data = urllib.urlencode(values) # 编码工作
req = urllib2.Request(url, data)  # 发送请求同时传data表单
response = urllib2.urlopen(req)  #接受反馈的信息
the_page = response.read()  #读取反馈的内容
'''

'''
#GET方法发送data
import urllib2  
import urllib

data = {}

data['name'] = 'WHY'  
data['location'] = 'SDU'  
data['language'] = 'Python'

url_values = urllib.urlencode(data)  
print url_values

name=Somebody+Here&language=Python&location=Northampton  
url = 'http://www.example.com/example.cgi'  
#GET通过?来分割网址和数据
full_url = url + '?' + url_values

data = urllib2.open(full_url)  
'''

'''
#更改自己的Headers,伪装成浏览器去访问
import urllib  
import urllib2  

url = 'http://www.someserver.com/cgi-bin/register.cgi'

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
values = {'name' : 'WHY',  
          'location' : 'SDU',  
          'language' : 'Python' }  

headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)

#Request一共三个参数,最后一个可以设置header
req = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(req)  
the_page = response.read() 
'''

'''
#URLError
import urllib2
req = urllib2.Request('http://www.baibai.com')

try:
    urllib2.urlopen(req)

except urllib2.URLError , e:
    print e.reason
'''

'''
#返回403错误
import urllib2
req = urllib2.Request('http://bbs.csdn.net/callmewhy')

try:
    urllib2.urlopen(req)

except urllib2.URLError, e:

    print e.code
    #print e.read()
'''

'''
#捕获HTTPError和URLError的第一种方法
from urllib2 import Request, urlopen, URLError, HTTPError

req = Request('http://bbs.csdn.net/callmewhy')

try:

    response = urlopen(req)

except HTTPError, e:

    print 'The server couldn\'t fulfill the request.'

    print 'Error code: ', e.code

except URLError, e:

    print 'We failed to reach a server.'

    print 'Reason: ', e.reason

else:
    print 'No exception was raised.'
    # everything is fine
'''

'''
#捕获HTTPError和URLError的第二种方法
from urllib2 import Request, urlopen, URLError, HTTPError

req = Request('http://bbs.csdn.net/callmewhy')
  
try:  
  
    response = urlopen(req)  
  
except URLError, e:  

    if hasattr(e, 'code'):  
  
        print 'The server couldn\'t fulfill the request.'  
  
        print 'Error code: ', e.code  

    elif hasattr(e, 'reason'):  
  
        print 'We failed to reach a server.'  
  
        print 'Reason: ', e.reason  
  
  
else:  
    print 'No exception was raised.'  
    # everything is fine
'''

'''
#geturl函数的应用,获取真正的url
from urllib2 import Request, urlopen, URLError, HTTPError
old_url = 'http://rrurl.cn/b1UZuP'
req = Request(old_url)
response = urlopen(req)  
print 'Old url :' + old_url
print 'Real url :' + response.geturl()
'''

'''
#info函数的应用,获取的页面情况
from urllib2 import Request, urlopen, URLError, HTTPError

old_url = 'http://www.baidu.com'
req = Request(old_url)
response = urlopen(req)  
print 'Info():'
print response.info()
'''

'''
# -*- coding: utf-8 -*-
import urllib2

# 创建一个密码管理者
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

# 添加用户名和密码

top_level_url = "http://example.com/foo/"

# 如果知道 realm, 我们可以使用他代替 ``None``.
# password_mgr.add_password(None, top_level_url, username, password)
password_mgr.add_password(None, top_level_url,'why', '1223')

# 创建了一个新的handler
handler = urllib2.HTTPBasicAuthHandler(password_mgr)

# 创建 "opener" (OpenerDirector 实例)
opener = urllib2.build_opener(handler)

a_url = 'http://www.baidu.com/'

# 使用 opener 获取一个URL
opener.open(a_url)

# 安装 opener.
# 现在所有调用 urllib2.urlopen 将用我们的 opener.
urllib2.install_opener(opener)
'''


import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
    opener = urllib2.build_opener(proxy_handler)
else:
    opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值