一、Urllib库详解

1、什么是Urllib

Python内置的HTTP请求库

urllib.request       请求模块(模拟实现传入网址访问)

urllib.error              异常处理模块(如果出现错误,进行捕捉这个异常,然后进行重试和其他的操作保证程序不会意外的中止)

urllib.parse                  url解析模块(工具模块,提供了许多url处理方法,例如:拆分,合并等)

urllib.robotparser         robots.txt解析模块(主要是用来识别网页的robots.txt文件,判断哪些网站是可以爬的,哪些是不可以爬的)

2、相比Python变化

Python2

import urllib2

response = urllib2.urlopen('http://www.baidu.com')

Python3

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')

3、基本用法

Urllib

urlopen

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)

方法1

 import urllib.request

 response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8')) # 获取相应体的内容,用decode('utf-8')显示

方法2

import urllib.request
import urllib.parse data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf-8')
response = urllib.request.urlopen('http://httpbin.org/post',data=data) # 加了data 是已post形式传递 ,不加则是get方式传递
print(response.read())

方法3

 import urllib.request

 response = urllib.request.urlopen('http://httpbin.org/get',timeout=1)
print(response.read())

方法4

 import socket
import urllib.request
import urllib.error try:
response = urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
except urllib.error.URLError as e:
if isinstance(e.reason,socket.timeout):
print('TIME OUT')

响应

响应类型

 import urllib.request

 response = urllib.request.urlopen('http://www.baidu.com')
print(type(response))

状态码、响应头

 import urllib.request

 response = urllib.request.urlopen('http://www.python.org')
print(response.status) # 获取状态码
print(response.getheaders()) # 获取响应头
print(response.getheader('Server')) # 获取特定的响应头,这里拿 Server举例

Request

url作为对象传给urlopen

 import urllib.request

 request = urllib.request.Request('https://python.org') # 把url封装成一个对象
response = urllib.request.urlopen(request) # 把对象传给urlopen一样可以访问
print(response.read().decode('utf-8'))

添加request请求的方式

 from urllib import request,parse

 url = 'http://httpbin.org/post'
headers={
'User-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',
'Host':'httpbin.org'
}
dict = {
'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding='utf-8')
req = request.Request(url=url,data=data,headers=headers,method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

request.add_header()方法

 from urllib import request,parse

 url = 'http://httpbin.org/post'
dict = {
'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding='utf-8')
req = request.Request(url=url,data=data,method='POST')
req.add_header('User-Agent','Mozilla/4.0(compatible;MSIE 5.5;Windows NT)')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

Handler

代理

 import urllib.request

 # 构建了两个代理Handler,一个有代理IP,一个没有代理IP
httpproxy_handler = urllib.request.ProxyHandler({"http" : "127.0.0.1:9743"})
nullproxy_handler = urllib.request.ProxyHandler({})
#定义一个代理开关
proxySwitch = True
# 通过 urllib2.build_opener()方法使用这些代理Handler对象,创建自定义opener对象
# 根据代理开关是否打开,使用不同的代理模式
if proxySwitch:
opener = urllib.request.build_opener(httpproxy_handler)
else:
opener = urllib.request.build_opener(nullproxy_handler) request = urllib.request.Request("http://www.baidu.com/") # 使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。
response = opener.open(request) # 就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。
urllib.request.install_opener(opener)
# response = urlopen(request) print(response.read())
使用选择的代理构建代理处理器对象
 import urllib.request

 # 使用选择的代理构建代理处理器对象
proxy_handler = urllib.request.ProxyHandler({
'http':'http://127.0.0.1:9743',
'https':'https://127.0.0.1:9743'
})
opener = urllib.request.build_opener(proxy_handler)
request = urllib.request.Request("http://www.baidu.com")
response = opener.open(request)
print(response.read())
Cookie维持登陆状态的一个机制
实现cookie的获取
import http.cookiejar,urllib.request
 import http.cookiejar,urllib.request

 cookie = http.cookiejar.CookieJar()
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)
把cookie保存成一个文本文件
 import http.cookiejar,urllib.request

 filename = "cookie.txt"
cookie = http.cookiejar.MozillaCookieJar(filename) # CookieJar子类的一个对象 MozillaCookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True) # MozillaCookieJar()里包含了一个save()方法保存成txt文件

Cookie另一种保存格式 方法2

 import http.cookiejar,urllib.request

 filename = "cookie.txt"
cookie = http.cookiejar.LWPCookieJar(filename) # CookieJar子类的一个对象 LWPCookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True) # LWPCookieJar()里包含了一个save()方法保存成txt文件
用cookie方法2的方法读取获取到的Cookie(LWPCookieJar())
import http.cookiejar,urllib.request

cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8')) # 用文本文件的方式存储cookie,再读取出来放在request里请求访问网页,请求的结果就是登陆时候的看到的结果

URL解析

 # urlparse  urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
# 把url分割成许多部分
from urllib.parse import urlparse,urlunparse result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result),result) # 输出 <class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment') # 指定协议类型
result = urlparse('www.baidu.com/index.html;user?id=5#comment',scheme='https')
print(result) # 输出 ParseResult(scheme='https', netloc='', path='www.baidu.com/index.html', params='user', query='id=5', fragment='comment') #如果url里添加了协议,后面分割的就是这个协议方式
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment',scheme='https')
print(result) # 输出 ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment') #锚点链接 allow_fragments参数
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment',allow_fragments=False)
print(result) # 将comment拼接到query里 ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5#comment', fragment='') #把query去掉,直接拼接到path里
result = urlparse('http://www.baidu.com/index.html#comment',allow_fragments=False)
print(result) # 输出 ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html#comment', params='', query='', fragment='') #-----------------------------------------------------------------------------------------------------------------------
# urlunparse 将url里的参数进行拼接成完整的url
data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data)) # 输出 http://www.baidu.com/index.html;user?a=6#comment #-----------------------------------------------------------------------------------------------------------------------
# urljoin 后面url里的字段会覆盖前面的url
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com/about.html','https://cuiqincai.com/FAQ.html'))
# 输出 https://cuiqincai.com/FAQ.html #-----------------------------------------------------------------------------------------------------------------------
from urllib.parse import urlencode params = {
'name':'germey',
'age':22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params) # 把字典转换成请求参数
print(url) # 输出 http://www.baidu.com?name=germey&age=22

异常处理

 # from urllib import request,error # 1,2可用
# 打印出异常处理
# try:
# response = request.urlopen('http://wyh.com/index.html')
# except error.URLError as e:
# print(e.reason) # 打印出异常原理,保证程序是正常运行的 # 具体可以捕捉哪些异常
# try:
# response = request.urlopen('http://wyh.com/index.html')
# except error.HTTPError as e: # HTTPError是子类异常
# print(e.reason,e.code,e.headers,sep='\n') # e.headers 打印响应头的一些信息
# except error.URLError as e: # URLError是父类异常
# print(e.reason)
# else:
# print('Request Successfully!') # 加一个原因判断
import socket
import urllib.request
import urllib.error try:
response = urllib.request.urlopen('http://www.baidu.com',timeout=0.01)
except urllib.error.URLError as e:
print(type(e.reason)) # 它是一个类
if isinstance(e.reason,socket.timeout): # isinstance()方法判断是不是匹配的
print('TIME OUT!')
 
 
 
 
												

爬虫学习--Urllib库基本使用 Day1的更多相关文章

  1. python爬虫之urllib库(三)

    python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...

  2. python爬虫之urllib库(二)

    python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...

  3. python爬虫之urllib库(一)

    python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...

  4. Python爬虫学习:Python内置的爬虫模块urllib库

    urllib库 urllib库是Python中一个最基本的网络请求的库.它可以模拟浏览器的行为发送请求(都是这样),从而获取返回的数据 urllib.request 在Python3的urllib库当 ...

  5. (爬虫)urllib库

    一.爬虫简介 什么是爬虫?通俗来讲爬虫就是爬取网页数据的程序. 要了解爬虫,还需要了解HTTP协议和HTTPS协议:HTTP协议是超文本传输协议,是一种发布和接收HTML页面的传输协议:HTTPS协议 ...

  6. 爬虫之urllib库

    一.urllib库简介 简介 Urllib是Python内置的HTTP请求库.其主要作用就是可以通过代码模拟浏览器发送请求.它包含四个模块: urllib.request :请求模块 urllib.e ...

  7. python爬虫之urllib库介绍

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  8. 爬虫中urllib库

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  9. python爬虫之urllib库

    请求库 urllib urllib主要分为几个部分 urllib.request 发送请求urllib.error 处理请求过程中出现的异常urllib.parse 处理urlurllib.robot ...

随机推荐

  1. 问题TypeError: __init__() takes 1 positional argument but 2 were given解决方案

    在搭建自动化框架时,遇到一个问题,如下图: 根据报错的意思,应该是__init__函数的问题, 位置应该是HomePage文件 立马去查看一下文件,如图: 原来是因为的粗心大意__init__(sel ...

  2. 最简单的JS实现json转csv

    工作久了,总会遇到各种各样的数据处理工作,比如同步数据,初始化一些数据,目前比较流行的交互数据格式就是JSON,可是服务器中得到的JSON数据如果提供给业务人员看的话可能会非常不方便,这时候,转成CS ...

  3. cocos2d-x C++ 工程初探

    经过较为繁琐的环境搭建后,我们终于运行出了一个helloworld窗口,可以正式上手cocos了 现在我们就从改代码开始玩起 窗口 我们之前讲到AppDelegate类是程序的入口,所以和窗口有关的设 ...

  4. 02-25 scikit-learn库之决策树

    目录 scikit-learn库之决策树 一.DecisionTreeClassifier 1.1 使用场景 1.2 代码 1.3 参数详解 1.4 属性 1.5 方法 二.DecisionTreeR ...

  5. Flask学习总结

    Flask的使用以及返回值(其中Response后续详细单独补充) Flask的路由解读以及其配置 Flask的请求扩展 Flask中的cookie和session Flask中的request和re ...

  6. django搭建BBS-表单创建&注册

    django搭建BBS-表单创建&注册 0824自我总结 文件结构 app 接口 migrations __inint__.py admin.py 管理员页面注册表单用 apps.py bbs ...

  7. MySQL时间盲注五种延时方法 (PWNHUB 非预期解)

    转自cdxy师傅:https://www.cdxy.me/?p=789 PWNHUB 一道盲注题过滤了常规的sleep和benchmark函数,引发对时间盲注中延时方法的思考. 延时函数 SLEEP ...

  8. 特征真的越多越好吗?从特征工程角度看“garbage in,garbage out”

    1. 从朴素贝叶斯在医疗诊断中的迷思说起 这个模型最早被应用于医疗诊断,其中,类变量的不同值用于表示患者可能患的不同疾病.证据变量用于表示不同症状.化验结果等.在简单的疾病诊断上,朴素贝叶斯模型确实发 ...

  9. opencv::Canny边缘检测

    Canny算法介绍 五步 in cv::Canny 高斯模糊 - GaussianBlur 灰度转换 - cvtColor 计算梯度 – Sobel/Scharr 非最大信号抑制 高低阈值输出二值图像 ...

  10. 图论-最小生成树<Kruskal>

    昨天: 图论-最小生成树<Dijkstra,Floyd> 以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog. 可能今天的有点乱,好好理理,认真看完相信你会懂得 然而,文中提 ...