delphi获取路径下图片数量_如何自动化下载迪丽热巴图片

本文介绍了如何使用Delphi编程实现自动化下载网络图片,包括从静态和动态网页抓取图片,以豆瓣迪丽热巴图片搜索为例,解析XHR请求获取图片链接,并处理异常,最后封装成下载函数。
摘要由CSDN通过智能技术生成

60fba66321335d46be43f6f0b67ee810.png

​下载图片的方法和其他类型的爬虫基本相似,只不过将存储的数据类型改为图片文件。爬取的方法一般有三种。

921b1b35d6eea5399e510364639693eb.png

一种是静态的网页,比如赶集网的租房页面,网址是http://sz.ganji.com/zufang/pn1/ 。不同的页面,pn 后面的数字会跟着变化。第一页是 pn1,第二页是 pn2,依此类推。那么我们写个 for 循环,使用 requests 搭配 bs 或者 xpath 就可以爬取下来。

两种是动态网页。

一种是和赶集网一样的分页形式,只不过点击不同页面网址不会改变,比如拉勾网的岗位招聘页面。这种类型使用 selenium 模仿浏览器的行为来进行爬取。

一种是像 pexels 图片网站瀑布流的形式。网址不会改变,内容随着页面下滑更新。这种类型可以先通过 XHR 文件找到源网址,然后再进行源网址的爬取,本文接下来会介绍的即为这种类型。

3f7cdd784100f2c07238c6a78fb3edd8.png

以豆瓣图片搜索“迪丽热巴”为例,在开发者模式下的 Network 找到名为 search_photo 的 XHR 文件,复制源网址打开。

411922c2afb6778245ec4069dcb51bf6.png

可以看到一共有 8315 个搜索结果,从 0 开始(start=0),每页展示 20 个,和网址的 “limit=20” 一致,可以通过修改 limit 的属性值来展示每页显示的图片数量,修改 start 的值来跳转到不同页面。各个图片的链接则在 src 内。这样我们就已经获取到了源网址,可以爬取所有图片的链接。

base_url = 'https://www.douban.com/j/search_photo?q=%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4&limit=40&start={}'
for i in range(0,8320,40):    
    #分页链接      
    url = base_url.format(i)      
    resp = requests.get(url,headers=headers).text      
    text = json.loads(resp,encoding='utf-8')      
    for image in text['images']:      
        #图片网址中的thumb代表下载下来的是小图片,将其替换为l下载大图片          
        image['src'] = re.sub(r'thumb',r'l',image['src'])

通过以上代码获得了所有图片的链接。因为图片链接中有 thumb,获取的图片会是小图片,我们将它替换为 l 来获取相对较大的图片。接下去是为图片创建文件路径和写入。

dir = 'C:/Users/春风沐古/Desktop/no_code_1/'+str(image['id'])+'.jpg'
try:
    #爬取图片      
    resp = requests.get(src,headers=headers,timeout=10)  
    #打开图片文件      
    f = open(dir,'wb')  
    #将爬取的内容写入图片文件      
    f.write(resp.content)  
    #关闭文件      
    f.close()  
    #防止读取超时和连接未知服务器报错  
except (requests.exceptions.ConnectionError,requests.exceptions.ReadTimeout):      
    print('无法下载图片')

为了防止连接未知服务器和读取超时报错,我们使用 try...except 语句来执行图片的下载。然后就是将代码用函数封装起来,方便复用,完整的代码如下:

import requests
import json
import re
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}

    #下载图片
def download_pic(src,id):
    #图片路径
    dir = 'C:/Users/春风沐古/Desktop/no_code_1/'+str(id)+'.jpg'
    try:
    #爬取图片
        resp = requests.get(src,headers=headers,timeout=10)
    #打开图片文件
        f = open(dir,'wb')
    #将爬取的内容写入图片文件
        f.write(resp.content)
    #关闭文件
        f.close()
    #防止读取超时和连接未知服务器报错
    except (requests.exceptions.ConnectionError,requests.exceptions.ReadTimeout):
        print('无法下载图片')

    #主函数
def main():
    base_url = 'https://www.douban.com/j/search_photo?q=%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4&limit=40&start={}'
    #一共有8000多张图片,循环获取图片
    for i in range(0,8320,40):
        url = base_url.format(i)
        resp = requests.get(url,headers=headers).text
        text = json.loads(resp,encoding='utf-8')
    for image in text['images']:
    #图片网址中的thumb代表下载下来的是小图片,将其替换为l下载大图片
        image['src'] = re.sub(r'thumb',r'l',image['src'])
    #打印图片网址
        print(image['src'])
        download_pic(image['src'],image['id'])

if __name__ == '__main__':
    main()

一般来说这种方法基本已经满足下载的需求,对于爬取的速度进行了 10 秒(timeout=10)的等待限制,以免网站反爬虫限制,更好的防反爬虫可以完善请求头和用代理以及增加随机性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值