urllib,urllib2的使用

1.简单爬取一个页面

import urllib
f = urllib.urlopen('http://www.qq.com')  # HTTP协议,也可以是FTP,FILE,HTTPS等
print f.read()  # 读取整个页面

2.通过构造Request请求对象

import urllib2
req = urllib2.Request('http://www.qq.com')  # 构造一个Request请求对象
f = urllib2.urlopen(req)  # 传入一个Request请求对象
print f.read().decode('gbk')  # 读取整个页面,read()返回的是字节对象,转为gbk编码显示中文

3.POST和GET数据传送

import urllib

# POST
data = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})  # 数据字典
print data  # eggs=2&bacon=0&spam=1
f = urllib.urlopen('http://www.musi-cal.com/cgi-bin/query', data)  # POST,如果data里有中文,要data.encode('utf-8')
print f.geturl()  # 获取url,http://www.musi-cal.com/cgi-bin/query
print f.read(100)  # 返回的是字节对象,读取前100个字节

# GET
f = urllib.urlopen('http://www.musi-cal.com/cgi-bin/query?%s' % data)  # GET,如果data里有中文,要data.encode('utf-8')
print f.geturl()  # 获取url,http://www.musi-cal.com/cgi-bin/query?eggs=2&bacon=0&spam=1
print f.read(100)  # 返回的是字节对象,读取前100个字节

4.设置Headers

import urllib2
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0'}  # 设置User-Agent
req = urllib2.Request(url='https://www.qq.com', headers=headers)  # 构造一个Request请求对象,并传入Headers
f = urllib2.urlopen(req)  # 传入一个Request请求对象
print f.read().decode('gbk')  # 读取整个页面,read()返回的是字节对象,转为gbk编码显示中文

req = urllib2.Request(url='https://www.qq.com')  # 构造一个Request请求对象
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0')  # 添加User-Agent到Headers
f = urllib2.urlopen(req)  # 传入一个Request请求对象
print f.read().decode('gbk')  # 读取整个页面,read()返回的是字节对象,转为gbk编码显示中文

Header的一些属性说明:

User-Agent:通过该值来判断是否为浏览器发出的请求。

Content-Type:使用REST接口时,服务器会检查此值来确定Body中的内容要怎样解析。

application/xml:在XML RPC调用时使用。

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

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

5.代理(Proxy)设置

import urllib2
proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'})  # 代理处理器
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()  # 代理验证处理器
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')  # 添加用户名和密码
opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)  # 建立一个opener,传入了代理处理器和代理验证处理器
f = opener.open('http://www.example.com/login.html')  # 用建立的opener直接打开网页,不需要调用urllib2.install_opener()
# 或者这样使用
# urllib2.install_opener(opener)  # 安装opener
# f = urllib2.urlopen('http://www.example.com/login.html')  # 调用urlopen()
print f.read()  # 获得页面内容

6.超时(timeout)设置

# 参考5中的代码
f = opener.open('http://www.example.com/login.html', timeout=5)  # 超时5秒则抛出URLError异常

7.异常处理(URLError,HTTPError)

URLError是IOError的子类,HTTPError是URLError的子类。URLError产生的原因有:网络无连接,连接不到服务器,服务器不存在,请求超时等。URLError异常有reason属性,说明了异常的原因。

import urllib2
req = urllib2.Request(url='http://www.baidu123456123456123456.com')  # 一个不存在的网页
try:
    f = urllib2.urlopen(req)  # 试图打开不存在的网页
    print f.read()
except urllib2.URLError as e:  # 抛出异常
    print e.reason  # [Errno 11001] getaddrinfo failed
else:
    print u'成功'
import urllib2
req = urllib2.Request(url='https://www.douyu.com/Json.html')  # 一个不存在的网页
try:
    f = urllib2.urlopen(req)  # 试图打开不存在的网页
    print f.read()
except urllib2.HTTPError as e:
    print e.reason  # Not Found
    print e.code  # 404
except urllib2.URLError as e:  # 抛出异常
    print e.reason
else:
    print u'成功'

HTTPError异常除了继承了reason属性,还有code属性,是异常对应的状态码。HTTP状态码有:

100:客户端继续发送请求的剩余部分,如请求已完成,忽略。
101:发送完此响应的最后空行,服务器切换到Upgrade消息头中定义的协议。
102:处理被继续执行。
200:请求成功。
201:请求完成。
202:请求被接受,处理尚未完成。
204:服务器已实现请求,但没有返回信息。
300:存在多个可用的被请求资源。
301:请求到的资源会分配一个永久的URL,将来通过此URL来访问。
302:请求到的资源在一个不同的URL临时保存。
304:请求的资源未更新。
400:非法请求。
401:未授权。
403:禁止。
404:找不到。
500:服务器内部错误。
501:服务器无法识别。
502:错误网关。
503:服务出错。

8.Cookie的使用(cookielib.CookieJar,cookielib.FileCookieJar,cookielib.MozillaCookieJar,cookielib.LWPCookieJar)

cookielib.MozillaCookieJar和cookielib.LWPCookieJar是cookielib.FileCookieJar的子类,cookielib.FileCookieJar是cookielib.CookieJar的子类。

# cookie保存在变量中
import urllib2
import cookielib

cj = cookielib.CookieJar()  # CookieJar对象,cookie会保存在这个变量中
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  # 传入cookie处理器来构建opener
f = opener.open('http://www.baidu.com')  # 打开页面
for item in cj:  # 历遍cookie中的键值对
    print u'键:' + item.name
    print u'值:' + item.value
# cookie保存到文件
import urllib2
import cookielib

filename = 'cookie.txt'
cj = cookielib.MozillaCookieJar(filename)  # MozillaCookieJar对象,cookie会保存在文件中
processor = urllib2.HTTPCookieProcessor(cj)  # cookie处理器
opener = urllib2.build_opener(processor)   # 传入cookie处理器来构建opener
f = opener.open('http://www.baidu.com')  # 打开页面
cj.save(ignore_discard=True, ignore_expires=True)  # 保存,cookie被丢弃也保存,cookie到期也保存
# 读取cookie
import urllib2
import cookielib

cj = cookielib.MozillaCookieJar()  # MozillaCookieJar对象
cj.load('cookie.txt', ignore_discard=True, ignore_expires=True)  # 读取cookie文件
processor = urllib2.HTTPCookieProcessor(cj)  # cookie处理器
req = urllib2.Request('http://www.baidu.com')  # 建立请求
opener = urllib2.build_opener(processor)   # 传入cookie处理器来构建opener
f = opener.open(req)  # 打开页面
print f.read()  # 读取页面内容
# 模拟登陆的过程
import urllib
import urllib2
import cookielib

filename = 'cookie.txt'
cj = cookielib.MozillaCookieJar(filename)  # MozillaCookieJar对象,cookie会保存在文件中
processor = urllib2.HTTPCookieProcessor(cj)  # cookie处理器
opener = urllib2.build_opener(processor)   # 传入cookie处理器来构建opener
data = {}  # 数据字典
data['username'] = 'xxxxxxx'  # 用记名
data['password'] = '1111111'  # 密码
post = urllib.urlencode(data)  # 生成用于传递的数据字符串
url = 'http://www.xxxx.com/login'  # 登陆页面
req = urllib2.Request(url=url, data=post)  # 建立请求,传入登陆需要的数据,如用户名密码之类
f = opener.open(req)  # 打开页面
cj.save(ignore_discard=True, ignore_expires=True)  # 保存,cookie被丢弃也保存,cookie到期也保存
other_url = 'http://www.xxxx.com/other'  # 需要登陆才能访问的页面
f = opener.open(other_url)  # 访问需要登陆才能访问的页面
print f.read()  # 读取页面内容

猜你喜欢

转载自www.cnblogs.com/Ooman/p/11161738.html
今日推荐