urllib库是Python中一个最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
1.urlopen函数
在python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了,以下先来看下urlopen函数基本的使用。
from urllib import request
res=request.urlopen('http://www.baidu.com')
print(res.read())
上面三行代码在爬取百度首页的代码
以下对urlopen函数进行详细讲解
1.url:请求的url
2.data:请求的data,如果设置了这个值,那么将变成post请求
3.返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。
2.urlretrieve函数
这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地。
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')
3.urlencode函数
用浏览器发送请求的时候,如果url中包含了中文或者其它特殊字符,那么浏览器会自动地给我们进行编码。而如果使用代码发送请求,那么就必须手动地进行编码,这时候就应该使用urlencode函数来实现。urlencode可以把字典数据转换为url编码的数据。示例代码如下:
from urllib import parse
params={'name':'张三','age':18,'greet':'hello world'}
result=parse.urlencode(params)
print(result)
结果如下:
4.parse_qs函数
可以将经过编码后的url参数进行解码,示例代码如下:
from urllib import parse
params={'name':'张三','age':18,'greet':'hello world'}
qs=parse.urlencode(params)
print(qs)
result=parse.parse_qs(qs)
print(result)
5.urlparse和urlsplit
有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse或者是urlsplit来进行分割。示例代码如下:
from urllib import parse
url='http://www.baidu.com/s?wd=python&username=abc#a'
result1=parse.urlparse(url)
result2=parse.urlsplit(url)
print(result1)
print(result2)
结果如下:
'urlparse'和'urlsplit'基本上是一模一样的,唯一不一样的是,'urlparse'里面多了一个'params'属性。比如有一个url为'http://www.baidu.com/s;hello?wd=python&username=abc#a',那么'urlparse'可以获取到'hello',而urlsplit不可以。
6.request.Request库
如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现,比如增加一个User-Agent,示例代码如下:
from urllib import request,parse
url='https://www.lagou.com/'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
req=request.Request(url,headers=headers)
resp=request.urlopen(req)
print(resp.read())
当请求方式为post时,就得设置data值,示例如下:
from urllib import request,parse
url='https://www.lagou.com/'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
data={
'first': 'true',
'pn': 1,
'kd': 'python'
}
req=request.Request(url,headers=header,data=data,method="Post")
resp=request.urlopen(req)
print(resp.read())
如果提示请求频繁说明它已经识别出是一只爬虫,在headers继续添加 Referer 等