urllib库的操作(一)-----python3

原创
小哥 3年前 (2022-11-16) 阅读数 8 #大杂烩

你 urlib库为python3的HTTP内置请求库
urilib四个模块中:

  • urllib.request:这是最基本的HTTP请求模块,可用于模拟发送请求。就像在浏览器中输入网址,然后输入汽车一样,您只需要传入库方法。URL以及其他参数,您可以模拟此过程的实现。

  • urllib.error:异常处理模块,用于处理异常的模块

  • urllib.parse:用于解析url,一个工具模块URL处理方法,如拆分、解析、合并等。

  • urllib.robotparse:用于解析robots.txt,主要用于查看哪些网站无法爬网,但较少
    urllib的用法
    urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

    urllib.request.urlopen(url, data=None, timeout=<object object at 0x000002407EBBC770>, *, cafile=None, capath=None, cadefault=False, context=None)

  • url:对于请求URL

  • data:请求时要发送的参数

  • timeout:超时设置,在此时间范围内返回请求的内容不会报告错误。

发送请求

urlopen()它模拟了浏览器的请求发起过程,并且还具有处理授权身份验证(authenticaton),重定向(redirection),浏览器Cookies以及其他

import urllib.request  # 导入urllib.request模块,提供最基本的构造HTTP请求的方法
response = urllib.request.urlopen(http://www.baidu.com)  # 以python以官方网站为例,爬下这个页面
print(response.read().decode(utf-8))    # read()方法获取返回的网页内容。

操作结果:输出是网页的源代码。获得代码后,我们可以提取我们想要的链接、图片地址和文本信息。

print(type(response)) # 输出响应类型
print(,,,,,,,,,,,,)
print(response.status) # 返回结果的状态代码
print(,,,,,,,,,,,,)
print(response.getheaders())   # 响应的头部信息
print(,,,,,,,,,,,,)
print(response.getheader(Server)) # 在响应标头中Server值,nginx这意味着服务器使用nginx搭建的
  • HTTPResponse类型对象,主要包括:read()、readinto()、getheader(name)、getheaders()、fileno()以及其他方法,以及msg、version、status、debuglevel、closed以此类推,在我们得到这个对象后,我们将其赋值。response变量,然后您可以调用这些方法和属性来获取返回结果的一系列信息。
  • 调用read()方法可以获取返回的网页内容,调用。status属性可以得到返回结果的状态代码,如:200代表成功的请求,404找不到代表性网页等。
  • 前两个输出分别输出了响应的状态码和响应的头部信息,最后一个输出通过调用getheader()方法并传递参数。Server获取了在响应标头中Server值,结果为nginx,这意味着使用服务器。Nginx建造。使用最基本的urlopen()方法,您可以完成最基本的简单网页。GET请求抓取。
  • data参数

请求时加载数据
data参数是可选的,需要bytes键入,如果没有,则需要通过。bytes()方法转换,另外传递 此参数,则其请求方法不再GET方法POST方式

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({word:hello}), encoding = utf8)  # 传递参数word,值为hello,需要转码bytes类型
response = urllib.request.urlopen(http://httpbin.org/post,data=data)
print(response.read())
  • timeout参数

timeout参数,如果不指定,就会使用全局默认时间,超时设置,在此时间范围内返回请求的内容不会报告错误。,单位为秒,超过设置的时间,还没有得到响应,就会抛出异常,该异常属于urllib.error模块,错误是由于超时。
根据超时请求判断,如果网页长时间没有响应,它将跳过爬网。

import socket
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)

操作结果:TIME OUT

根据常识,0.1通过设置,几乎不可能在几秒钟内获得服务器响应。timeout此参数用于实现超时处理,因此输出为TIMEOUT的提示

context参数,必须是ssl.SSLContext类型,用于指定SSL设置
caflie和capath这两个参数指定CA证书及其路径,这在请求中。HTTPS链接时有用
cadefault已弃用,默认False

如果我们想返回有关当前环境的信息,可以使用info()返回,例如可以执行的。

>>>response.info()
  • 如您所见,相应的输出info,调用格式为:“爬网网页.info()“,我们爬网到的页面已分配给变量response,所以此时通过。response调用。
  • 如果要获取当前已爬网的URL地址,我们可以使用geturl()来实现

    response.geturl() http://www.baidu.com

quote() unquote()
一般来说URL只允许标准的一部分。ASCII数字、字母、部分符号等字符,而其他字符(如汉字)则不符合。URL标准此时,我们需要编码。
如果你想编码,我们可以使用urllib.request.quote()进行,解码编码的URL

urllib.request.unquote

#代码百度,股份有限公司URL
>>>urllib.request.quote(http://www.baidu.com) 
http%3A//www.baidu.com
#解码编码的URL
>>>urllib.request.unquote(http%3A//www.baidu.com)
http://www.baidu.com

from urllib.parse import quote
keyword = 洪源的博客
url = www.baidu.com/s?wd= + quote(keyword)
print(url)

操作结果:

www.baidu.com/s?wd=%E6%B4%AA%E8%BF%9C%E7%9A%84%E5%8D%9A%E5%AE%A2

from urllib.parse import unquote
url = www.baidu.com/s?wd=%E6%B4%AA%E8%BF%9C%E7%9A%84%E5%8D%9A%E5%AE%A2
print(unquote(url))

操作结果:

www.baidu.com/s?wd=洪源的博客

Request方法

urlopen()方法可以实现最基本的发送,但如果要构建完整的请求,则需要加入请求。Headers如信息,您可以利用更强大的Request类来构建
使用Request请求网页并将请求分离为一个对象。

import urllib.request
request = urllib.request.Request(https://python.org)
response = urllib.request.urlopen(request)#还用urlopen()方法发送请求,但这次方法的参数不再是。URL,但是Request类型的对象
print(response.read().decode(utf-8))

Request基本格式:

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • url:请求URL,必须传递参数
  • data如果你想通过,你必须通过bytes键入,如果是字典,可以先使用它。urllib.parse模块里的urlencode()编码
  • headers:请求头,我们可以构造请求。headers参数值构造也可以通过调用请求实例来使用。add_header()方法添加,通常通过修改User-Agent伪装浏览器。
  • origin_req_host:指请求者的host名称或者IP地址
  • unverifiable:是否无法验证此请求,默认False也就是说,用户没有足够的权限选择接受请求的结果。
  • method:是用于请求方法的字符串,例如:GET、POST、PUT等
    浏览器的模拟-Headers属性
    打开任何网页,例如http://httpbin.org/post。然后按F12(或者Fn+F12),将出现一个窗口。转换Network(网络)选项卡:
    然后让网页采取行动。
    我们可以看到一些数据出现在右边的窗口中。将界面右上角的标签切换为“Headers“(标题),也就是说,您可以看到相应的标题信息,此时向下拖动,在 请求标头 最后一行User-Agent包含单词的字符串信息。这串信息是我们模拟下面的浏览器所需的信息。我们把它抄出来。

    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763

    通过Request请求参数以请求网页。

    from urllib import request,parse url = http://httpbin.org/post # 请求URL headers = { # headers指定User-Agent,Host User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36, Host:httpbin.org } dict = { name:Germey } data = bytes(parse.urlencode(dict), encoding=utf8) # 参数转换为字节流 req = request.Request(url=url, data=data, headers=headers, method=POST) # 指定请求方法POST response = request.urlopen(req) print(response.read().decode(utf-8))

    通过Request.add_header方法请求网页。

    from urllib import request,parse url = http://httpbin.org/post # 请求URL dict= { name:Germey } data = bytes(parse.urlencode(dict), encoding=utf8) # 参数转换为字节流 req = request.Request(url = url, data = data, method=POST) req.add_header(User-Agent,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36) response = request.urlopen(req) print(response.read().decode(utf-8))

操作结果:

首先,导入urllib中的request,parse,将URL设置为爬网,然后调用request.Request()函数创建req对象,则传入函数的第一个参数。url,第二个参数可以传入数据,默认值为传入0数据,第三个参数被传递到标头,标头也有一个默认值。默认值是不传递任何标头。
我们需要创建一个dict,报头信息被存储为键值对。dict对象,然后dict对象传入request.Request()函数的第二个参数。
此时,标头已成功设置,然后我们使用它。urlopen()打开该Request对象可以打开相应的网址。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除