Python爬虫学习笔记——urllib库

urllib库

urllib库是Python中一个最基本的网络请求库。它可以模拟浏览器行为,向指定服务器发送一个请求,并且可以保存服务器返回的数据。

一.urlopen函数

urlopen函数的参数:

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

获得请求:

from urllib import request

resp = request.urlopen('http://www.baidu.com')

print(resp.read())

返回值:
read(size): 调用read()会一次性读取文件的全部内容。

readline(): 从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。

realines(): 调用readlines()可一次读取所有内容并按行返回list。

getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。

geturl():返回请求的url地址。

二.urlretrieve函数

这个函数可以方便的将网页上一个文件保存到本地。

urlretrieve(url, filename=None, reporthook=None, data=None)

urlretrieve函数的参数:

url:下载链接地址

filename:指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)

reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。

data:指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,filename 表示保存到本地的路径,header表示服务器的响应头。

下载百度页面:

from urllib import request

request.urlretrieve('http://www.baidu.com/','baidu.html')

三.urlencode函数

urlencode函数可将字符串以URL编码,用于编码处理。
用浏览器发送请求的时候,如果url中包含中文或其他特殊字符,那么浏览器会给我们进行编码,如果使用代码发送请求,就必须手动进行编码,这时候就需要使用urlencode函数来实现。

接受参数形式为:

[(key1, value1), (key2, value2),...] 和 {'key1': 'value1', 'key2': 'value2',...} 

返回的是形如key2=value2&key1=value1字符串。

from urllib import parse

params = ({'name':'张三','age':18,'sex':'男'})

result = parse.urlencode(params);

print(result)

运行结果:
在这里插入图片描述

四.parse_qs函数

可以将经过编码的后url参数进行解码。

from urllib import parse

result = "name=%E5%BC%A0%E4%B8%89"

qs = parse.parse_qs(result)

print(qs)

运行结果:
在这里插入图片描述

五.urlparse和urlsplit函数

urlparse函数和urlsplit函数可以对url中各个组成部分进行分割。

urlparse函数的参数:
result.scheme : 网络协议
result.netloc: 服务器位置(也有可能是用户信息)
result.path: 网页文件在服务器中的位置
result.params: 可选参数
result.query: &连接键值对
result.fragment:在散列符号 # 之后

urlparse函数和urlsplit函数非常相像,用法基本一致,但是他们有略微的不同,urlsplit函数在分割的时候,path和params属性是在一起的:

from urllib import parse

url='https://www.baidu.com/s;hello?wd=Python&rsv_spt=1'

result = parse.urlsplit(url)

print(result)

运行结果:
在这里插入图片描述
urlparse函数在分割的时候,path和params属性是分开的:

from urllib import parse

url='https://www.baidu.com/s;hello?wd=Python&rsv_spt=1'

result = parse.urlparse(url)

print(result)

运行结果:
在这里插入图片描述

六.request.Requset类

request.Requset类可以在请求的时候增加一些请求头,可以将url先构造成一个Request对象,传进urlopen。

from urllib import request,parse

url ='http://sports.sohu.com/'

headers ={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    'Referer':'http://news.sohu.com/'
}


req = request.Request(url,headers=headers)

resp = request.urlopen(req)

print(resp.read().decode('utf-8'))

运行结果:
在这里插入图片描述

七.ProxyHandler处理器(代理)

urllib中通过ProxyHandler设置代理服务器。
在请求目的网站之前,先请求代理服务器,再使用代理服务器去请求目的网站。

from urllib import request
#查询本机ip
url = 'http://httpbin.org/ip'
#使用ProxyHandler,传入代理ip及其端口
handler = request.ProxyHandler({"http":"202.120.38.131:80"})

opener = request.build_opener(handler)

response = opener.open(url)

print(response.read())

运行结果:
在这里插入图片描述

八.cookie

cookie的格式:

Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

各参数的意义:
NAME: cookie的名字
VALUE: cookie的值
Expires: cookie的过期时间
Path: cookie作用的路径
Domain: cookie作用的域名
SECURE: 是否只在http协议下起作用

cookie的应用:
使用cookie登录百度账号首页

# 获取一个有登录信息的Cookie模拟登陆

from urllib import request

# 1. 构建一个已经登录过的用户的headers信息

    headers = {
        "Host": "passport.baidu.com",
        "Connection": "keep-alive",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Referer": "http://i.baidu.com/",
        # 便于终端阅读,表示不支持压缩文件
        # Accept-Encoding: gzip, deflate, sdch,
    
        # 这个Cookie是保存了密码无需重复登录的用户的Cookie,这个Cookie里记录了用户名,密码
        "Cookie": "BIDUPSID=076CD0280FA5172FF585705A1375DCEE; PSTM=1540297445; HOSUPPORT=1; UBI=fi_PncwhpxZ%7ETaKAQfuToQwDWK78AiPegZzipVzrijnq4eWYDadLkbPBYHYnUSr5p-ScDHkG6qcLhF2n2to; USERNAMETYPE=3; SAVEUSERID=eaf1ed31bd228a3d0a69a285fbdd45; HISTORY=3f29f9a905dd43e394dc47b315dfe1bcd71c4e; BAIDUID=8942D0CFF38660AB72848C276E914ACC:FG=1; STOKEN=935f65898409f2bd8760404b4752eabc53cac1d845c8535cebdbe0d41240d74a; BDUSS=ZlU3NTMHBFakNhdlpLTjlhVGRNQm1TbkVEQzV4am80V2dtdW5NUS0yRVM2a1pkSVFBQUFBJCQAAAAAAAAAAAEAAAAC4qlNt728qtChub25vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJdH10SXR9dN1; PTOKEN=04a03bb8f52b74fa9118a8b12d021f4c; H_PS_PSSID=1433_21104_29237_28519_29099_28834_29220; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; PSINO=5; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1562656661; Hm_lpvt_90056b3f84f90da57dc0f40150f005d5=1562656661"
    }
    
    # 2. 通过headers里的报头信息(主要是Cookie信息),构建Request对象
    req = request.Request("https://passport.baidu.com/center?_t=1562656659", headers=headers)
    
    # 3. 直接访问百度账号主页,服务器会根据headers报头信息(主要是Cookie信息),判断这是一个已经登录的用户,并返回相应的页面
    response = request.urlopen(req)
    
    # 4. 打印响应内容
    print(response.read().decode('utf-8'))

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值