课前说明:本章节请求的 url 部分用 ** 代替
本章节需要掌握的知识点:
request.urlretrieve() # urlretrieve函数是用来下载资源的函数,第一个参数是请求的 url,第二个参数是要保存的文件名
爬虫分三个模块:
1、请求模块:用于构造请求体,并将请求到的网页(数据)返回给解析模块;
2、解析模块:用于提取数据(本章节用正则提取网页中的数据),并返回数据给存储模块
3、存储模块:用于存储数据
案例简介:
用于抓取网页 https://www.qiushibai**.com/pic/page/ 中的图片,根据用户需求,抓取网页中的图片并下载到本地。
from urllib import request
import re
from time import sleep
# 【请求模块】
def handle_request(url, page):
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
}
page_url = url + str(page)
return request.Request(headers=headers, url=page_url)
def request_data(url, start, end):
'''
返回请求到的页面
:param url: 请求URL
:param start: 请求开始页
:param end: 请求结束页
:return:
'''
for page in range(start, end + 1):
req = handle_request(url, page)
res = request.urlopen(req)
sleep(2)
yield res.read().decode('utf-8')
# 【解析模块】
def analysis_html(html_list):
'''
解析网页
:param html_list: 请求到的网页列表
:return: 返回图片的url列表
'''
for html in html_list:
# 用正则从HTML 字符串中匹配出所有的糗事图的url
pat = re.compile(r'<div class="thumb".+?<img src="(.*?)"', re.S)
res = pat.findall(html, re.S)
# 遍历
for url in res:
yield 'http:' + url
# 【存储模块】
def save(data):
for url in data:
# 保存在 qiu 文件中
name = './qiu/' + url.split('/')[-1]
# 下载图片
request.urlretrieve(url=url, filename=name)
sleep(1)
print('正在下载:', url)
def main():
url = 'https://www.qiushibai**.com/pic/page/'
start = int(input('请输入起始页:'))
end = int(input('请输入终止页:'))
# 请求
html_list = request_data(url, start, end)
# 解析
data = analysis_html(html_list)
# 存储
save(data)
if __name__ == '__main__':
main()
温馨提示:好了,本案例就到此结束,记得动手敲一敲哦n(*≧▽≦*)n!不记得正则的同学可以复习一下 1.7 认识网页解析工具哦