Python基础库使用(一)

python 基本库的使用(一)

使用 urllib

在 Python 2 中,有 urllib 和 urllib2 两个库来实现请求的发送。 而在 Python 3 中,已经不存在 urllib2 这个库了 , 统一为 urllib;

  1. request : 它是最基本的 HTTP 请求模块,可以用来模拟发送请求。 就像在浏览器里输入网挝 然后回车一样,只需要给库方法传入 URL 以及额外的参数,就可以模拟实现这个过程了。
  2. error: 异常处理模块,如果出现请求错误, 我们可以捕获这些异常,然后进行重试或其他操 作以保证程序不会意外终止。
  3. parse: 一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、 合并等。
  4. robotparser:主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不 可以爬,它其实用得比较少

urllib.request.urlopen(url, data=None, [ timeout, ]*, cafile=None, capath=None, cadefault=False, context=None),data则表示可以带的参数,timeout表示可设置超时时间,data参数是可选的

    # 抓取全书网首页
    import urllib.request
    response  = urllib.request.urlopen('http://www.quanshuwang.com/');
    # 由于utf-8在转码的时候会乱码,因此这里使用gbk中文编码,在不同网站使用不同的编码方式
    print(response.read().decode('gbk' ,'strict'));
    # 获取请求类型
    print(type(response)) # <class 'http.client.HTTPResponse'>
    print(response.status) # status属性获取请求返回的状态
    # 主要包含 read() 、 readinto()、 getheader(name)、 getheaders() 、 fileno()等方法,以及 msg、 version、 status 、 reason 、 debuglevel、 ιlosed 等属性。 

使用高级点的Request

利用 urlopen()方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建个完整的请求 如果请求中需要加入 Headers 等信息,就可以利用更强大的 Request 类来构建;
class urllib.request.Request ( url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None);
url 必传,其他参数可选
第二个参数 data 如果要传,必须传 bytes (字节流)类型的 如果它是字典,可以先用
urllib.parse 模块里的 urlencode()编码
第三个参数 headers 是一个字典,它就是请求头,我们可以在构造请求时通过 headers 参数直
接构造,也可以通过调用请求实例的 add_header()方法添加

import urllib .request
    request = urllib.request.Request('http://www.quanshuwang.com/')
    response = urllib .request.urlopen(request)
    print(response.read().decode ('gbk')) 

以下代码只是举个例子

    from urllib import request, parse
    # 请求地址
    url = 'http://www.quanshuwang.com/'
    headers = {
    # 伪装为火狐
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE S. S; Windows NT)',
    # 请求主题
    'Host':'www.quanshuwang.com'
    }
    dict = {
        'name':'Alan'
    }
    data= bytes(parse.urlencode(dict), encoding='gbk')
    req = request.Request(url=url, data=data, headers=headers, method='POST')
    response = request.urlopen(req)
    print(response. read(). decode('gbk')) 

另外, headers 也可以用 add_header ()方法来添加:

req = request.Request(url=url, data=data, method= 'POST')
req .add_header('User-Agent','Mozilla/4 .0 (compatible; MSIE 5.5; Windows NT )') 

urllib.request.Request 的高级用法

在构造请求的同时,有时候还需要对Cookie和代理做设置以及处理,urllib.request提供了BaseHandler的类,下面还有一堆子类,子类继承了父类;

HITPDefaultErrorHandler :用于处理 HTTP响应错误,错误都会抛出HTTP Error 类型的异常。
HTTPRedirectHandler:用于处理重定向。
HTTPCookieProcessor:用于处理Cookies。
ProxyHandler :用于设置代理,默认代理为空。
HTTPasswordMgr :用于管理密码,它维护了用户名和密码的表。密码
HTTPBasicAuthHandler:用于管理认证,如果一个链接打开时需要认证,那么可以用它来解 决认证问题。需要认证

处理需要登录验证的界面简单实例代码如下:

    # 引入密码Handler类,请求类以及错误打印日志类
    from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener 
    from urllib.error import URLError 
    username ='18022788898' 
    password ='KUNLIN001' 
    url = 'http://192.168.111.120:8082/#/login'
    # 用于密码用户名验证的对象
    p = HTTPPasswordMgrWithDefaultRealm() 
    # 利用密码验证这个对象的add_password方法来登录
    p.add_password(None, url, username, password) 
    auth_handler = HTTPBasicAuthHandler(p) 
    # 类似 urllib.urlopen,输出一致,成功发送请求
    opener = build_opener(auth_handler) 
    try: 
        result = opener.open(url) 
        html = result.read().decode('utf-8')
        print(html) 
    except URLError as e: print(e.reason) 

添加代理

from urllib.error import URLError 
from urllib.request import ProxyHandler, build opener 
proxy _handler = ProxyHandler({ 
'http':'http://127.o.o.1:9743', 
'https':'https://127.0.0.1:9743'
}) 
opener = build_opener(proxy_handler) 
try: 
    response = opener.open('https://www.baidu.com') 
    print(response.read().decode('utf-8')) 
except URLError as e: print(e.reason) 
    # [WinError 10061] 由于目标计算机积极拒绝,无法连接。 可能是被反爬了,可以换个网址试试

添加Cookie

我们必须声明一个 CookieJar对象。接下来,就需要利用HTTPCookieProcessor 来构建一个
Handler,最后利用 build_opener()方法构建出Opener,执行open()函数即可

import http.cookiejar, urllib.request
# 拿取cookie 
cookie = http.cookiejar.MozillaCookieJar() 
#构建Handler
handler = urllib.request.HTTPCookieProcessor(cookie) 
opener = urllib.request.build_opener(handler ) 
response = opener.open('http://www.baidu.com') 
for item in cookie: 
    print(item.name+'='+item.value) 

# ===============================================================================
import http.cookiejar, urllib.request 
# 定义文件名
filename = 'cookies.txt' 
cookie = http.cookiejar.MozillaCookieJar(filename) 
handler = urllib.request.HTTPCookieProcessor(cookie) 
opener = urllib.request.build_opener(handler ) 
response = opener. open ('https://www.baidu.com') 
# 存储cookie到本地
cookie.save(ignore_discard=True, ignore_expires=True) 
for item in cookie: 
    print(item.name+'='+item.value) 

LWPCookieJar 同样可以读取和保存 Cookies ,但是保存的格式和 MozillaCookieJar 不一样, 它会保存成 libwww-perl(LWP)格式的 Cookies 文件 。
要保存成 LWP 格式的 Cookies 文件,可以在声明时就改为: cookie = http.cookiejar.LWPCookieJar(filename);
利用LWPCookieJar生产的set-Cookie文件还可以使用来获取百度的首页源码,其实含义是可以通过这种方式来获取到cookie

import http.cookiejar, urllib.request 
# 定义文件名
filename = 'cookies.txt' 
# 利用本地的这个cookies.txt文件来获取cookie
cookie = http.cookiejar.LWPCookieJar(filename) 
cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie) 
opener = urllib.request.build_opener(handler ) 
response = opener.open ('https://www.baidu.com') 
# 存储cookie到本地
print (response .read().decode('utf-8')) 

URLError

URL Error 类来自 urllib 库的 error 模块,它继承自 OS Error 类,是 error 异常模块的基类,由 request 模块生的异常都可以通过捕获这个类来处理。

from urllib import request,error
try:
    response = request.urlopen('https://cuiqingcai.com/index.htm')
except error.URLError as e:
    print(e.reason) # Not Found

HTIPError

它是 URL Error 的子类,专 门用来处理 HTTP 请求错误,比如认证请求失败等 。 它有如下 3 个属性。

from urllib import request,error
try:
    response = request.urlopen('https://cuiqingcai.com/index.htm')
except error.HTTPError as e:
    print(e.reason,e.code,e.headers,seq='\n')
# 超时提醒
import socket 
import urllib.request 
import urllib.error 
try: 
    response = urllib.request.urlopen ('https://www.baidu.com', timeout=0.01) 
except urllib.error.URLError as e: 
    print(type(e.reason)) 
    if isinstance(e.reason,socket.timeout): 
        print('TIME OUT') 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容