重拾python爬虫之urllib
学习一门技术,总是要踩好多坑,然后收货一大堆疑惑,这么多相似的方式该学哪个呢?外面公司常用的是哪个呢?
就比如python爬虫,可以作为网络请求的方式有四种,按时间顺序排:
第一种,urllib2 ,这个包是基于python2的,官方已经对python2停止更新了并且不再免费,我觉得这个urllib2没必要再学习和使用
第二种,urllib 这个是python的标准库,在python3里整合了python2的urllib和urllib2 ,有时间的可以学习一下。
第三种,urllib3,这个是第三方库,是对第二种方式urllib的升级,做了很多改善,有时间可以学习一下。
第四种,也是很流行的requests,各种请求的方法非常的优雅和人性化,其底层是urllib3,简化headers、proxy、cookie等的操作。这个重点学习。
作为一个爬虫工程师,如果你连urllib一点不会就说不过去了。虽然不常用,但是学习它,有它的历史意义,对爬虫的整个架构有一个更透彻的了解。
一、简介
urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。基本上涵盖了基础的网络请求功能。
该库有四个模块,分别是urllib.request,urllib.error,urllib.parse,urllib.robotparser。前三个比较常用。
urllib.request 发送http请求
urllib.error 处理请求过程中,出现的异常。
urllib.parse 解析url
urllib.robotparser 解析robots.txt 文件
二、请求方式
1、get请求
#第一步导包 from urllib import request url = "http://httpbin.org" #第二步请求 response = request.urlopen(url,timeout=1) #第三步打印返回数据 print(response.read().decode())
访问的结果会是一个http.client.HTTPResponse对象,使用此对象的read()方法,则可以获取访问网页获得的数据。但是要注意的是,获得的数据会是bytes的二进制格式,所以需要decode()一下,转换成字符串格式。
urllib发送请求是用urlopen()
源码如下
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
第一个参数 String 类型的地址
data 是 bytes 类型的内容,可通过 bytes()函数或者encode()转为化字节流。它也是可选参数。使用 data 参数,请求方式变成以 POST 方式提交表单。使用标准格式是application/x-www-form-urlencoded
timeout 参数是用于设置请求超时时间。单位是秒。
cafile和capath代表 CA 证书和 CA 证书的路径。如果使用HTTPS则需要用到。
context参数必须是ssl.SSLContext类型,用来指定SSL设置
cadefault参数已经被弃用,可以不用管了。
该方法也可以单独传入urllib.request.Request对象
该函数返回结果是一个http.client.HTTPResponse对象。
http.client.HTTPResponse对象。它具有msg、version、status、reason、debuglevel、closed等属性以及read()、readinto()、getheader(name)、getheaders()、fileno()等函数。
# print(response.msg) # OK # print(response.version) #11 # print(response.status) #200 # print(response.reason) #OK # print(response.getcode()) #200 # print(response.getheaders) # <bound method HTTPResponse.getheaders of <http.client.HTTPResponse object at 0x0000023C554DB588>> # print(response.geturl()) #http://httpbin.org/headers
2、post请求
from urllib import request,parse url = "http://httpbin.org"data = { 'name':'xfy'}# data = bytes(parse.urlencode(data),encoding='utf8'); data = parse.urlencode(data).encode() response = request.urlopen(url+"/post",data=data) print(response.status) #200print(response.read().decode())
data 需要被转码成字节流。而data 是一个字典。我们需要使用 parse.urlencode() 将字典转化为字符串。再使用 bytes()或者encode() 转为字节流。最后使用 urlopen() 发起请求,请求是模拟用 POST 方式提交表单数据。
这里说一下http://httpbin.org,这个url专门是用来爬虫请求测试的。
http://httpbin.org/get 测试get请求 http://httpbin.org/post 测试post请求 http://httpbin.org/headers 测试获得headers http://httpbin.org/ip 测试获得ip http://httpbin.org/cookies 测试获得cookies
三、创建 Request 对象
urlopen()还可以传一个Request对象
req = request.Request(url+"/get") response = request.urlopen(req) print(response.read().decode())
urllib/request 包下有一个类Request
其初始化方法如下
def __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None):
url 参数是请求链接,这个是必传参数,其他的都是可选参数。
data 参数跟 urlopen() 中的 data 参数用法相同。
headers 参数是指定发起的 HTTP 请求的头部信息。headers 是一个字典。它除了在 Request 中添加,还可以通过调用 Reques t实例的 add_header() 方法来添加请求头。
origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。
unverifiable 参数表示这个请求是否是无法验证的,默认值是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,我们就要将 unverifiable 的值设置成 True。
method 参数指的是发起的 HTTP 请求的方式,有 GET、POST、DELETE、PUT等
来源:PY学习网:原文地址:https://www.py.cn/article.html