Python爬虫实战第二例【二】

news2024/11/19 17:40:35

零.前言:

本文章借鉴:Python爬虫实战(五):根据关键字爬取某度图片批量下载到本地(附上完整源码)_python爬虫下载图片-CSDN博客

 大佬的文章里面有API的获取,在这里我就不赘述了。

一.实战目标:

对百度的图片进行爬取,利用代理IP实现批量下载

二.实现效果:

实现批量下载指定内容的图片,存放到指定文件夹中:

 三.代码实现

3.1分析网页

右键网页,点击检查,进入我们的Google开发者工具。

筛选出我们需要的文件(通过查找载荷寻找)

 接下来,只需要构建我们的载荷:

 3.2获取图片的URL链接

def get_img_url(keyword):
    #接口连接
    url = "https://image.baidu.com/search/acjson"
    #请求头
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
    }
    #params参数
    params = {
        "tn": "resultjson_com",
        "logid": "7831763171415538646",
        "ipn": "rj",
        "ct": "201326592",
        "is":"",
        "fp":"result",
        "fr":"",
        "word":f"{keyword}",
        "queryWord":f"{keyword}",
        "cl":"2",
        "lm":"-1",
        "ie":"utf - 8",
        "oe":"utf - 8",
        "adpicid":"",
        "st":"",
        "z":"",
        "ic":"",
        "hd":"",
        "latest":"",
        "copyright":"",
        "s":"",
        "se":"",
        "tab":"",
        "width":"",
        "height":"",
        "face":"",
        "istype":"",
        "qc":"",
        "nc":"1",
        "expermode":"",
        "nojc":"",
        "isAsync":"",
        "pn":"1",
        "rn":"100",
        "gsm":"78",
        "1709030173834":""
    }
    #创建get请求
    r = requests.get(url=url,params=params,headers=header)
    #切换编码格式
    r.encoding = "utf-8"
    json_dict = r.json()
    #定位数据
    data_list = json_dict["data"]
    #存储链接
    url_list = []
    #循环取链接
    for i in data_list:
        if i:
            u = i["thumbURL"]
            url_list.append(u)
    return url_list

结果: 

 3.3实现代理

def get_ip():
    #代理API
    url = "你的代理API"
    while 1:
        try:
            r = requests.get(url,timeout=10)
        except:
            continue
        ip = r.text.strip()
        if "请求过于频繁" in ip:
            print("IP请求频繁")
            time.sleep(1)
            continue
        break
    proxies = {
        "https": f"{ip}"
    }
    return proxies

效果:

 

 3.4实现爬虫

def get_down_img(img_url_list):
    #创建文件夹
    if not os.path.isdir("鞠婧祎"):
        os.mkdir("鞠婧祎")
    #定义图片编号
    n = 0
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
    }
    times = 0
    while times < len(img_url_list):
        #获取代理IP
        proxies = get_ip()
        try:
            img_data = requests.get(url=img_url_list[times],headers=header,proxies=proxies,timeout=2)
        except Exception as e:
            print(e)
            continue
        #拼接图片存放地址和名字
        img_path = "鞠婧祎/" + str(n) + ".jpg"
        #写入图片
        with open(img_path,"wb") as f:
            f.write(img_data.content)
        n = n + 1
        times += 1

 四、优化

上面基本实现了批量爬取图片的目的,但是在实际使用中可能会因为代理IP的质量问题,网络问题,导致爬取效率低下,在这里作者给出几点优化的空间:

1.设置timeout超时时间(秒/S)

2.使用requests.sessions类,构建一个sessions对象,设置连接重试次数。

3.使用多线程,分批爬取

具体实现,可以等作者后面慢慢更新,挖个大坑,记得催更。。。

五、全部代码

import requests
import time
import  os

def get_img_url(keyword):
    #接口连接
    url = "https://image.baidu.com/search/acjson"
    #请求头
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
    }
    #params参数
    params = {
        "tn": "resultjson_com",
        "logid": "7831763171415538646",
        "ipn": "rj",
        "ct": "201326592",
        "is":"",
        "fp":"result",
        "fr":"",
        "word":f"{keyword}",
        "queryWord":f"{keyword}",
        "cl":"2",
        "lm":"-1",
        "ie":"utf - 8",
        "oe":"utf - 8",
        "adpicid":"",
        "st":"",
        "z":"",
        "ic":"",
        "hd":"",
        "latest":"",
        "copyright":"",
        "s":"",
        "se":"",
        "tab":"",
        "width":"",
        "height":"",
        "face":"",
        "istype":"",
        "qc":"",
        "nc":"1",
        "expermode":"",
        "nojc":"",
        "isAsync":"",
        "pn":"1",
        "rn":"100",
        "gsm":"78",
        "1709030173834":""
    }
    #创建get请求
    r = requests.get(url=url,params=params,headers=header)
    #切换编码格式
    r.encoding = "utf-8"
    json_dict = r.json()
    #定位数据
    data_list = json_dict["data"]
    #存储链接
    url_list = []
    #循环取链接
    for i in data_list:
        if i:
            u = i["thumbURL"]
            url_list.append(u)
            print(u)
    return url_list

def get_ip():
    #代理API
    url = "你的API"
    while 1:
        try:
            r = requests.get(url,timeout=10)
        except:
            continue
        ip = r.text.strip()
        if "请求过于频繁" in ip:
            print("IP请求频繁")
            time.sleep(1)
            continue
        break
    proxies = {
        "https": f"{ip}"
    }
    return proxies

def get_down_img(img_url_list):
    #创建文件夹
    if not os.path.isdir("鞠婧祎"):
        os.mkdir("鞠婧祎")
    #定义图片编号
    n = 0
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
    }
    times = 0
    while times < len(img_url_list):
        #获取代理IP
        proxies = get_ip()
        try:
            img_data = requests.get(url=img_url_list[times],headers=header,proxies=proxies,timeout=2)
        except Exception as e:
            print(e)
            continue
        #拼接图片存放地址和名字
        img_path = "鞠婧祎/" + str(n) + ".jpg"
        #写入图片
        with open(img_path,"wb") as f:
            f.write(img_data.content)
        n = n + 1
        times += 1

if __name__ == "__main__":
    url_list = get_img_url("鞠婧祎")
    get_down_img(url_list)

六、前置文章

有些读者可能不太懂一些爬虫的知识,在这里作者给出部分文章,方便读者理解

关于Cookie的浅谈-CSDN博客

JSON简介以及如何在Python中使用JSON-CSDN博客

Python爬虫实战第一例【一】-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1475659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

早产儿视网膜病变分期,自动化+半监督(无需大量医生标注数据)

早产儿视网膜病变 ROP 分期 提出背景解法框架解法步骤一致性正则化算法构建思路 实验 提出背景 论文&#xff1a;https://www.cell.com/action/showPdf?piiS2589-0042%2823%2902593-2 早产儿视网膜病变&#xff08;ROP&#xff09;目前是全球婴儿失明的主要原因之一。 这是…

链表基础知识详解(非常详细简单易懂)

概述&#xff1a; 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很…

求两个向量之间的夹角

求两个向量之间的夹角 介绍Unity的API求向量夹角Vector3.AngleVector3.SignedAngle 自定义获取方法0-360度的夹角 总结 介绍 求两个向量之间的夹角方法有很多&#xff0c;比如说Unity中的Vector3.Angle&#xff0c;Vector3.SignedAngle等方法&#xff0c;具体在什么情况下使用…

Groovy(第九节) Groovy 之单元测试

JUnit 利用 Java 对 Song 类进行单元测试 默认情况下 Groovy 编译的类属性是私有的,所以不能直接在 Java 中访问它们,必须像下面这样使用 setter: 编写这个测试用例余下的代码就是小菜一碟了。测试用例很好地演示了这样一点:用 Groovy 所做的一切都可以轻易地在 Java 程序…

使用 gregwar/captcha 生成固定字符的验证码

图片验证码生成失败 $captcha new CaptchaBuilder("58 ?"); $code $captcha->getPhrase();\Cache::put($key, [phone > $phone, code > $captcha->getPhrase()], $expiredAt);$captcha->build(); $result [captcha_key > $key,expired_at >…

Linux------进程地址空间

目录 一、进程地址空间 二、地址空间本质 三、什么是区域划分 四、为什么要有地址空间 1.让进程以统一的视角看到内存 2.进程访问内存的安全检查 3.将进程管理与内存管理进行解耦 一、进程地址空间 在我们学习C/C的时候&#xff0c;一定经常听到数据存放在堆区、栈区、…

雾锁王国服务器官方配置要求说明

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

TCP/IP-常用网络协议自定义结构体

1、TCP/IP模型&#xff1a; 2、TCP/IP- 各层级网络协议&#xff08;从下往上&#xff09;&#xff1a; 1&#xff09;数据链路层&#xff1a; ARP: 地址解析协议&#xff0c;用IP地址获取MAC地址的协议&#xff0c;通过ip的地址获取mac地 …

Vue项目 快速上手(如何新建Vue项目,启动Vue项目,Vue的生命周期,Vue的常用指令)

目录 一.什么Vue框架 二.如何新建一个Vue项目 1.使用命令行新建Vue项目 2.使用图形化界面新建Vue项目 三.Vue项目的启动 启动Vue项目 1.通过VScode提供的图形化界面启动Vue项目 2.通过命令行的方式启动Vue项目 四.Vue项目的基础使用 常用指令 v-bind 和 v-model v…

学生党福音!趁着拍拍开学季活动买平板啦!

谁还在买5年前的平板啊&#xff1f; 当然是我&#xff01; 虽然手里有台ipad&#xff0c;但ios系统限制多&#xff0c;不方便&#xff0c;一直想再要一台安卓平板。 去年观望了好久小米平板5pro&#xff0c;想着如果8256G配置价格在1500以下就入手&#xff0c;结果一直不掉价…

4_怎么看原理图之协议类接口之SPI笔记

SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行通信协议&#xff0c;通常用于在芯片之间传输数据。SPI协议使用四根线进行通信&#xff1a;主设备发送数据&#xff08;MOSI&#xff09;&#xff0c;从设备发送数据&#xff08;MISO&#xff09;&#x…

苹果ios群控软件开发常用源代码分享!

在移动软件开发领域&#xff0c;苹果设备由于其封闭性和安全性受到了广大开发者的青睐&#xff0c;然而&#xff0c;这也为开发者带来了一些挑战&#xff0c;特别是在进行群控软件开发时。 群控软件是指可以同时控制多台设备的软件&#xff0c;这在自动化测试、批量操作等场景…

01 MySQL之连接

1. 连接 1.0 基础认知 多表(主表)和一表(从表的区别): 多表一般是主表&#xff0c;一般存储主要数据&#xff0c;每个字段都可能存在重复值&#xff0c;没有主键&#xff0c;无法根据某个字段定位到准确的记录&#xff1b; 一表一般是从表&#xff0c;一般存储辅助数据&…

『Java安全』编译jdk

文章目录 一、源码下载二、环境依赖配置[^1]三、依赖检查及构建编译配置四、编译jdk五、编译完成完 一、源码下载 以OpenJDK为例&#xff1a; jdk&#xff1c;10访问OpenJDK Mercurial Repositories jdk≥10访问子目录jdk/jdk12: log (openjdk.org) 二、环境依赖配置1 i7-…

神经网络结构搜索(NAS)

华为诺亚AI系统工程实验室主任刘文志解读如何使用AutoML预测基站流量 - 知乎讲师介绍&#xff1a;刘文志&#xff08;花名风辰&#xff09;&#xff0c;华为诺亚AI系统工程实验室主任&#xff0c;异构并行计算专家&#xff0c;毕业于中国科学院研究生院&#xff0c;闻名于并行计…

鸿蒙应用程序包安装和卸载流程

开发者 开发者可以通过调试命令进行应用的安装和卸载&#xff0c;可参考多HAP的调试流程。 图1 应用程序包安装和卸载流程&#xff08;开发者&#xff09; 多HAP的开发调试与发布部署流程 多HAP的开发调试与发布部署流程如下图所示。 图1 多HAP的开发调试与发布部署流程 …

全网最详细的接口自动化测试框架实战(Pytest+Allure+Excel)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1. Allure 简介 Allure 框架是一个灵活的、轻量级的、支持多语…

Flink动态分区裁剪

1 原理 1.1 静态分区裁剪与动态分区裁剪 静态分区裁剪的原理跟谓词下推是一致的&#xff0c;只是适用的是分区表&#xff0c;通过将where条件中的分区条件下推到数据源达到减少分区扫描的目的   动态分区裁剪应用于Join场景&#xff0c;这种场景下&#xff0c;分区条件在joi…

【服务发现--ingress】

1、ingress介绍 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟…

Nginx网络服务六-----IP透传、调度算法和负载均衡

1.实现反向代理客户端 IP 透传 就是在日志里面加上一个变量 Module ngx_http_proxy_module [rootcentos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf server { listen 80; server_name www.kgc.org; location / { index index.html index.php; root /data/nginx/html/p…