有时候我们有一些获取图片素材的需求,比如写博客或者公众号文章时,需要的插图和封面,当然这些图片必须是没有版权的免费图片,比较常用网站有pexels、pixabay等,今天再给大家介绍一个新的网站 :http://alana.io/。
由于是国外的网站,访问速度比较慢,一页一页找,非常费时间,所以想到用Python爬取下载到本地,然后使用关键词进行归类,后期直接预览使用。
首先,我们要了解下爬取数据的基本流程:
发起请求: 通过url向服务器发起request请求。
获取响应内容: 响应的内容网页包含HTML,Json字符串或者二进制的数据(视频、图片)等。
解析内容: 可以通过正则、BeautifulSoup、xpath等解析响应的数据。
保存数据: 可以保存到本地文件,也可以保存到数据库(MySQL,Redis,Mongodb等)
准备工作
通过浏览器访问http://alana.io/,并搜索关键词(例如:computer),在F12中查看请求的URL。
翻到第二页,查看页码的URL规则:
点击Response,查看图片URL的规则,大多数图片是以<img width="548" height="365" src=开头的。
下面,就是批量爬取并下载图片的代码组成。
1.创建下载目录
创建关键词目录,便于后期查找。
def create_dirs(search_words):
# 创建关键词目录
if not os.path.exists('./{}'.format(search_words)):
os.mkdir('./{}'.format(search_words))
2.请求并解析数据
def save_urls(url):
# 请求并解析数据
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/76.0.3809.100 Safari/537.36'}
html = requests.get(url,headers=headers).text # 获取响应的文本信息
urls = re.compile(r'<img width="548" height="365" src="(.*?)"') #正则提取图片的URL列表
res = re.findall(urls, html)
return res
3.保存图片数据到本地
def save_pics(search_words,urls):
# 根据图片的URL地址进行循环下载
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/76.0.3809.100 Safari/537.36'}
for i in urls:
filename = './{}/'.format(search_words)+i.split('/')[-1]
try:
with open(filename,'wb+') as f:
f.write(requests.get(i,headers=headers).content)# 将请求响应的二进制文件写入文件
print("图片下载成功")
except:
print("图片下载失败")
time.sleep(5)
4.主函数(按页循环下载)
if __name__ == '__main__':
search_words=input("下载图片关键词:")
search_page=int(input("下载页数:"))
# 按页循环下载
for page in range(1,search_page+1):
url = 'http://alana.io/page/{}/?s={}&post_type=download'.format(page,search_words)
create_dirs(search_words)
urls = save_urls(url)
save_pics(search_words,urls)
time.sleep(2)
大功告成:
注意,仅供学习使用,建议不要密集大数量采集,避免服务器压力过大。
码。