python urllib模块

转载 2015年11月18日 22:36:46

urllib提供了一系列用于操作URL的功能。

Get

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:方法是用urlopen函数,它的参数是url字符串或者是Request对象,他返回一个HTTPResponse对象
例如,对豆瓣的一个URLhttps://api.douban.com/v2/book/2129650进行抓取,并返回响应:

from urllib import request

url='https://api.douban.com/v2/book/2129650'
#urlopen的参数是url字符串或者是Request对象,返回值为HTTPResponse
with request.urlopen(url) as f:
    data=f.read()
    print('Statue: ',f.status,f.reason)
    for k,v in f.getheaders():
        print('%s: %s' % (k,v))
    print('Data: ',data.decode('utf-8'))

下面是HTTPResponse对象:
An HTTPResponse instance wraps the HTTP response from the server. It provides access to the request headers and the entity body. The response is an iterable object and can be used in a with statement.

HTTPResponse.read([amt])

Reads and returns the response body, or up to the next amt bytes.

HTTPResponse.readinto(b)

Reads up to the next len(b) bytes of the response body into the buffer b. Returns the number of bytes read.

New in version 3.3.

HTTPResponse.getheader(name, default=None)

Return the value of the header name, or default if there is no header matching name. If there is more than one header with the name name, return all of the values joined by ‘, ‘. If ‘default’ is any iterable other than a single string, its elements are similarly returned joined by commas.

HTTPResponse.getheaders()

Return a list of (header, value) tuples.

HTTPResponse.fileno()

Return the fileno of the underlying socket.

HTTPResponse.msg

A http.client.HTTPMessage instance containing the response headers. http.client.HTTPMessage is a subclass of email.message.Message.

HTTPResponse.version

HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1.

HTTPResponse.status

Status code returned by server.

HTTPResponse.reason

Reason phrase returned by server.

HTTPResponse.debuglevel

A debugging hook. If debuglevel is greater than zero, messages will be printed to stdout as the response is read and parsed.

HTTPResponse.closed

Is True if the stream is closed.

如果我们要想模拟浏览器发送GET请求,就需要使用Request对象,通过往Request对象添加HTTP头,我们就可以把请求伪装成浏览器。例如,模拟火狐去请求Python首页:

关于Request

其中User-agent是表示浏览器

Request对象都有什么属性和方法

from urllib import request

url='https://www.python.org/'
req=request.Request(url)
req.add_header('User_agent','Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11')
with request.urlopen(req) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

Get模拟微博登录:

from urllib import request,parse

print('Login to weibo.cn...')

url='https://passport.weibo.cn/sso/login?username=xxxxxx&password=xxxxxx'
print(url)

req=request.Request(url)
req.add_header('Origin', 'https://passport.weibo.cn')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')

with request.urlopen(req) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

Post

如果要以POST发送一个请求,只需要把参数data以bytes形式传入。

我们模拟一个微博登录,先读取登录的邮箱和口令,然后按照weibo.cn的登录页的格式以username=xxx&password=xxx的编码传入:

from urllib import request,parse

print('Login to weibo.cn...')
url='https://passport.weibo.cn/sso/login'
email=input('Email: ')
password=input('Password: ')
login_data=parse.urlencode([
    ('username',email),
    ('password',password),
    ('entry','mweibo'),
    ('client_id',''),
    ('savestate','1'),
    ('ec',''),
    ('pagerefer', 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')
])
req=request.Request(url)
req.add_header('Origin', 'https://passport.weibo.cn')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')

with request.urlopen(req,data=login_data.encode('utf-8')) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

浅析HTTP协议
HTTP 请求方式: GET和POST的比较
http(百度百科)
HTTP协议详解

python中的urllib模块中的方法

python urllib.request之urlopen函数 urllib是基于http的高层库,它有以下三个主要功能: (1)request处理客户端的请求 ...
  • chengxuyuanyonghu
  • chengxuyuanyonghu
  • 2017年03月29日 17:05
  • 1257

Python3学习笔记(urllib模块的使用)

1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=Fal...
  • whatday
  • whatday
  • 2017年04月27日 16:58
  • 769

Python3学习笔记 urllib模块的使用

1.基本方法 url: 需要打开的网址 data:Post提交的数据 timeout:设置网站的访问超时时间 直接用urllib.request模块的urlopen()获取页面,page的数据格式...
  • qq_38165374
  • qq_38165374
  • 2017年07月04日 13:28
  • 1152

Python中urllib模块的使用

urllib模块中的方法urllib.urlopen(url[, data[, proxies]])创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表...
  • u013007900
  • u013007900
  • 2016年12月23日 11:56
  • 566

Python3模块详解--老司机工具urllib模块详解

随着Python3的逐渐广泛应用,urllib这个常用的模块自然而然进入了大家的视野,下面主要对Python3.6.0中的urllib模块进行详解,希望能帮到大家 Python3.6.0中urllib...
  • zly412934578
  • zly412934578
  • 2017年09月01日 15:02
  • 181

pythonの鉴黄之路(四)——urllib模块批量下载

好了,现在鉴黄的demo可以跑通了,就差大量的数据了(就是黄图) 这可难倒了纯洁的宝宝。 本宝宝表示找了好几天都找不到一张黄图 后来问了一些老司机,得到了一些资♂源♂丰♂富♂的网址 不过本宝宝...
  • sm9sun
  • sm9sun
  • 2016年11月24日 17:03
  • 889

python中的six.moves模块的下载函数urlretrieve

实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urlli...
  • sinat_21585785
  • sinat_21585785
  • 2017年07月03日 10:41
  • 2179

python模块学习 --- urllib

urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据。每当使用这个模块的时候,老是会想起公司产品的客户端,同事用C++下载Web上的图片,那种“痛苦”的表情。我以前翻...
  • Dolphin_h
  • Dolphin_h
  • 2014年04月13日 20:50
  • 2186

eclipse里的python环境怎么导入urllib模块

我在eclipse里装了个pydev插件用来写python代码,用的是python2.6环境,想用urllib模块打开一个网页试试,结果提示不可以导入模块,如何在现在环境里导入urllib库那 ...
  • xwnsy86276
  • xwnsy86276
  • 2012年03月08日 23:27
  • 1000

Python3 urllib和第三方模块requests

Python3 把所有的http包大包成为了两个包:http和urllib 1、httpfrom http import server, client, cookiejar, cookieshttp...
  • bing900713
  • bing900713
  • 2017年03月13日 20:46
  • 618
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python urllib模块
举报原因:
原因补充:

(最多只允许输入30个字)