0.实验目的概述
本实验包含三个实验任务,分为三篇写完:
- 洞察目的网页以编写Python代码
- 利用云服务器运行爬虫抓取图片
- 将图片存储到OBS对象存储桶中
通过完成本实验:
- 了解Python编程基础及爬虫原理
- 掌握华为云ECS云主机的获取和使用
- 掌握华为云OBS对象存储的管理和使用
1.洞察目的网页,获取目的URL
首先使用浏览器访问百度图片(https://images.baidu.com),搜索华为手机高清壁纸
:
然后按F12查看当前页面源代码,并且开启鼠标跟随按钮:
选择想要爬取的图片,在源代码中复制图片链接:(https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=702581300,3850240955&fm=26&gp=0.jpg)
在页面按Ctrl+U查看网页源代码,然后按Ctrl+F进入搜索模式,粘贴刚才复制的地址进行搜索,搜索后有四个url:
- thumbURL:缩小版
- middleURL:缩小版
- hoverURL:鼠标移过时的版本
- objURL:高清原版;
所以选择使用objURL
,将该地址记录。
2.编写爬虫代码
2.1.安装需要的包
- HTTP库:
requests
pip3 install requests
- 正则表达式库
regex
:自带,不用安装。
2.2.编写代码
- 导入库
#-*- coding:utf-8 -*-
import requests # HTTP请求库
import re # 正则表达式库
- 从浏览器复制目的网页的url
url = 'https://images.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8D%8E%E4%B8%BA%E6%89%8B%E6%9C%BA%E9%AB%98%E6%B8%85%E5%A3%81%E7%BA%B8&oq=%E5%8D%8E%E4%B8%BA%E6%89%8B%E6%9C%BA%E9%AB%98%E6%B8%85%E5%A3%81%E7%BA%B8&rsp=-1'
- 访问网页,爬取整个网页的数据
html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
- 循环抓取并处理异常
i = 1
for each in pic_url:
print each
try:
pic = requests.get(each,timeout=10) # 10s延时控制
except requests.exceptions.ConnectionError:
print('【错误】当前图片无法下载')
continue
- 保存抓取到的图片,先创建一个images目录,把图片都放进去,命名的时候以数字命名:
dir = './images/'+keyword+'_'+str(i)+'.jpg'
fp = open(dir,'wb')
fp.write(pic.content)
fp.close()
i += 1
完整的Python爬虫代码如下:
#-*- coding:utf-8 -*-
import requests # HTTP请求库
import re # 正则表达式库
# 爬取图片函数
def downloadPic(html, keyword):
# 使用正则表达式处理数据,匹配到该网页中所有图片的objURL
pic_url = re.findall('"objURL":"(.*?)"', html, re.S)
# 循环爬取所有图片
i = 1
print('找到关键字:' + keyword + '的图片,现在开始下载图片...')
for each in pic_url:
print('正在下载第' + str(i) + '张图片,图片地址:' + str(each))
try:
pic = requests.get(each, timeout = 10)
except requests.exceptions.ConnectionError:
print('【错误】当前图片无法下载')
continue
# 爬取图片数据并保存
dir = './images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
if __name__ == "__main__":
# 提示用户输入图片搜索关键字
word = input("Input Key Word:")
# 构造搜索url
url = 'https://images.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' \
+ word \
+ '&ct=201326592&v=flip'
# 获取整个搜索数据
result = requests.get(url)
# 下载图片并保存到本地
downloadPic(result.text, word)
运行结果: