爬虫基础之urllib库
categories:
- 爬虫
tags: - urlopen
- urlretrieve
- urlencode
- parse_qs
- urlparse
urlsplit
urllib库
urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据
urlopen函数
在Python3的urllib库中,所有和网络请求相关的方法,都被集到 urllib.request 模块下面了,先来看下urlopen的基本使用
from urllib import request resp = request.urlopen('http://www.baidu.com') print(resp.read())
实际上,使用浏览器访问百度,右键查看源代码。会发现,和打印出来的数据一样。
urlopen 解释
- url:请求和url
- data:请求的data,如果设置了值,那么将变成post请求
- 返回值:返回一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法
#http.client.HTTPResponse print(resp) <http.client.HTTPResponse object at 0x7f6466e926a0> #read(size) print(resp(100)) b'<html>\n<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n</html>\n' #readline() print(resp.readline()) b'<html>\n' #readlines() print(resp.readlines()) [b'<html>\n', b'<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n', b'</html>\n'] #getcode() print(resp.getcode()) 200
urlretrieve函数
这个函数可以方便地将网页上一个文件保存到本地。以下代码可以非常方便地将百度的首页下载到本地
urlretrieve(下载地址,保存位置)
from urllib import request request.urlretrieve('http://www.baidu.com','/tmp/tmp97mdqput') #返回值 如下 ('/tmp/tmp97mdqput', <http.client.HTTPMessage object at 0x7f6466e23400>)
urlencode函数
用浏览器发送请求时,如果url中包含了中文或其他特殊字符,浏览器会自动编码。如果使用代码发送请求,需手动编码,通过urlencode实现。urlencode可将字典转换为url编码格式的数据
from urllib import parse data = {'name':'爬虫基础','greet':'hello world','age':10} qs = parse.urlencode(data) print(qs) #返回值 name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=10
模拟百度查询刘德华
错误方式
from urllib import request url = 'http://www.baidu.com/s?wd=刘德华' qs = request.urlopen(url) print(qs) #在执行request.urlopen(url)时,返回报错,原因是 ascii 解压器无法对'刘德华'进行编码 UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-9: ordinal not in range(128)
正确方式
from urllib import request,parse url = 'http://www.baidu.com/s?' param = {"wd":"刘德华"} url_param = parse.urlencode(param) full_url = url + url_param print(full_url) qs = request.urlopen(full_url) print(qs.readline()[:100]) #返回值 b'<!DOCTYPE html>\n'
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=10' print(parse.parse_qs(qs)) #返回值 {'name': ['爬虫基础'], 'greet': ['hello world'], 'age': ['10']}
urlparse和urlsplit
有时候拿到一个url,想要对这个url进行分割,可以使用urlparse或者urlsplit
区别是urlsplit函数没有params属性
from urllib import request,parse url = 'http://www.baidu.com/s?username=zhiliao' #对比urlsplit,urlparse函数时,开启关闭注释 result = parse.urlsplit(url) #result = parse.urlparse(url) print(result) #返回值如下 ''' urlsplit SplitResult(scheme='http', netloc='www.baidu.com', path='/s', query='username=zhiliao', fragment='') urlparse ParseResult(scheme='http', netloc='www.baidu.com', path='/s', params='', query='username=zhiliao', fragment='') ''' for i in result: print(i) ''' ********urlsplit************* http www.baidu.com /s username=zhiliao **********urlparse*********** http www.baidu.com /s #此处空行对应params属性值,为'' username=zhiliao '''
相关推荐
sunzhihaofuture 2020-07-19
sunzhihaofuture 2020-06-06
oXiaoChong 2020-06-05
ARCXIANG 2020-06-05
夜斗不是神 2020-11-17
染血白衣 2020-11-16
ARCXIANG 2020-11-02
ARCXIANG 2020-10-28
CycloneKid 2020-10-27
荒谬小孩 2020-10-26
逍遥友 2020-10-26
snakeson 2020-10-09
meylovezn 2020-08-28
囧芝麻 2020-08-17
数据挖掘工人 2020-08-15
cxcxrs 2020-07-28
dashoumeixi 2020-07-20