当前位置: 首页 > news >正文

Python urllib

Python urllib

Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。

本文主要介绍 Python3 的 urllib。

urllib 包 包含以下几个模块:

  • urllib.request - 打开和读取 URL。
  • urllib.error - 包含 urllib.request 抛出的异常。
  • urllib.parse - 解析 URL。
  • urllib.robotparser - 解析 robots.txt 文件。

在这里插入图片描述

urlopen 语法

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
#url:访问的网址
#data:额外的数据,如header,form data

用法

# request:GET
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))# request: POST
# http测试:http://httpbin.org/
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(response.read())# 超时设置
import urllib.request
response = urllib.request.urlopen('http://httpbin.org/get',timeout=1)
print(response.read())import socket
import urllib.request
import urllib.errortry: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.open
response = urllib.request.urlopen('https:///www.python.org')
print(type(response))
# 状态码, 响应头
import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))

Request

声明一个request对象,该对象可以包括header等信息,然后用urlopen打开。

# 简单例子
import urllib.request
request = urllib.request.Requests('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))# 增加header
from urllib import request, parse
url = 'http://httpbin.org/post'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36''Host':'httpbin.org'
}
# 构造POST表格
dict = {'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding='utf8')
req = request.Request(url=url,data=data,headers=headers,method='POST')
response = request.urlopen(req)
print(response.read()).decode('utf-8')
# 或者随后增加header
from urllib import request, parse
url = 'http://httpbin.org/post'
dict = {'name':'Germey'
}
req = request.Request(url=url,data=data,method='POST')
req.add_hader('User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

设置请求超时

有些请求可能因为网络原因无法得到响应。因此,我们可以手动设置超时时间。当请求超时,我们可以采取进一步措施,例如选择直接丢弃该请求或者再请求一次。

import urllib.requesturl = "http://tieba.baidu.com"
response = urllib.request.urlopen(url, timeout=1)
print(response.read().decode('utf-8'))

使用 data 参数提交数据

在请求某些网页时需要携带一些数据,我们就需要使用到 data 参数。

import urllib.parse
import urllib.requesturl = "http://127.0.0.1:8000/book"
params = {'name':'浮生六记','author':'沈复'
}data = bytes(urllib.parse.urlencode(params), encoding='utf8')
response = urllib.request.urlopen(url, data=data)
print(response.read().decode('utf-8'))

params 需要被转码成字节流。而 params 是一个字典。我们需要使用 urllib.parse.urlencode() 将字典转化为字符串。再使用 bytes() 转为字节流。最后使用 urlopen() 发起请求,请求是模拟用 POST 方式提交表单数据。

异常处理

捕获异常,保证程序稳定运行

# 访问不存在的页面
from urllib import request, error
try:response = request.urlopen('http://cuiqingcai.com/index.htm')
except error.URLError as e:print(e.reason)# 先捕获子类错误
from urllib imort request, error
try:response = request.urlopen('http://cuiqingcai.com/index.htm')
except error.HTTPError as e:print(e.reason, e.code, e.headers, sep='\n')
except error.URLError as e:print(e.reason)
else:print("Request Successfully')
# 判断原因
import socket
import urllib.request
import urllib.errortry: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')
http://www.lryc.cn/news/12956.html

相关文章:

  • Centos7安装Python3
  • [U3D ShaderGraph] 全面学习ShaderGraph节点 | 第四课 | Input/Lighting
  • SpringBoot升级到3.0
  • JavaWeb8-线程安全问题
  • 进程切换-
  • python--matplotlib(2)
  • 【李忍考研传】五、信心
  • Web 页面之间传递参数的几种方法
  • Android实例仿真之二
  • day47【代码随想录】动态规划之买卖股票的最佳时机III、买卖股票的最佳时机IV、最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费
  • 网络数据包接收流程
  • CSAPP学习笔记——虚拟内存(二)
  • 面试sql
  • Python编程自动化办公案例(2)
  • Vulnhub 渗透练习(七)—— FRISTILEAKS: 1.3
  • 阶段二10_面向对象高级_分类分包思想和案例环境搭建
  • 关于打印工具print-js的使用
  • Doxygen使用
  • MySQL数据库调优————表结构设计优化
  • set对象和map对象
  • stream()流的使用
  • C++学习笔记-常量
  • JavaScript系列之实现继承的几种方式
  • java面试准备
  • kafka-6-python单线程操作kafka
  • 【Spring教程】1.Spring概述
  • 设计模式-代理模式
  • DPDK — MALLOC(librte_malloc,Memory Manager,内存管理组件)
  • 【Java开发】Spring 12 :Spring IOC控制反转和依赖注入(解决单接口多实现类调用)
  • 【C++学习】基础语法(三)