Python爬虫入门学习----Urllib和urllib3包的使用

urllib包
urllib是一个包含几个模块来处理请求的库:
- urllib.request发送http请求
- urllib.error处理请求过程中出现的异常
- urllib.parse解析url
- urllib.robotparser解析robots.txt文件

快速请求
urlopen返回对象提供一些基本方法:

  • read返回文本数据
  • info服务器返回的头信息
  • getcode状态码
  • geturl请求的url
request.urlopen(url, data=None, timeout=10)
#url:  需要打开的网址
#data:Post提交的数据
#timeout:设置网站的访问超时时间

response = urllib2.urlopen("http://www.baidu.com")
print response.read().decode('utf-8')

urllib3
Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性:
1.线程安全
2.连接池
3.客户端SSL/TLS验证
4.文件分部编码上传
5.协助处理重复请求和HTTP重定位
6.支持压缩编码
7.支持HTTP和SOCKS代理

urllib3的使用
request GET请求:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib3
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')
#Python的str默认是ascii编码,和unicode编码冲突.

#一个PoolManager实例来生成请求,由该实例对象处理与线程池的链接以及线程安全的所有细节
hhtp = urllib3.PoolManager()
#通过request()方法创造一个请求:
r = hhtp.request('GET','http://www.baidu.com')
#获得登录状态码
print(r.status)
#获得html源码,utf-8解码
print r.data.decode()

request(self, method, url, fields=None, headers=None, **urlopen_kw)

  • 第一个参数method必选,指定请求方式。
  • 第二个参数url必选
  • 第三个fields,请求的参数,可选
  • 第四个headers可选

request GET请求(添加数据)

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib3
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')
#Python的str默认是ascii编码,和unicode编码冲突.

#一个PoolManager实例来生成请求,由该实例对象处理与线程池的链接以及线程安全的所有细节
http = urllib3.PoolManager()
#通过request()方法创造一个请求:



header={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3493.3 Safari/537.36'
}
r = http.request('GET','http://www.zzu.edu.cn/',headers=header)
#获得登录状态码
print(r.status)
#获得html源码,utf-8解码
print r.data.decode()

这里写图片描述


Post请求类比Get请求,同样可以在request中添加数据

发送JSON数据

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib3
import requests
import sys
import json
reload(sys)
sys.setdefaultencoding('utf8')
#Python的str默认是ascii编码,和unicode编码冲突.

#一个PoolManager实例来生成请求,由该实例对象处理与线程池的链接以及线程安全的所有细节
http = urllib3.PoolManager()
#通过request()方法创造一个请求:



header={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3493.3 Safari/537.36'
}
#r = http.request('GET','http://www.zzu.edu.cn/',headers=header)
'''#获得登录状态码
print(r.status)
#获得html源码,utf-8解码
print r.data.decode()'''
data={'郭翔':'666'}
#使用 json.dumps方法可以将python对象转换为json对象
encode_data = json.dumps(data).encode()
r = http.request('POST','http://httpbin.org'+'/post',body=encode_data,headers={'Content-Type':'application/json'})
print(r.data.decode('unicode_escape'))

JSON:在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据
这里写图片描述

上传文件

#使用multipart/form-data编码方式上传文件,可以使用和传入Form data数据一样的方法进行,并将文件定义为一个元组的形式     (file_name,file_data):
with open('1.txt','r+',encoding='UTF-8') as f:
    file_read = f.read()

r = http.request('POST',
                 'http://httpbin.org/post',
                 fields={'filefield':('1.txt', file_read, 'text/plain')
                         })
print(r.data.decode('unicode_escape'))

#二进制文件
with open('websocket.jpg','rb') as f2:
    binary_read = f2.read()

r = http.request('POST',
                 'http://httpbin.org/post',
                 body=binary_read,
                 headers={'Content-Type': 'image/jpeg'})
#
# print(json.loads(r.data.decode('utf-8'))['data'] )
print(r.data.decode('utf-8'))

使用Timeout

#使用timeout,可以控制请求的运行时间。在一些简单的应用中,可以将timeout参数设置为一个浮点数:
r = http.request('POST',
                 'http://httpbin.org/post',timeout=3.0)

print(r.data.decode('utf-8'))

#让所有的request都遵循一个timeout,可以将timeout参数定义在PoolManager中:
http = urllib3.PoolManager(timeout=3.0)

对重试和重定向进行控制

#通过设置retries参数对重试进行控制。Urllib3默认进行3次请求重试,并进行3次方向改变。
r = http.request('GET',
                 'http://httpbin.org/ip',retries=5)#请求重试的次数为5

print(r.data.decode('utf-8'))
##关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可:
r = http.request('GET',
                 'http://httpbin.org/redirect/1',retries=False,redirect=False)
print('d1',r.data.decode('utf-8'))
#关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可
r = http.request('GET',
                 'http://httpbin.org/redirect/1',redirect=False)

猜你喜欢

转载自blog.csdn.net/jpygx123/article/details/81230076