urllib.request.urlopen()基本使用_CodingALife的博客-程序员秘密_request.urlopen

技术标签: python  Python基础详解  

1. urlopen( ) 方法

用于打开一个远程的url连接,并且向这个连接发出请求,获取响应结果。返回的结果是一个http响应对象,这个响应对象中记录了本次http访问的响应头和响应体

urllib.request.urlopen 参数介绍
urllib.request.urlopen(  url,   data=None,   [timeout, ]*,  cafile=None, capath=None, cadefault=False, context=None)

import urllib.request

url = 'https://www.python.org'
# 方式一
response = urllib.request.urlopen(url)
print(type(response))  # <class 'http.client.HTTPResponse'>
# 方式二
request = urllib.request.Request(url)
res = urllib.request.urlopen(url)
print(type(res))  # <class 'http.client.HTTPResponse'>

print(response.status)  # 200 获取响应状态码
print(response.reason)  # OK
print(response.version)  # 11
print(response)    # 获取响应,结果为:<http.client.HTTPResponse object at 0x10be801d0>
print(response.headers)   # 获取响应头
# Server: nginx
# Content-Type: text/html; charset=utf-8
# X-Frame-Options: DENY
# Via: 1.1 vegur
# Via: 1.1 varnish
# Content-Length: 48830
# Accept-Ranges: bytes
# Date: Thu, 12 Mar 2020 10:34:07 GMT
print(response.url)       # https://www.python.org  获取响应url
print(response.read())                  # 获取响应体 二进制字符串
print(response.read().decode("utf-8"))  # 对响应体进行解码
# 按行读取
print(response.readline())      # 读取一行
print(response.readline())      # 读取下一行
print(response.readlines())    # 读取多行。得到一个列表 每个元素是一行

通过结果可以发现response是一个HTTPResposne类型的对象,它主要包含的方法有read()、readinto()、getheader(name)、getheaders()、fileno()等函数和msg、version、status、reason、debuglevel、closed等属性。
例如response.read()就可以得到返回的网页内容,response.status就可以得到返回结果的状态码,如200代表请求成功,404代表网页未找到等。

2、添加data参数的时候就是以post请求方式请求,若没有data参数就是get请求方式

from urllib import request, parse

# 用parse模块,通过bytes(parse.urlencode())可以将post数据进行转换并放到
# urllib.request.urlopen的data参数中。这样就完成了一次post请求。
data = bytes(parse.urlencode({'word': 'hello'}), encoding='utf8')
response = request.urlopen('http://httpbin.org/post', data=data)
print(response.read())

3、timeout参数使用

在某些网络情况不好或者服务器端异常的情况会出现请求慢的情况,或者请求异常,所以这个时候我们需要给
请求设置一个超时时间,而不是让程序一直在等待结果。所以使用 timeout参数设置超时时间

import urllib.request

response = urllib.request.urlopen('http://httpbin.org/get', timeout=1)
print(response.read())   # 正常结束,控制台显示:socket.time : timed out
response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
print(response.read())   # 超时,控制台显示:urllib.error.URLErrot : <urlopen error timed out>

4、Request(url=url, data=data, method='POST') 方法

web开发中,同一个url往往可以对应若干套不同的数据(或者界面,如手机、电脑),后台可以根据发起请求的前端的用户代理的不同,而决定应该给前端做出什么样的响应,如果检测到没有用户代理可以拒绝访问。

有很多网站为了防止程序爬虫爬网站造成网站瘫痪,会需要携带一些headers头部信息才能访问,最长见的有user-agent参数所以需要伪装请求头,去访问目标站。

urllib.ruquest.Request 参数介绍:

           urllib.ruquest.Request(url=url,headers=headers,data=data,method='POST')

 headers 参数使用;给请求添加头部信息,定制自己请求网站时的头部信息,使得请求伪装成浏览器等终端

url = "http://www.baidu.com/"
req = request.Request(url=url, headers={'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64;x64)AppleWebKit/537.36 (KHTML, likeGecko)Chrome/71.0.3578.80Safari/537.36'})
res = request.urlopen(req)  # 用加入了请求头的请求对象发起请求
print(res.status)           # 打印状态码

添加请求头的post请求方式

from urllib import request, parse

url = 'http://httpbin.org/post'
headers = {
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
            'Host': 'httpbin.org'
          }
dict = {'name': 'taotao'}
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'))

添加请求头的第二种post方式, 好处是自己可以定义一个请求头字典,然后循环进行添加

from urllib import request, parse

url = 'http://httpbin.org/post'
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/4.0 (compatible; MSIE 5.5; Windows NT)')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

5、urllib.parse模块 方法

url解析模块

1. urlparse( ) 方法 拆分url

URL解析函数侧重于将URL字符串拆分为其组件,或者将URL组件组合为URL字符串

拆分的时候协议类型部分就会是scheme=“ ”指定的部分。如果url里面已经带了协议,scheme指定的协议不会生效

urllib.parse.urlparse(urlstring, scheme=" ", allow_fragments=True)

urlparse("www.baidu.com/index.html;user?id=5#comment",scheme="https")

from urllib.parse import urlparse, urlunparse

# 对传入的url地址进行拆分; 可以用 scheme=“ ” 指定协议类型:
result = urlparse("http://www.baidu.com/index.html;user?id=5#comment")
print(result)
# ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html',
# params='user', query='id=5', fragment='comment')

2. urlunparse( ) 方法  拼接url

功能和urlparse的功能相反,它是用于拼接 

data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=123', 'commit']
print(urlunparse(data))  # http://www.baidu.com/index.html;user?a=123#commit

6. urlencode( ) 方法 

这个方法可以将字典转换为url参数

对url进行编码,因为urllib这个框架中的url中不能出现汉字,只能出现ascii码字符

from urllib import parse

url = "https://www.baidu.com/s?"
# 把参数写成字典的形式
dic = {"ie": "utf-8", "wd": "奔驰"}
# 用parse的urlencode方法编码
parames = parse.urlencode(dic)
# 将编码以后的参数拼接到url中
url += parames
print(request.urlopen(url=url))

参考:https://www.lagou.com/lgeduarticle/34376.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mingyuli/article/details/104824709

智能推荐

ARM 交叉编译环境搭建_arm交叉编译环境搭建_YJM_____的博客-程序员秘密

apt-get install gcc-arm-linux-gnueabi一句话能搞定的事,没必要手动编译

《安全软件开发之道:构筑软件安全的本质方法》_weixin_34302798的博客-程序员秘密

《安全软件开发之道:构筑软件安全的本质方法》基本信息原书名:Building Secure Software: How to Avoid Security Problems the Right Way作者: (美)John Viega    Gary McGraw   译者: 殷丽华 张冬艳郭云川 颜子夜丛书名: 信息安全技术丛书出版社:机械工业出版社ISBN:9787...

git更换用户名和密码_Ginny_2019的博客-程序员秘密

1. 查看Git的配置文件,可查看到用户名git config --listgit config--global user.name="huyan"可查看用户名和密码的设置2. set用户名密码,pull或push不用输入用户名和密码git remote -v 获取到远程的url, 然后将用户名和密码放在http://或https://之后,git remote s...

浅谈oracle中的context(上下文)_context是session级别吗_编程小强的博客-程序员秘密

转载自:http://blog.itpub.net/25701553/viewspace-702957context这个词见得还是挺多的,尤其是在计算机领域。大部人将它翻译为上下文,我也就跟随大众吧。比如操作系统中的上下文切换等等。那么上下文到底意味着什么呢?在我看来就是当前程序运行的一个环境信息。举个例子说吧,当一个用户登录oracle之后就会有一个session,这个session中包含了

haskell 基础题解(26)_可雷曼土的博客-程序员秘密

手算开平方【题目】如果没有计算机,你会手算开平方吗? 实际上,这不需要特殊的口诀,只要用普通的四则运算就足够了。比如求2的开方,你先猜一个数 p, 用 2 除以 p 得 q。假如正好猜中了,必然 p = q,如果没猜中,那么真实的值必定在 p, q 之间,下一次你就猜 (p+q)/2, 如此反复就可以很快达到很高的精度了。请编程模拟这个过程。从描述中可以感觉到是个递归的过程。haskell 处...

什么是PON光模块?PON光模块有哪些作用和类型?_audrey-luo的博客-程序员秘密

光纤到户(FTTH)技术为高速宽带接入到家庭用户提供了理想平台,而且给固定接入网和先进的无线网络带来了巨大益处,而PON(以太网无源光网络)作为光纤到户部署中的领先技术,现已广泛应用于网络部署中。PON以太网无源光网络的广泛应用离不开PON光模块,因为它是PON系统的重要组成部分。飞速(FS)在本文将介绍一些实用的PON光模块知识。什么是PON光模块?PON光模块的功能和作用是什么?PON光模块是用于PON系统的一种高性能光模块,也被称为PON模块,符合ITU-T G.984.2标准和多源协议(MS

随便推点

serializeArray()和serialize()方法的用法和区别。_hellwrol的博客-程序员秘密

serializeArray()序列化表单1、serialize()方法描述:序列化表单内容为字符串,用于Ajax请求。 格式:var data = $(form).serialize();2.serializeArray()方法描述:序列化表单元素(类似’.serialize()’方法)返回JSON数据结构数据。注意,此方法返回的是JSON对象而非JSON字符串。需要使用插件或者第...

远程关闭Windows 2008服务器_杨江的博客-程序员秘密

其中af007是我的Windows 2008服务器主机名命令分两部分,第一步是登录远程Windows 2008服务器(否则第二步会报错access denied),第二步关机。net use \\af007\IPC$ mypassword /USER:Administratorshutdown /s -m \\af007参考:官方参考:http://technet.microsoft.com/en

Http状态码大全_初来乍到到的博客-程序员秘密

基本涵盖了所有问题HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HTTP 401.4 – 未授权:授权被筛选器拒绝HTTP 401.5 – 未授权:ISAPI 或 CGI 授权失败HTTP 403 – 禁止访问HTTP 403 – 对 Int...

IntelliJ IDEA 常用快捷键 之 Windows 版_CG国斌的博客-程序员秘密

IntelliJ IDEA(简称 IDEA),是Java语言开发的集成环境,IDEA在业界被公认为最好的Java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(Git、SVN、GitHub等)、JUnit、CVS整合、代码分析和创新的GUI设计等方面的功能都值得称道。IDEA作为现今最常用的开发工具之一,如果我们能够熟悉其快捷键,自然可以让我们在编程的过程中得心应手。

《大型网站技术架构》学习笔记-02架构篇_weixin_34375054的博客-程序员秘密

上一篇文章已经介绍了网站系统最需要关注的5大质量属性,接下来对这些特性进行详细介绍(这部分有部分内容会显得有些陈旧,之后会进行更新)。高性能架构网站性能测试性能测试时性能优化的前提和基础,也是性能优化结果的检查和度量标准,接下来介绍常见的性能测试指标。响应时间:指一个操作的时间,包括发出请求开始到收到响应数据所需的时间,比如数据库查询一条带索引的记录需要10ms;机械磁盘顺序读取1MB...

C++反转链表_stitchshaw的博客-程序员秘密

https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca正规解法(反转链表,通过调整链表指针达到反转链表)时间复杂度:O(n), 遍历一次链表空间复杂度:O(1)/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public:

推荐文章

热门文章

相关标签