目录:
一、得到要爬取的url
二、拿到网页源码
三、得到图片链接
四、保存图片
五、拓展
在上一篇文章我们介绍了正则表达式的用法,这次就来实际操作一下正则表达式。
这次要爬取的是百度图片,我们应该有一个大概的思路:得到要爬取的url、拿到网页源码(我们需要的信息链接就在网页源码中)、得到图片链接、保存图片。在做这些工作之前,我们要先导入需要的第三方库requests和re,通过import来导入。
import requests
import re
下面就开始正式的爬取图片。
一、得到要爬取的url
需求:爬取一些桥梁的图片
百度搜索关键字“桥梁”,可以得到url地址如下:
url = 'https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%C7%C5%C1%BA&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111'
可以看到所有图片要通过不断的下滑来呈现,无法进行翻页操作。这是因为它们属于瀑布流的数据,我们可以通过把url地址中的index改成flip,就能实现翻页操作,以便后续的图片爬取。
进行一下刷新,发现url发生了变化,加入了pn=0和ie=utf-8等新元素。这才是真正的url地址。
其中的word=后面的内容是进行了编码的关键字桥梁。具体的操作可以看我之前对关键字编码的讲解:Python爬虫新手入门(一)了解爬虫!
url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E6%A1%A5%E6%A2%81&pn=0&gsm=50&ct=&ic=0&lm=-1&width=0&height=0'
二、拿到网页源码
这一块我们并不陌生,只需进行简单的get请求即可,唯一需要注意的是要带上请求头。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
r = requests.get(url,headers=headers)
ret = r.text
三、得到图片链接
通过网页解析能够发现,我们需要的图片链接应是这样的形式:
"objURL":"http://dingyue.nosdn.127.net/9r1mlJfhmtyPyr4YbaVWZL8zeF09WY0mVHGS7OD6NAyZR1552887931390compressflag.jpeg"
一张图片对应有四个链接:“thumbURL”,“middleURL”,“hoverURL”,“objURL”。我们需要的是实际大小的图片,而前面三个链接均不是实际大小,因此每张图的链接应是以"objURL"开头的。
以第一页图片为例,爬取第一页的图片链接:
# 获取所有类似"objURL"的图片链接
result = re.findall(r'"objURL":"(.*?)"',ret)
四、保存图片
保存图片,以序号.jpg这样的形式保存
如果爬取前10张图片(每页有60张图片):
for i in range(10):
with open('img/{}.jpg'.format(i),'wb') as f:
r = requests.get(result[i-1])
f.write(r.content)
这就是运行后的结果
个别图片可以通过修改后缀名之后打开。
至此,我们想要爬取的桥梁图片就完成了。
五、拓展
前面我们发现第一页url如下:
url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E6%A1%A5%E6%A2%81&pn=0&gsm=50&ct=&ic=0&lm=-1&width=0&height=0'
如果要爬取第二页,url地址变为:
url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E6%A1%A5%E6%A2%81&pn=20&gsm=3c&ct=&ic=0&lm=-1&width=0&height=0'
可以发现页码是满足一定的数量关系,pn =(i-1)*20,i表示第i页。
我们如果想要爬取多页的图片,就可以把初始url设置成可填充项,将可变参数进行格式化传参即可。
我们在平时经常会用到正则表达式,从中筛选想要的数据,这是一个比较快捷的方法。当然,筛选数据还有更多的方法,这也会在我后面的文章中继续介绍。
最近在知乎创建了一个新的Python技术圈子,在里面每天都会分享好玩有趣的Python知识,你如果对Python这门技术感兴趣的可以加入哦!交个朋友Python技术 - 知乎www.zhihu.com