urllib是Python自带的标准库,无需安装,可以直接使用。它可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。如果想系统性的学习urllib库,可以直接看它的官方文档(https://docs.python.org/3/library/urllib.html)。
在Python3的urllib库中,所有的网络请求相关的方法,都被采集到urllib.request模块中。
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
from urllib import request
resp = request.urlopen('https://www.baidu.com/')
print(resp.read())
解释:
urlopen(url, data)
1、参数:url(请求的url,即字符串网址),data(如果设置了这个值,那么将变成post请求)。
2、返回值:返回一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象,有read(size)、readline、readlines及getcode等方法。
将网页上的一个文件保存到本地。
from urllib import request
request.urlretrieve('https://www.baidu.com/', r'F:\开发工具\python\project\爬虫\爬虫基本库的使用\baidu.html')
解释:
urlretrieve(url, file)
1、参数:url(请求的url,即字符串网址),file(获取文件的保存路径)。
如果想要在请求的时候添加一个请求头,就必须要使用此类,例如在不添加User-Agent的时候无法爬取百度的HTML文件,如果添加上User-Agent,那么就可以轻而易举的爬取到百度首页的HTML文件:
from urllib import request
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
rq = request.Request(url, headers=headers)
resp = request.urlopen(rq)
print(resp.read())
urlencode()是将字典数据转换为URL编码数据,parse_qs()是将经过编码后的URL数据解码。
from urllib import parse
dic = {
'name':'晴朗', 'age':18, 'sex':'mail'}
qs = parse.urlencode(dic)
print(qs) #name=%E6%99%B4%E6%9C%97&age=18&sex=mail
print(parse.parse_qs(qs)) #{'name': ['晴朗'], 'age': ['18'], 'sex': ['mail']}
两者的作用都是对url进行解析,唯一不一样的地方是urlparse里面有params属性,而urlsplit里面没有这个属性。
from urllib import parse
url = 'https://www.baidu.com/index.html;user?id=S#comment'
res1 = parse.urlsplit(url)
res2 = parse.urlparse(url)
print(res1)
# SplitResult(scheme='https', netloc='www.baidu.com', path='/index.html;user', query='id=S', fragment='comment')
print(res2)
# ParseResult(scheme='https', netloc='www.baidu.com', path='/index.html', params='user', query='id=S', fragment='comment')
from urllib import request
url = 'http://piaofang.maoyan.com/dashboard-ajax?orderType=0&uuid=176f1e319d5c8-036c002cd3facb-c791039-144000-176f1e319d5c8&riskLevel=71&optimusCode=10&_token=eJxtkltv00AQhf%2FLPvRpcPZ%2BsWShSBFtTKOqJi0gVKH1JY6Vi4vtkALivzNeh%2FLCvszns2dHZ3f8i3TLksQUyPeqIzFhEY00ATL0JGaaUWGUs84JDaT4p2ljDFcKSN49Lkj8hSk0GM6fRiVDYVKslk9wQY7IJYyF5Eu0kO0wPMez2XPj240%2F1tHBtz%2F8MSraw6z0%2FTZvfVdiktHWo%2B98Pke5b8pTcOyb4%2B7tqdsnH7PP%2FdfmTba6WfTb24ebLP25pn23ShWr07v3d0q8nHK1SPNPxbvb%2FYdi4Pe7Jqt9fv24o23lrs5lclV9a8qkrKRzvtQUV%2BXNhk6Lq82m0EIIgskP6zG5tgyUpRhOW%2FpKrxpeU0j7H3KBLAjFRhIcKWhCgdBqJElBGBEINctHUuhzoYuyIFkgzUHKsKtRM%2BPIcCigWCCrQKnQz3FMNZEENXVxDnToYqgEHVIZakGHLIZR0CHLRDrsugtpqnDO4ZZUgJmyUIo0nsD%2BSDKQDoRPthufDKu%2F1OHv9wp%2FN7T2TX1EqtKX9UO9nM%2Bv63l2nyTk9x%2BEsqF0'
headers = {
'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
rq = request.Request(url, headers=headers)
resp = request.urlopen(rq)
print(resp.read().decode('utf-8'))
分析:原始网页的url是http://www.biedoul.com/,点击14380页的url变成了:http://www.biedoul.com/index/14380/,所以规律显而易见,我们利用字符串拼接的方式可以实现动态的URL。
from urllib import request
start_url = 'http://www.biedoul.com/index/'
path1 = r'F:\开发工具\python\project\爬虫\爬虫基本库的使用\前五页'
path2 = r'F:\开发工具\python\project\爬虫\爬虫基本库的使用\后五页'
page1 = 14380
page2 = 14382
# 获取前五页
for i in range(5):
url = start_url + str(page1) +'/'
path = path1 + '\\' + str(page1) + '.html'
request.urlretrieve(url, path)
page1 -= 1
# 获取后五页
for i in range(5):
url = start_url + str(page2) +'/'
path = path2 + '\\' + str(page2) + '.html'
request.urlretrieve(url, path)
page2 += 1