python爬取百度图片

news2024/11/24 20:14:50

1.查询数据

打开网页。

https://cn.bing.com/images/search?q=%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87&form=HDRSC2&first=1&cw=1585&ch=924

 我们右键查看网页源代码,发现能找到我们需要的img衔接,但是这是一个动态网页。我们每次向下滑动网页,会发现图片更新,而图片更新一般伴随着异步请求。

并且我们打开控制台,如下图所示:

1.点击网络 2.点击Fetch/XHR 

 随着向下滑动:

下图红框异步请求次数增多。

我们将异步请求衔接,在另一个标签页打开。

发现他的响应数据有我们需要图片。

2.请求数据

我们在上面知道是一个动态网页之后,并且找到请求img的地址之后,我们是不是要探寻请求url的规律,发现是如何向下滚动,出现新的图片?

经过查找对比,发现这几个请求参数,新的请求会发生变化。

 然后,我们通过对这几个参数修改进行请求,发现实际起作用的是first。也就是图片起始索引。

另外,q也就是我们搜索的数据进行url编码之后的东西。

3.解析数据

我们找到我们找寻的图片在哪里,但是发现请求响应的是一堆html + css + js代码,因此我们需要对其进行过滤,只找到我们需要的img的url。

我们在打开刚才的那个异步请求url,查看页面源代码。

将前端代码,粘贴到在线 HTML 格式化工具,HTML 代码美化工具 - 在线工具-wetools.com微工具

这个html格式化工具里面,格式化后,将格式化后的代码,粘贴到vscode里面。 

 我们查看代码发现,我们需要img的url,是在下图所示的层级结构里面:

 更往上的html层级结构为:

 因此我们的python爬虫代码可以这样写:

from lxml import etree
import requests
from fake_useragent import UserAgent


if __name__ == '__main__':
    headers = {
        'User-Agent': UserAgent().random
    }

    url = "https://cn.bing.com/images/async?q=%e7%99%be%e5%ba%a6%e5%9b%be%e7%89%87&first=162" \
          "&count=35&cw=1177&ch=909&relp=35&apc=0&datsrc=I&layout=RowBased&mmasync=1&dgState=x*740_y*940_h*180_c*3_i*106_r*20&" \
          "IG=1EA071CC53E44DFA8101AF041D481594&SFX=4&iid=images.5563"
    # 请求响应数据
    html = requests.get(url=url,headers=headers).text
    p = etree.HTML(html)
    img_list = []
    # 解析响应数据
    ul_list = p.xpath('//ul[@data-row]')     # 基准表达式
    for ul in ul_list:
        li_list = ul.xpath('.//li[@data-idx]')
        for li in li_list:
            img1_list = list(li.xpath('.//img[contains(@class,"mimg")]/@src'))
            img2_list = list(li.xpath('.//img[contains(@class,"cimg")]/@src'))
            for img1 in img1_list:
                img_list.append(img1)
            for img2 in img2_list:
                img_list.append(img2)
    print(img_list)

4.将图片保存到本地

我们将上述img 衔接,再次进行请求并下载到本地。

    # 保存图片
    def save_images(self, img_list, dir_path, q):
        # 不存在,创建目录
        dir_path = dir_path + '/' + q + "/"
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        i = 1
        for img in  img_list:
           img_path = '{}{}-{}.jpg'.format(dir_path,q,i)
           self.save_image(img_path,img)
           i += 1

     # 保存图片
    def save_image(self,img_path,img):
        html = requests.get(url=img,headers=self.get_headers()).content
        with open(img_path,'wb') as f:
            f.write(html)

4.完整代码

from lxml import etree
import requests
from fake_useragent import UserAgent
from urllib import parse
import os



class BaiduSpider:
    def __init__(self):
        self.url = "https://cn.bing.com/images/async?q={}&first={}&count=35&cw=1177&ch=909" \
                   "&relp=35&apc=0&datsrc=I&layout=RowBased&mmasync=1"

    # 获取请求头
    def get_headers(self):
        return {
            'User-Agent': UserAgent().random
        }

    # 获取响应数据
    def get_html(self, q, first):
        q = parse.quote(q)
        url = self.url.format(q, first)
        html = requests.get(url=url, headers=self.get_headers()).text
        return html

    # 解析响应数据
    def parse_html(self, html):
        p = etree.HTML(html)
        img_list = []
        # 基准表达式
        ul_list = p.xpath('//ul[@data-row]')
        for ul in ul_list:
            li_list = ul.xpath('.//li[@data-idx]')
            for li in li_list:
                img1_list = list(li.xpath('.//img[contains(@class,"mimg")]/@src'))
                img2_list = list(li.xpath('.//img[contains(@class,"cimg")]/@src'))
                for img1 in img1_list:
                    img_list.append(img1)
                for img2 in img2_list:
                    img_list.append(img2)

        print(img_list)
        return img_list

    # 保存图片列表
    def save_images(self, img_list, dir_path, q):
        # 不存在,创建目录
        dir_path = dir_path + '/' + q + "/"
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        i = 1
        for img in  img_list:
           img_path = '{}{}-{}.jpg'.format(dir_path,q,i)
           self.save_image(img_path,img)
           i += 1

     # 保存图片
    def save_image(self,img_path,img):
        html = requests.get(url=img,headers=self.get_headers()).content
        with open(img_path,'wb') as f:
            f.write(html)

    # 入口函数
    def run(self):
        q = input("请输入搜索内容:")
        first = int(input("请输入起始页数:"))
        dir_path = "C:/Users/qhx20/Desktop/我的项目/Test/PythonTest/SpiderDemo/img"
        html = self.get_html(q, first)
        img_list = self.parse_html(html)
        self.save_images(img_list, dir_path, q)


if __name__ == '__main__':
    bds = BaiduSpider()
    bds.run()

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

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

相关文章

基于Java的医院预约挂号系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

uboot启动流程-涉及lowlevel_init汇编函数

一. uboot启动流程涉及函数 之前文章简单分析了 uboot启动流程的开始,从链接脚本文件 u-boot.lds 中,我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start函数。 _start函数:调用了 reset 函数,reset 函数内部&…

【小沐学前端】Node.js实现基于Protobuf协议的UDP通信(UDP/TCP/WebSocket)

文章目录 1、简介1.1 node1.2 Protobuf 2、下载和安装2.1 node2.2 Protobuf2.2.1 安装2.2.2 工具 3、node 代码示例3.1 HTTP3.2 UDP单播3.4 UDP广播 4、Protobuf 代码示例4.1 例子: awesome.proto4.1.1 加载.proto文件方式4.1.2 加载.json文件方式4.1.3 加载.js文件方式 4.2 例…

An attempt was made to call the method xxx but it does not exist

场景 在公司项目中做配置迁移的时候&#xff0c;服务启动时报错 报错信息 Description:An attempt was made to call the method redis.clients.jedis.Jedis.<init>(Ljava/lang/String;IIIZLjavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/SSLParameters;Ljavax/net/…

编程每日一练(多语言实现)基础篇:求总数问题

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现 一、实例描述 集邮爱好者把所有的邮票存放在三个集邮册中&#xff0c;在A册内存放全部的十分之二&#xff0c;在B册内存放不知道是全部的七分之几&…

xPortPendSVHandler任务切换流程

__asm void xPortPendSVHandler( void ) { extern uxCriticalNesting; extern pxCurrentTCB; extern vTaskSwitchContext; PRESERVE8 mrs r0, psp isb//指令同步命令&#xff0c; ldr r3, pxCurrentTCB /* Get the location of the current TCB. */ ldr r2, [r3]//r2保存…

Ghostscript 在 Linux 和 Windows 系统的应用与问题解决

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

分享10个必备的VS Code技巧和窍门,提高你的开发效率

目录 前言 1. 时间线视图&#xff1a;本地源代码控制 2. 自动保存&#xff1a;不再需要按Ctrl S 3. 使用命令面板进行任何操作 4、快速转到文件 5. 快速跳转指定行 6. 快速删除该行 7. 享受使用流畅的光标进行打字 8. 快速格式化代码 9. 使用多光标编辑功能节省时间…

redis5.0配置一主两从三哨兵

基础配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configvi /etc/hosts ip1 node1 ip2 node2 ip3 node3redis 配置一主两从 yum -y install autoconf automake bison byac…

leetCode 309.买卖股票的最佳时机含冷冻期 动态规划 + 滚动数组

309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买…

排序篇(四)----归并排序

排序篇(四)----归并排序 1.归并(递归) 基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到…

【Linux】UDP的服务端 + 客户端

文章目录 &#x1f4d6; 前言1. TCP和UDP2. 网络字节序2.1 大小端字节序&#xff1a;2.2 转换接口&#xff1a; 3. socket接口3.1 sockaddr结构&#xff1a;3.2 配置sockaddr_in&#xff1a;3.3 inet_addr&#xff1a;3.4 inet_ntoa&#xff1a;3.5 bind绑定&#xff1a; 4. 服…

【VR】【unity】如何在VR中实现远程投屏功能?

【背景】 目前主流的VD应用,用于娱乐很棒,但是用于工作还是无法效率地操作键鼠。用虚拟键盘工作则显然是不现实的。为了让自己的头显能够起到小面积代替多显示屏的作用,自己动手开发投屏VR应用。 【思路】 先实现C#的投屏应用。研究如何将C#投屏应用用Unity 3D项目转写。…

FFmpeg 命令:从入门到精通 | ffplay 播放控制选项

FFmpeg 命令&#xff1a;从入门到精通 | ffplay 播放控制选项 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 播放控制选项选项表格图片 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 播放控制选项 选项表格 项目说明Q&#xff0c;Esc退出播放F&#xff0c;鼠标左键双击全…

计算机网络分层结构

一、OSI参考模型(法定标准) 1.由国际标准化组织(ISO)提出的开放系统互连(OSI)参考模型 2.OSI七层结构&#xff1a; 3.通信过程&#xff1a; 4.各层功能 应用层-能和用户交互产生网络流量(需要联网)的程序&#xff0c;常见协议有文件传输(FTP)、电子邮件(SMTP)、万维网(HTTP)…

MASM32配置问题

1. 总述 当你用masm32 SDK出现类似下面的错误情况: cannot open file :windows.inc这说明你的汇编器无法找到windows.inc这个头文件, 有3种解决方法 2. 解决方法 a. 使用绝对路径 直接把需要的inc头文件或者lib库文件的绝对路径包含进去, 问题就解决了 .586 .model flat,…

【Java 进阶篇】MySQL多表关系详解

MySQL是一种常用的关系型数据库管理系统&#xff0c;它允许我们创建多个表格&#xff0c;并通过各种方式将这些表格联系在一起。在实际的数据库设计和应用中&#xff0c;多表关系是非常常见的&#xff0c;它能够更好地组织和管理数据&#xff0c;实现数据的复杂查询和分析。本文…

Heptabase 究竟好在哪儿?

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; Heptabase 1.0 正式版发布&#xff0c;你可以免费尝试了。 赞誉 我因为研究各种知识管理工具&#xff0c;常年混迹在不同的社区、群组与论坛中…

Python日期的加减等操作

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 日期输出格式化 所有日期、时间的api都在datetime模块内。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都…

《MySQL高级篇》十六、主从复制

文章目录 1、主从复制概述1.1 如何提升数据库并发能力1.2 主从复制的作用 2、主从复制的原理2.1 原理剖析2.2 复制的基本原则 3、一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 主机&#xff1a;建立账户并授权3.5 从机&#xff1a;配置需要复制的主机3.6 …