百度
360搜索
搜狗搜索

urllib,基本库的使用——urllib.urlopen详细介绍

本文目录一览: Urllib是什么

Urllib是python内置的HTTP请求库 包括以下模块 urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 urllib.robotparser robots.txt解析模块
关于urllib.request.urlopen参数的介绍: urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url参数的使用
先写一个简单的例子:

import urllib.request
response = urllib.request.urlopen(' http://www.baidu.com' ) print(response.read().decode('utf-8'))

urlopen一般常用的有三个参数,它的参数如下: urllib.requeset.urlopen(url,data,timeout) response.read()可以获取到网页的内容,如果没有read(),将返回如下内容

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

urllib库是python内置的HTTP请求库,包含一下4个模块: request :是最基本的HTTP请求模块,可以用来模拟发送请求。
error :异常处理模块,如果出现请求错误,可以捕获异常,然后进行重试或其他操作以保证程序不会意外终止。
parse :一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等
robotparser :主要是用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,一般用的比较少。
urllib.request模块提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起内容。 以python官网为例:
输出结果如下:
使用type()方法输出响应类型:
输出结果为:

可以发现它是一个HTTPResponse类型的对象,主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等属性。 例如:调用read()方法可以得到返回网页的内容,调用status方法可以得到返回结果的状态码:

运行结果为:

urlopen函数的API:

data参数 data参数是可选的,如果使用,需要用bytes方法将参数转化为字节流编码,另外使用data后,请求方式就变成了POST方式

传递了一个参数word,值是hello。它需要被转码成bytes(字节流)类型。使用了bytes()方法,该方法第一个参数需要str类型,需要用urllib.parse模块里的urlencode()方法来将参数字典转为字符串,第二个参数指定编码格式。运行结果如下: b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "word": "hello"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n "Content-Length": "10", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": " httpbin.org ", \n "User-Agent": "Python-urllib/3.8", \n "X-Amzn-Trace-Id": "Root=1-60f81561-6376ab2566bb9e4525f0204e"\n }, \n "json": null, \n "origin": "111.164.173.185", \n "url": " http://httpbin.org/post "\n}\n' timeout参数 timeout参数用于设置超时时间,单位为秒,意思是如果请求超出了设置的这个时间,还没有得到响应,就抛出异常。

运行结果:URLError:

因此可以设置超时时间,控制一个页面若长时间无响应,就跳过抓取,使用try except语句实现。

输出结果为TIME OUT。 其他参数: context参数必须是ssl.SSLContext类型,用来指定SSL设置。 cafile和capth这两个参数分别指定CA证书和它的路径

Urllib库基本使用

最最基本的请求 是python内置的一个http请求库,不需要额外的安装。只需要关注请求的链接,参数,提供了强大的解析。
urllb.request 请求模块 urllib.error 异常处理模块 urllib.parse 解析模块
简单的一个post请求
超时处理
打印出响应类型,状态码,响应头
由于使用urlopen无法传入参数,我们需要解决这个问题 我们需要声明一个request对象,通过这个对象来添加参数
我们还可以分别创建字符串、字典等等来带入到request对象里面
我们还可以通过addheaders方法不断的向原始的requests对象里不断添加
关于代理部分的内容由于条件不足先不做
打印出信息cookies 下面这段程序获取response后声明的cookie对象会被自动赋值
保存cookie文件,两种格式
用文本文件的形式维持登录状态
关于异常处理部分,需要了解有httperror和urlerror两种,父类与子类的关系。
解析,将一个url解析
url拼接

python如何使用urlliburllib2访问http的GET及POST详解

urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据。下面这篇文章主要给大家介绍了关于python如何利用urllib和urllib2访问http的GET/POST的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。前言本文主要给大家介绍了关于python如何访问http的GET/POST的相关内容,使用urllib和urllib2,可以轻松实现对http的访问,下面话不多说了,来一起看看详细的介绍吧。示例详解以下给个例子,实现对http://127.0.0.1/cgi/test的GET与POST使用的是平常意义上的query stringPOST接受json其中,urllib2的Request方法如果只带一个参数是GET方法,但如果带两个参数,则为http的POST方法,第二个参数为POST的内容。#!/usr/bin/env python import urllibimport urllib2import json url_base = "http://127.0.0.1/cgi/test" #GETtry: query = {'test':'yes','name':'colin'} query_string = urllib.urlencode(query) url = url_base+"?"+query_string print "GET", url
print "web output:" print urllib2.urlopen(urllib2.Request(url)).read()except Exception as err: print err #posttry: url = url_base print "POST", url a = {'k1':123, 'k2': '456', 'k3':'test'} json_s = json.dumps(a)
print "POST input:" print json_s
print "web output:" print urllib2.urlopen(urllib2.Request(url, json_s)).read()except Exception as err: print errtest用bash编写,如下所示,其中jq是处理json的命令,需要下载一下,bash/sed/awk应该都是系统自带#!/bin/bashecho -e 'Content-type:text/plain'echo -e '' if [ X"$REQUEST_METHOD" = X"POST" ];then jq . | sed -nr '/:/!d; s/^([ ]*"[^"]+"[ ]*):/1=/;s/,[ ]*$//;s/"//g;p'else echo ${QUERY_STRING} | awk 'BEGIN{RS="&"}1'fi随便用什么webserver都可以,只要支持CGI,我这里用是一个很轻量的webserver——boa,它可能不适合大型应用网站,但嵌入式里用CGI提供API还是很有用的,部署非常容易。搭建之后,测试一下$ ./test.pyGET http://127.0.0.1/v1/lic/test?test=yes&name=colinweb output:test=yesname=colinPOST http://127.0.0.1/v1/lic/testPOST input:{"k3": "test", "k2": "456", "k1": 123}web output: k3= test k2= 456 k1= 123总结

urllib.request 模块-urlopen方法

urllib.request 模块定义了以下函数:

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

参数 :

打开 url 链接,可以是字符串或者是Request对象。

data 必须是一个定义了向服务器所发送额外数据的对象,或者如果没有必要数据的话,就是None值。可以查阅Request获取详细信息。

url.request模块在HTTP请求中使用了HTTP/1.1,并且包含了Connection:close头部。

可选的 timeout 参数指定阻止诸如连接尝试等操作的超时时间(以秒为单位)(如果未指定,将使用全局默认超时设置)。这实际上只适用于HTTP,HTTPS和FTP连接。

如果指定了 context ,则它必须是描述各种SSL选项的ssl.SSLContext实例。 有关更多详细信息,请参阅HTTPSConnection。

可选的 cafile 和 capath 参数为HTTPS请求指定一组可信的CA证书。 cafile 应指向包含一系列CA证书的单个文件,而 capath 应指向散列证书文件的目录。 更多信息可以在ssl.SSLContext.load_verify_locations()中找到。

cadefault 参数被忽略。

返回值:

该函数总是返回一个可以作为 context manager 使用的对象,并且具有方法,例如;

阅读更多 >>>  网站客服代码生成,谁能帮忙写个在线客服右侧挂的代码,能编辑,永久使用的?多种颜色?要能悬浮的哦。。

geturl()- 返回检索的资源的URL,通常用于确定是否遵循重定向;

info()- 以email.message_from_string()实例的形式返回页面的元信息(如headers)(可快速参考HTTP Headers);

getcode()- 返回响应的HTTP状态码。

对于HTTP和HTTPS URL,此函数返回稍微修改的http.client.HTTPResponse对象。 除上述三种新方法之外,msg属性还包含与reason属性(服务器返回的原因短语)相同的信息,而不是HTTPResponse文档中指定的响应标头。

对于由传统URLopener和FancyURLopener类明确处理的FTP,文件和数据URL和请求,此函数返回一个urllib.response.addinfourl对象。

在协议错误上引发URLError。

请注意,如果没有处理请求的handler,则可能返回None(尽管默认安装的全局OpenerDirector使用UnknownHandler来确保永不发生这种情况)。

另外,如果检测到代理设置(例如,如果设置了诸如http_proxy的* _proxy环境变量),则默认安装ProxyHandler,并确保通过代理处理请求。

使用案例

1、简单读取网页信息

2、使用request

urllib.request.Request(url, data=None, headers={}, method=None)

使用request()来包装请求,再通过urlopen()获取页面。

3、发送数据,以登录知乎为例

4、http错误

5、异常处理

6、http认证

7、使用代理

8、超时

urllib,urllib2,urllib3有什么区别?该用哪个

一、在python中,urllib和urllib2不可相互替代的。 整体来说,urllib2是urllib的增强,但是urllib中有urllib2中所没有的函数。
urllib2可以用urllib2.openurl中设置Request参数,来修改Header头。如果你访问一个网站,想更改User Agent(可以伪装你的浏览器),你就要用urllib2.
urllib支持设置编码的函数,urllib.urlencode,在模拟登陆的时候,经常要post编码之后的参数,所以要想不使用第三方库完成模拟登录,你就需要使用urllib。
urllib一般和urllib2一起搭配使用
二、urllib 和urllib2都是接受URL请求的相关模块,但是提供了不同的功能。两个最显著的不同如下:
1.urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
2.urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等(伪装浏览器)。
3.urllib2模块比较优势的地方是urlliburllib2.urlopen可以接受Request对象作为参数,从而可以控制HTTP Request的header部分。
4.urllib2模块没有加入urllib.urlretrieve函数以及urllib.quote等一系列quote和unquote功能,因此有时也需要urllib的辅助

URLLIB3 基本用法

您需要一个PoolManager实例来发出请求。 此对象处理连接池和线程安全的所有详细信息:

您可以在headers参数指定一个字典为header

对于GET,HEAD和DELETE请求,您只需将query参数作为字典传入fields参数

对于POST,PUT请求, 如果是需要在URL中加入参数,那么需要进行
手动编码

如果使用form data 作为POST的参数,怎么可以直接在field中填入参数。

也可以指定一个json对象作为POST的body,但是这时需要设置
Content-Type为 application/json

发送文件, 首先读入文件,然后使用fields来传送数据

默认urllib3不去比verify HTTPS requests
如果需要验证的话需要安装certifi,并且在创建PoolManager的时候加入certifi

如果证书验证失败就会raise SSLError

指定request函数中的retries参数(默认会re-try3次)

这个参数也可以指定给PoolManager

PoolManager 会自动创建ConnectionPool,默认会keep最多10个ConnectionPool实例
如果需要连接更多的host,那么可以加大这个max pool

同样,ConnectionPool类保留一个单独的HTTPConnection实例池。 这些连接在单个请求期间使用,并在请求完成时返回到池中。 默认情况下,只保存一个连接以供重复使用。 如果您同时向同一主机发出许多请求,则可能会提高性能以增加此数量:

ConnectionPool的池的行为与PoolManager不同。 默认情况下,如果发出新请求且池中没有空闲连接,则将创建新连接。 但是,如果存在多个maxsize连接,则不会保存此连接。 这意味着maxsize不确定可以向特定主机打开的最大连接数,而只是确定要保留在池中的最大连接数。 但是,如果指定block = True,则最多可以打开特定主机的maxsize连接:

通过ProxyManager来使用http proxy,用法就和PoolManager一样

这里直接通过proxy去发送请求
如果使用socks5的话需要使用SOCKProxyManager,这时需要安装pysocks 包

python的httplib,urllib和urllib2的区别及用

宗述
首先来看一下他们的区别
urllib和urllib2
urllib 和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。
这意味着,你不可以伪装你的User Agent字符串等。
urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
目前的大部分http请求都是通过urllib2来访问的
httplib
httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在更高层的封装模块中(urllib,urllib2)使用了它的http实现。
urllib简单用法
urllib.urlopen(url[, data[, proxies]]) :
[python] view plain copy
google = urllib.urlopen('')
print 'http header:/n', google.info()
print 'http status:', google.getcode()
print 'url:', google.geturl()
for line in google: # 就像在操作本地文件
print line,
google.close()
详细使用方法见
urllib学习
urllib2简单用法
最简单的形式
import urllib2
response=urllib2.urlopen(')
html=response.read()
实际步骤:
1、urllib2.Request()的功能是构造一个请求信息,返回的req就是一个构造好的请求
2、urllib2.urlopen()的功能是发送刚刚构造好的请求req,并返回一个文件类的对象response,包括了所有的返回信息。
3、通过response.read()可以读取到response里面的html,通过response.info()可以读到一些额外的信息。
如下:
#!/usr/bin/env python
import urllib2
req = urllib2.Request("")
response = urllib2.urlopen(req)
html = response.read()
print html
有时你会碰到,程序也对,但是服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候你需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。
常见的情形:
import urllib
import urllib2
url = '
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'# 将user_agent写入头信息
values = {'name' : 'who','password':'123456'}
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
values是post数据
GET方法
例如百度:
,这样我们需要将{‘wd’:’xxx’}这个字典进行urlencode
#coding:utf-8
import urllib
import urllib2
url = ''
values = {'wd':'D_in'}
data = urllib.urlencode(values)
print data
url2 = url+'?'+data
response = urllib2.urlopen(url2)
the_page = response.read()
print the_page
POST方法
import urllib
import urllib2
url = ''
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' //将user_agent写入头信息
values = {'name' : 'who','password':'123456'} //post数据
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values) //对post数据进行url编码
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
urllib2带cookie的使用
#coding:utf-8
import urllib2,urllib
import cookielib
url = r''
#创建一个cj的cookie的容器
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#将要POST出去的数据进行编码
data = urllib.urlencode({"email":email,"password":pass})
r = opener.open(url,data)
print cj
httplib简单用法
简单示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import httplib
import urllib
def sendhttp():
data = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
headers = {"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain"}
conn = httplib.HTTPConnection('bugs.python.org')
conn.request('POST', '/', data, headers)
httpres = conn.getresponse()
print httpres.status
print httpres.reason
print httpres.read()
if __name__ == '__main__':
sendhttp()
具体用法见
httplib模块
python 3.x中urllib库和urilib2库合并成了urllib库。其中、
首先你导入模块由
import urllib
import urllib2
变成了
import urllib.request
然后是urllib2中的方法使用变成了如下
urllib2.urlopen()变成了urllib.request.urlopen()
urllib2.Request()变成了urllib.request.Request()
urllib2.URLError 变成了urllib.error.URLError
而当你想使用urllib 带数据的post请求时,
在python2中
urllib.urlencode(data)
而在python3中就变成了
urllib.parse.urlencode(data)
脚本使用举例:
python 2中
import urllib
import urllib2
import json
from config import settings
def url_request(self, action, url, **extra_data): abs_url = "http://%s:%s/%s" % (settings.configs['Server'],
settings.configs["ServerPort"],
url)
if action in ('get', 'GET'):
print(abs_url, extra_data)
try:
req = urllib2.Request(abs_url)
req_data = urllib2.urlopen(req, timeout=settings.configs['RequestTimeout'])
callback = req_data.read()
# print "-->server response:",callback
return callback
except urllib2.URLError as e:
exit("\033[31;1m%s\033[0m" % e)
elif action in ('post', 'POST'):
# print(abs_url,extra_data['params'])
try:
data_encode = urllib.urlencode(extra_data['params'])
req = urllib2.Request(url=abs_url, data=data_encode)
res_data = urllib2.urlopen(req, timeout=settings.configs['RequestTimeout'])
callback = res_data.read()
callback = json.loads(callback)
print("\033[31;1m[%s]:[%s]\033[0m response:\n%s" % (action, abs_url, callback))
return callback
except Exception as e:
print('---exec', e)
exit("\033[31;1m%s\033[0m" % e)
python3.x中
import urllib.request
import json
from config import settings
def url_request(self, action, url, **extra_data):
abs_url = 'http://%s:%s/%s/' % (settings.configs['ServerIp'], settings.configs['ServerPort'], url)
if action in ('get', 'Get'): # get请求
print(action, extra_data)try:
req = urllib.request.Request(abs_url)
req_data = urllib.request.urlopen(req, timeout=settings.configs['RequestTimeout'])
callback = req_data.read()
return callback
except urllib.error.URLError as e:
exit("\033[31;1m%s\033[0m" % e)
elif action in ('post', 'POST'): # post数据到服务器端
try:
data_encode = urllib.parse.urlencode(extra_data['params'])
req = urllib.request.Request(url=abs_url, data=data_encode)
req_data = urllib.request.urlopen(req, timeout=settings.configs['RequestTimeout'])
callback = req_data.read()
callback = json.loads(callback.decode())
return callback
except urllib.request.URLError as e:
print('---exec', e)
exit("\033[31;1m%s\033[0m" % e)
settings配置如下:
configs = {
'HostID': 2,
"Server": "localhost",
"ServerPort": 8000,
"urls": {
'get_configs': ['api/client/config', 'get'], #acquire all the services will be monitored
'service_report': ['api/client/service/report/', 'post'],
},
'RequestTimeout': 30,
'ConfigUpdateInterval': 300, # 5 mins as default
}

阅读更多 >>>  微信小程序开发api,微信小程序开发有什么办法说简化流程了嘛?

python3.4中urllib 有没有urlencode函数

python3.x中urlencode在urllib.parse模块中
使用方式urllib.parse.urlencode
urllib.parse.urlencode(query,
doseq=False, safe='', encoding=None,
errors=None, quote_via=quote_plus)
Convert a mapping object or a sequence of two-element tuples, which may
contain str
or bytes objects, to a “percent-encoded” string. If the
resultant string is to be used as a data for POST operation with urlopen() function, then it should be properly
encoded to bytes, otherwise it would result in a TypeError.
The resulting string is a series of key=value pairs separated by '&' characters, where
both key and value are quoted using the quote_via
function. By default, quote_plus() is used to quote the values, which
means spaces are quoted as a '+' character and ‘/’ characters are encoded as %2F, which follows the
standard for GET requests (application/x-www-form-urlencoded). An alternate
function that can be passed as quote_via is quote(), which will encode spaces as %20 and not encode ‘/’
characters. For maximum control of what is quoted, use quote and specify a value
for safe.
When a sequence of two-element tuples is used as the query argument,
the first element of each tuple is a key and the second is a value. The value
element in itself can be a sequence and in that case, if the optional parameter
doseq is evaluates to True, individual key=value pairs separated
by '&' are
generated for each element of the value sequence for the key. The order of
parameters in the encoded string will match the order of parameter tuples in the
sequence.
The safe, encoding, and errors parameters are
passed down to quote_via (the encoding and errors
parameters are only passed when a query element is a str).
To reverse this encoding process, parse_qs() and parse_qsl() are provided in this module to parse
query strings into Python data structures.
Refer to urllib examples to
find out how urlencode method can be used for generating query string for a URL
or data for POST.
Changed in version 3.2: Query parameter
supports bytes and string objects.
有,python 3.x中urllib和urilib2合并成了urllib。
其中urllib2.urlopen()变成了urllib.request.urlopen()
urllib2.Request()变成了urllib.request.Request()
Python是一种面向对象、直译式计算机程序设计语言,由荷兰人Guido van Rossum发明于1989年,1991年发行第一个公开发行版。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块轻松地联结在一起。
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL协议。语法简洁清晰,特色之一是强制用空白符作为语句缩进。
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。Python已经成为最受欢迎的程序设计语言之一。
由于Python语言的简洁、易读以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python教授程序设计课程。例如麻省理工学院的计算机科学及编程导论课程就使用Python语言讲授。
众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。

阅读更多 >>>  简述jsp的内置对象及方法,jsp有哪些内置对象 作用分别是什么

urllib3可以解析html文档吗

不可以。根据查询相关公开信息显示,urllib3是Python中一个非常流行的HTTP客户端库,它主要用于发送HTTP请求和处理HTTP响应,并不具备HTML文档的解析功能。

网站数据信息

"urllib,基本库的使用——urllib.urlopen"浏览人数已经达到18次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:urllib,基本库的使用——urllib.urlopen的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!