Python爬虫 | urllib简单使用

        本节内容类似于学习笔记类型,具体使用与介绍,请参考相关具体文献或博文

目录

简单介绍

urllib中函数的使用

urlopen函数

urlretrieve函数

urlencode函数

parse_qs函数

解码与编码的具体使用

url解析

urlparse与urlsplit

request.Request类

ProxyHandler处理器(代理设置)

关于cookie

http.cookiejar模块

cookie实战——模拟登录

直接添加cookie

发送post请求

cookie加载与保存


简单介绍

        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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值