您的位置:首页 > 编程语言 > Python开发

python爬虫记录

2016-01-16 13:36 701 查看

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”开头的状态码表示服务器端发现自己出现错误,不能继续执行请求 处理方式:丢弃

Error Codes错误码

HTTPError实例产生后会有一个整型’code’属性,是服务器发送的相关错误号。

因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了HTTP协议使用的所有的应答号。

当一个错误号产生后,服务器返回一个HTTP错误号,和一个错误页面。

你可以使用HTTPError实例作为页面返回的应答对象response。

这表示和错误属性一样,它同样包含了code属性,read,geturl 和 info方法。

错误处理

1、使用try,多个except

和其他语言相似,try之后捕获异常并且将其内容打印出来。

这里要注意的一点,except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError 。

因为HTTPError是URLError的子类,如果URLError在前面它会捕捉到所有的URLError(包括HTTPError )。

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


2、try,一个except

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


Openers & Handles

Openers(urllib2.OpenerDirector的实例)使用的处理器是Handles(处理所有的繁重的工作)。

正常情况下,我们使用默认opener:通过urlopen。可以创建个性的Openers。

默认的openers有正常状况的handlers:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,FTPHandler, FileHandler, HTTPErrorProcessor

每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面。

Handles

AbstractBasicAuthHandler
HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler)

ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler)

AbstractDigestAuthHandler
BaseHandler

AbstractHTTPHandler

HTTPHandler

HTTPSHandler

FTPHandle

CacheFTPHandler

FileHandler

HTTPCookieProcessor

HTTPDefaultErrorHandler

HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler)

HTTPErrorProcessor

HTTPRedirectHandler

ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler)

ProxyHandler

UnknownHandler

Openers

创建实例化urllib2.OpenerDirector,调用add_handler(handler)添加handles

build_opener()

创建opener对象,默认添加处理器,可通过方法添加/更新处理器

install_opener()

创建全局默认opener

# -*- 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)


Proxy

urllib2默认使用http_proxy来设置proxy,可以通过设置ProxyHandler来自行设置。

Timeout

Python2.6之前,修改Socket的全局Timeout

import urllib2
import socket
socket.setdefaulttimeout(10) # 10 秒钟后超时
urllib2.socket.setdefaulttimeout(10) # 另一种方式


Python 2.6之后,使用urllib2.urlopen()的timeout参数

import urllib2
response = urllib2.urlopen('http://www.google.com', timeout=10)


Header

使用Request加入Header

import urllib2
request = urllib2.Request('http://www.baidu.com/')
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)
print response.read()


对有些 header 要特别留意,服务器会针对这些 header 做检查

User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求

Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。常见的取值有:

application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用

a54f
application/json: 在 JSON RPC 调用时使用

application/x-www-form-urlencoded: 浏览器提交 Web 表单时使用

在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务

Redirect

urllib2默认会自动进行Rediect

不希望自动重定向,除了使用httplib之外,还可以自定义HTTPRedirectHandler类(推荐)

import urllib2
class RedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(self, req, fp, code, msg, headers):
print "301"
pass
def http_error_302(self, req, fp, code, msg, headers):
print "303"
pass

opener = urllib2.build_opener(RedirectHandler)
opener.open('http://rrurl.cn/b1UZuP')


Cookie

创建cookielib.CookieJar()实例,可获取cookie——name:value

import urllib2
import cookielib
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open('http://www.baidu.com')
for item in cookie:
print 'Name = '+item.name
print 'Value = '+item.value


PUT & DELETE

除httplib之外,使用下列方法

import urllib2
request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)


Debug Log

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.google.com')


对于表单

首先需要知道自己到底发了些什么样的数据,使用urllib.urlencode()编码

# -*- coding: utf-8 -*-
import urllib
import urllib2
postdata=urllib.urlencode({
'username':'汪小光',
'password':'why888',
'continueURI':'http://www.verycd.com/',
'fk':'',
'login_submit':'登录'
})
req = urllib2.Request(
url = 'http://secure.verycd.com/signin',
data = postdata
)
result = urllib2.urlopen(req)
print result.read()


伪装成浏览器

修改http 包中的header实现

对付反盗链

修改headers的referer改成该网站

headers为一个dict型数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫