Python简单实现批量下载无版权图片

时间:2022-07-28
本文章向大家介绍Python简单实现批量下载无版权图片,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

有时候我们有一些获取图片素材的需求,比如写博客或者公众号文章时,需要的插图和封面,当然这些图片必须是没有版权的免费图片,比较常用网站有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)

大功告成:

注意,仅供学习使用,建议不要密集大数量采集,避免服务器压力过大。