爬虫库urllib使用(1)发送请求

文章目录

      • 一、官方地址
      • 二、urllib库说明
      • 三、发送请求
        • 3.1、urlopen()
        • 3.2、request()
        • 3.3、高级用法
          • (1)、BaseHandler类
          • (2)、验证
          • (3)、代理
          • (4)、Cookies

一、官方地址

https://docs.python.org/3/library/urllib.html

二、urllib库说明

urllib是Python内置的HTTP请求库,它主要包含4个模块

  1. request: 最基本的HTTP模块,用来模拟发送请求
  2. error:异常处理模块,如果出现请求错误,可以捕获这些异常,然后进行重试或者其他操作保证程序不会意外停止
  3. parse:一个工具模块,提供许多URL处理方法,比如拆分,解析,合并
  4. robotparser:主要用来识别网站的robot.txt文件,然后判定哪些网站可以爬,哪些网站不可以爬取

三、发送请求

3.1、urlopen()

  urllib.request模块提供了最基本的构造HTTP请求方法,利用它可以模拟浏览器的一个请求发起过程,同事它还带有处理授权验证(authentication)、重定向(redirection)、浏览器Cookies以及其他内容

import urllib.request

response = urllib.request.urlopen("https://www.python.org")
print(response.read().decode("utf-8"))

运行结果:
爬虫库urllib使用(1)发送请求_第1张图片可以获取到网页的源码,我们可以使用type看看获取的类型:

import urllib.request

response = urllib.request.urlopen("https://www.python.org")

#    这是一个HTTPResponse对象,主要包含了read(),readinto(),getheader(name),getheaders()
#  fileno()等方法,以及msg,version,status,reason,debuglevel,cloase属性
print(type(response))

在这里插入图片描述
   这是一个HTTPResponse对象,主要包含了read(),readinto(),getheader(name),getheaders(),fileno()等方法,以及msg,version,status,reason,debuglevel,cloase属性

import urllib.request
import urllib.parse
import socket


response = urllib.request.urlopen("https://www.python.org")
print(response.read().decode("utf-8"))


#    这是一个HTTPResponse对象,主要包含了read(),readinto(),getheader(name),getheaders()
#  fileno()等方法,以及msg,version,status,reason,debuglevel,cloase属性
print(type(response))
print(response.status)
print(response.getheaders())
print(response.getheader("Server"))

urlopen()函数的API

urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):
  • data参数
      data参数是可选参数,如果添加这个参数,并且如果他是字节流编码格式的内容,即bytes类型,则需要通过bytes()方法转化,如果从传递了这个参数,则她的请求为POST请求。
# data 参数
data = bytes(urllib.parse.urlencode({
     "word":"hello"}), encoding="utf-8")
response = urllib.request.urlopen("https://httpbin.org/post", data)
print(response.read())

  这里我们传递了一个参数键是’word’,值是’hello’,它需要被转化为bytes类型,这个方法的第一个参数需要一个str类型没需要使用对urllib.parse.urlencode()方法将字典转化为字符串,第二个参数是编码格式,指定为utf-8.

爬虫库urllib使用(1)发送请求_第2张图片我们传递的参数出现在form字段中了,表明是以post方式请求

  • timeout参数
      tiemout参数用于设置超时时间,单位为秒,意思就是如果请求超出了设置时长,没有得到响应,就会抛出异常。如果不指定该参数,使用全局默认时间,支持HTTP、HTTPS、FTP请求。
# timeout 参数  可以通过设置这个超时时长来控制一个网页如果长时间未响应,就跳过它的抓取,可以利用try-except实现
try:
    reponse = urllib.request.urlopen("http://httpbin.org/get", timeout=0.1)
except urllib.error.URLError as e:
    # 如果错误原因是socket.timeou
    if isinstance(e.reason, socket.timeout):
        print("TIME OUT")
print(response.read())

  我们设置了超时时间是0.1秒,如果超出这个时间没有得到响应就会认为请求异常,跑出个URLError,我们可以通过设置超时时间来控制一个网页如果长时间未响应,就跳过它的抓取

  • 其他参数
    context 参数,必须是ssl.SSLContext类型,用来指定SSL设置。
    cafile和capath分别指定CA证书和它的路径,在请求HTTPS时会用到。
    cadefault被弃用。

3.2、request()

  利用urlopen()方法可以实现最基本请求的发起,,但是不足以构建一个完整的请求,如果请求中需要加入head信息,就可以利用Request类来构建。

import urllib.request
request = urllib.request.Request("https://python.org")
response = urllib.request.urlopen(request)
print(response.read().decode("utf-8"))

我们依然使用openurl()方法来发送一个请求,这次方法的参数是一个Request对象。

Request()函数的API

Request (url, data=None, headers={
     }, origin_req_host=None, unverifiable=False,method=None):

1、url: 必传,为请求地址
2、data :可选参数 如果要传,必须传byte(字节流)类型,如果是字典,可以用urllib.parse模块里的urlencode()编码
3、headers :请求头,是一个字典,我们可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加
添加请求头最常用的用法就是修改User-Agent来伪装浏览器,默认的User-Agent为Python-urllib,我们可以通过修改它来伪装浏览器
4、origin_req_host: 指的是请求方的host名称或者IP地址
5、unverifiable :表示这个请求是否是无法验证的,默认是false,意思是说用户没有权限来选择接受这个请求的结果
6、method: 是一个字符串,用来指示请求使用的方法,比如GET、POST

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')
request = urllib.request.Request(url=url, headers=headers, data=data, method='POST')
# request.add_header('User-Agent','Mozilla/4.0(compatible; MSIE 5.5; Windows NT)')
try:
    response = urllib.request.urlopen(request, timeout=1)
except urllib.error.URLError as e:
    if isinstance(e.reson, socket.timeout):
        print("TIME OUT")
print(response.read().decode('utf-8'))

运行结果:
爬虫库urllib使用(1)发送请求_第3张图片

3.3、高级用法

(1)、BaseHandler类

  urllib.request模块里的BaseHandler类,他是所有其他Handler类的父类,他提供了最基本的方法,default_open(),protocal_request()等

  • urllib.request.HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误会抛HTTPError类型的异常
  • urllib.request.HTTPRedirectHandler:用于处理重定向
  • urllib.request.HTTPCookieProcessor 用于处理Cookies
  • urllib.request.ProxyHandler 用于处理代理,默认代理为空
  • urllib.request.HTTPPasswordMgr 用于管理密码,维护了用户名和密码表
  • urllib.request.HTTPBasicAuthHandler 用于处理认证,如果一个连接打开时需要认证
(2)、验证
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError

username = 'username'
password = 'password'
url = 'http://localhost:5000/'

p = HTTPPasswordMgrWithDefaultRealm()
#  利用add_password添加用户名和密码,这样建立一个处理验证的Handler
p.add_password(None, uri=url, user=username, passwd=password)
auth_handler = HTTPBasicAuthHandler(p)
# 利用build_opener构建一个opener,这个opener在发送请求时相当于已经验证成功了
opener = build_opener(auth_handler)
try:
    # 利用 opener.open打开链接,完成验证
    result = opener.open(url)
    html = result.read().encode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)

  首先实例化HTTPBasicAuthHandler对象,参数是一个HTTPPasswordMgrWithDefaultRealm对象,利用add_password()添加进去用户名和密码,这样就建立了一个处理验证的Handler。然后再利用handler使用build_opener构建一个opener,这个opener在发送请求时就相当于验证成功了,然后在利用Opener的open()方法打开链接。

(3)、代理
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener

# 使用ProxyHandler,参数是一个字典,键名是协议类型,键值是代理链接,可以添加多个代理
proxy_handler = ProxyHandler({
     
    'http': 'http://127.0.0.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().encode('utf-8'))
except URLError as e:
    print(e.reason)

使用ProxyHandler,参数是一个字典,键名是协议类型,值是代理链接,可以添加多个代理。

(4)、Cookies
import http.cookiejar,urllib.request


cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("https://www.baidu.com")
for item in cookie:
    print(item.name + '=' + item.value)

  首先我们声明一个CookieJar,然后利用urllib.request.HTTPCookieProcessor来构建一个handler,最后利用build_opener构建出opener,最后执行open()函数即可。

运行结果:
爬虫库urllib使用(1)发送请求_第4张图片
将cookies信息以文本形式保存:

# 进行文件存储
filename = 'D:/cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
# 调用load方法来读取本地的cookie文件,获取到cookie内容
cookie.load('D://cookies.txt',ignore_expires=True, ignore_discard=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("https://www.baidu.com")
cookie.save(ignore_discard=True, ignore_expires=True)

这里使用MozillaCookieJar代替CookieJar,在生成和读取文件时用到。
运行结果
爬虫库urllib使用(1)发送请求_第5张图片
LWPCookieJar同样可以读取和保存Cookeies,但是保存的格式和MozillaCookieJar不一样,它会保存成libwww-perl(LWP)格式的cookies文件

cookie = http.cookiejar.LWPCookieJar(filename)
# 进行Cookies读取
filename = 'D:/cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename)
cookie.load('D://cookies.txt',ignore_expires=True, ignore_discard=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("https://www.baidu.com")
cookie.save(ignore_discard=True, ignore_expires=True)

调用load()方法来读取本地的Cookies文件
运行结果:
爬虫库urllib使用(1)发送请求_第6张图片

你可能感兴趣的:(Python,python,urllib,爬虫)