本节内容类似于学习笔记类型,具体使用与介绍,请参考相关具体文献或博文
目录
简单介绍
urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
注意:urllib是Python自带的标准库,无需安装,直接可以用。
urllib中函数的使用
在Python3的urllib库中,所有和网络请求相关的方法,都被集中到 urllib.request模块下面了。
urlopen函数
先来看下urlopen函数基本的使用
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())
运行结果:
b'<!DOCTYPE html><!--STATUS OK-->\n\n\n <html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#ffffff"><meta name="description" content="\xe5\x85\xa8\xe7\x90\x83\xe9\xa2\x86\xe5\x85\x88\xe7\x9a\x84\xe4\xb8\xad\xe6\x96\x87\xe6\x90\x9c\xe7\xb4\xa2\xe5\xbc\x95\xe6\x93\x8e\xe3\x80\x81\xe8\x87\xb4\xe5\x8a\x9b\xe4\xba\x8e\xe8\xae\xa9\xe7\xbd\x91\xe6\xb0\x91\xe6\x9b\xb4\xe4\xbe\xbf\xe6\x8d\xb7\xe5\x9c\xb0\xe8\x8e\xb7\xe5\x8f\x96\xe4\xbf\xa1\xe6\x81\xaf\xef\xbc\x8c\xe6\x89\xbe\xe5\x88\xb0\xe6\x89\x80\xe6\xb1\x82\xe3\x80\x82\xe7\x99\xbe\xe5\xba\xa6\xe8\xb6\x85\xe8\xbf\x87\xe5\x8d\x83\xe4\xba\xbf\xe7\x9a\x84\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\xe9\xa1\xb5\xe6\x95\xb0\xe6\x8d\xae\xe5\xba\x93\xef\xbc\x8c\xe5\x8f\xaf\xe4\xbb\xa5\xe7\x9e\xac\xe9\x97\xb4\xe6\x89\xbe\xe5\x88\xb0\xe7\x9b\xb8\xe5\x85\xb3\xe7\x9a\x84\xe6\x90\x9c\xe7\xb4\xa2\xe7\xbb\x93\xe6\x9e\x9c\xe3\x80\x82"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="\xe7\x99\xbe\xe5\xba\xa6\xe6\x90\x9c\xe7\xb4\xa2" /><link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg"><link rel="dns-prefetch" href="//dss0.bdstatic.com"/><link rel="dns-prefetch" href="//dss1.bdstatic.com"/><link rel="dns-prefetch" href="//ss1.bdstatic.com"/><link rel="dns-prefetch" href="//sp0.baidu.com"/><link rel="dns-prefetch" href="//sp1.baidu.com"/><link rel="dns-prefetch" href="//sp2.baidu.com"/><title>\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\x81\x93</title><style index="newi" type="text/css">#form .bdsug{top:39px}.bdsug{display:none;position:absolute;width:535px;background:#fff;border:1px solid #ccc!important;_overflow:hidden;box-shadow:1px 1px 3px #ededed;-webkit-box-shadow:1px 1px 3px #ededed;-moz-box-shadow:1px 1px 3px #ededed;-o-box-shadow:1px 1px 3px #ededed}.bdsug li{width:519px;color:#000;font:14px arial;line-height:25px;padding:0 8px;position:relative;cursor:default}.bdsug li.bdsug-s{background:#f0f0f0}.bdsug-store span,.bdsug-store b{color:#7A77C8}.bdsug-store-del{font-size:12px;color:#666;text-decoration:underline;position:absolute;right:8px;top:0;cursor:pointer;display:none}.bdsug-s .bdsug-store-del{display:inline-block}.bdsug-ala{display:inline-block;border-bottom:1px solid #e6e6e6}.bdsug-ala h3{line-
# 篇幅有限省略后面内容
# 注:所爬取到的网页可能经过反爬处理
详细讲解
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
url:
请求的url。
data:
请求的data,如果设置了这个值,那么将变成post请求。
返回值:
返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。
def urlopen(url,data=None,timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*,cafile=None,capath=None,codefault=False,context=None):
'''Open the UPL upl, which can be either a string or a Request object.
*data* must be an object specifying additional data to be sent to
the server, or None if no such data is needed. See Pequest for
details.
'''
#以上是关于urlopen函数的有关参数和大致介绍。
urlretrieve函数
这个函数可以方便的将网页上的一个文件保存到本地
以下代码可以非常方便的将百度的首页下载到本地:
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')
运行完后会在运行的目录下创建一个“baidu.html"
urlencode函数
urlencode可以把字典数据转换为URL编码的数据,也就是常说的编码。
示例代码如下:
from urllib import parse
data = {'name':'爬虫基础','greet':'hello world','age':100}
qs = parse.urlencode(data)
print(qs)
运行结果:
name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100
parse_qs函数
可以将经过编码后的url参数进行解码。
示例代码如下:
from urllib import parse
qs="name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
print(parse.parse_qs(qs))
运行结果:
{'name': ['爬虫基础'], 'greet': ['hello world'], 'age': ['100']}
解码与编码的具体使用
#--coding:utf-8--
from urllib import parse
data = {'name': '小明', 'age': 18, 'greet': 'hello world'}
qs = parse.urlencode(data)
print(qs)
print(parse.parse_qs(qs))
#例子:
from urllib import request
data1 = {'wd': 'csdn'}
qs1 = parse.urlencode(data1)
print(qs1)
url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&' + qs
resp = request.urlopen(url)
# print(resp.read())
# 补充
a = "赵"
b = parse.quote(a)
print(b)
运行结果:
name=%E5%B0%8F%E6%98%8E&age=18&greet=hello+world
{'name': ['小明'], 'age': ['18'], 'greet': ['hello world']}
wd=csdn
%E8%B5%B5
url解析
简单介绍有关解析的函数
urlparse与urlsplit
有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse或者是urlsplit来进行分割。
————重点————
urlparse和urlsplit基本上是一模一样的。
唯一不一样的地方是:
urlparse里有params属性,而urlsplit没有这个params属性。
示例代码如下:
#--coding:utf-8--
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=S#comment'
result = parse.urlparse(url)
# result = parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.path)
print(result.params)
运行结果:
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=S', fragment='comment')
http
www.baidu.com
/index.html
user
request.Request类
如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。
比如:要增加一个User-Agent
示例代码如下:
#--coding:utf-8--
from urllib import request
header = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
rq = request.Request('https://www.baidu.com/', headers=header)
resp = request.urlopen(rq)
print(resp.read())
ProxyHandler处理器(代理设置)
很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等)
如果访问次数多的不像正常人,它会禁止这个IP的访问。
当我们本地的IP被禁用后,就无法用自己的主机直接访问网站,这就需要用到代理IP去访问,相当于是借他人去获取我们想要的东西。
http://httpbin.org —— 该网站可以查看http请求的一些参数。
常见的代理有:
from urllib import request
# 没有使用代理
# url = 'http://httpbin.org/ip'
# resp = request.urlopen(url)
# print(resp.read())
# 使用代理
# 步骤
url = 'http://httpbin.org/ip'
#1. 使用ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({'http': '47.111.176.17:88'}) #此处的ip为示范ip可能已经失效可以重新查找
#2. 使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
#3. 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())
# 免费的ip不是很稳定,也很慢,运行该程序时需要等待一会
关于cookie
什么是cookie
指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据
cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。
因此使用cookie只能存储一些小量的数据。
cookie的格式
Set-Cookie: NAME=VALUE;Expires/Max-age=DATE;Path=PATH;
Domain=DOMAIN_NAME;SECURE
参数意义:
NAME:cookie的名字。
VALUE:cookie的值。
Expires:cookie的过期时间。
Path:cookie作用的路径。
Domain:cookie作用的域名。
SECURE:是否只在https协议下起作用。
http.cookiejar模块
该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
这四个类的作用分别如下:
CookieJar:
管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
FileCookieJar (filename,delayload=None,policy=None):
从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中,filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
MozillaCookieJar (filename,delayload=None,policy=None):
从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
LWPCookieJar (filename,delayload=None,policy=None):
从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
cookie实战——模拟登录
直接添加cookie
#--coding:utf-8--
from urllib import request
url = 'https://www.zhihu.com/hot'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'cookie':
'_zap=59cde9c3-c5c0-4baa-b756-fa16b5e72b10; d_c0="APDi1NJcuQ6PTvP9qa1EKY6nlhVHc_zYWGM=|1545737641"; __gads=ID=237616e597ec37ad:T=1546339385:S=ALNI_Mbo2JturZesh38v7GzEeKjlADtQ5Q; _xsrf=pOd30ApWQ2jihUIfq94gn2UXxc0zEeay; q_c1=1767e338c3ab416692e624763646fc07|1554209209000|1545743740000; tst=h; __utma=51854390.247721793.1554359436.1554359436.1554359436.1; __utmb=51854390.0.10.1554359436; __utmc=51854390; __utmz=51854390.1554359436.1.1.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/hot; __utmv=51854390.100-1|2=registration_date=20180515=1^3=entry_date=20180515=1; tgw_l7_route=537a925d07d06cecbf34cd06a153f671; capsion_ticket="2|1:0|10:1554360474|14:capsion_ticket|44:NDM3YzM4ZjY3MjRkNDJhZGE2ZTFlNDgyYjYzYzhkNWM=|4f72c1edb70a779711a93844e747deb0d7efb6febfd6254d11b3a27844c50a00"; z_c0="2|1:0|10:1554360480|4:z_c0|92:Mi4xOWpCeUNRQUFBQUFBOE9MVTBseTVEaVlBQUFCZ0FsVk5vUGFTWFFCRXZ2bkkzTTNRZk9IVU1NOXFMYXdGNFMwTVB3|769f186a095046f171488c3ba61242ff27bcdef068c2d4cafc6046ff008e1a1a"'
}
rq = request.Request(url, headers=headers)
resp = request.urlopen(rq)
print(resp.read().decode('utf-8'))
发送post请求
#--coding:utf-8--
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar
# 登录: https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F
#个人网页:https://i.meishi.cc/cook.php?id=13686422
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
#1.登录
#1.1 创建cookiejar对象
cookiejar = CookieJar()
#1.2 使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
#1.3 使用上一步的创建的handler创建一个opener
opener = request.build_opener(handler)
#1.4 使用opener发送登录请求 (账号和密码)
post_url = 'https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F'
post_data = parse.urlencode({
'username': 'XXX', # 填入自己的账号和密码信息
#'password': 'XXX'
})
req = request.Request(post_url, data=post_data.encode('utf-8'))
opener.open(req)
#2.访问个人网页
url = 'https://i.meishi.cc/cook.php?id=13686422'
rq = request.Request(url, headers=headers)
resp = opener.open(rq)
print(resp.read().decode('utf-8'))
cookie加载与保存
#--coding:utf-8--
from urllib import request
from http.cookiejar import MozillaCookieJar
#保存
# cookiejar = MozillaCookieJar('cookie.txt')
# handler = request.HTTPCookieProcessor(cookiejar)
# opener = request.build_opener(handler)
# resp = opener.open('http://www.httpbin.org/cookies/set/course/abc')
#
# cookiejar.save(ignore_discard=True,ignore_expires=True)
#加载
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.httpbin.org/cookies/set/course/abc')
for cookie in cookiejar:
print(cookie)
cookie.txt文件内部内容:
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.
www.httpbin.org FALSE / FALSE course abc