python爬取百度图片

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 UserAgentif __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).textp = 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 = 1for 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()).contentwith 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 osclass 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()).textreturn 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 = 1for 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()).contentwith open(img_path,'wb') as f:f.write(html)# 入口函数def run(self):q = input("请输入搜索内容:")first = int(input("请输入起始页数:"))dir_path = "../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.mzph.cn/news/92280.shtml

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

相关文章

C++核心编程--多态篇

4.7、多态 4.7.1、多态的基本概念 多态是C面向对象三大特征之一 多态分为两类 静态多态:函数重载和运算符重载属于静态多态,复用函数名动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早…

校物联网智慧安全用电平台的设计和运用-安科瑞黄安南

一.前言 安全用电历来都是学校安全工作的一个重点,然而每年因此发生的人身伤害以及火灾事故却在继续着,究其原因,主观上是我们的防患意识淡薄,客观上则是由于学生在宿舍使用违规电器、乱拉电线造成的。 现代的大学生宿舍&#x…

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…

HashMap底层源码,数据结构

HashMap的底层结构在jdk1.7中由数组链表实现,在jdk1.8中由数组链表红黑树实现,以数组链表的结构为例。 JDK1.8之前Put方法: JDK1.8之后Put方法: HashMap基于哈希表的Map接口实现,是以key-value存储形式存在&#xff0c…

K8S内容分发网络之集群,nginx,负载均衡,防火墙

K8S内容分发网络之集群,nginx,负载均衡,防火墙 一、Kubernetes 区域可采用 Kubeadm 方式进行安装。1.所有节点,关闭防火墙规则,关闭selinux,关闭swap交换2.修改主机名3.所有节点修改hosts文件4.调整内核参数…

闪击笔试题

选择题 ping命令不涉及什么协议? A:DNS B: TCP C: ARP D: ICMP B,ping基于ICMP协议,解析路由会用到ARP和DNS a、b、c三人参加学科竞赛,每个学科按一二三名次给x、y、z分,已知a得22分,b和c得9分&#xf…

【图论C++】链式前向星(图(树)的存储)

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记:转载需获得博主本人…

人工智能的学习算法

1956年,几个计算机科学家相聚在达特茅斯会议,提出了 “人工智能” 的概念,梦想着用当时刚刚出现的计算机来构造复杂的、拥有与人类智慧同样本质特性的机器。其后,人工智能就一直萦绕于人们的脑海之中,并在科研实验室中…

数组和切⽚ - Go语言从入门到实战

数组和切⽚ - Go语言从入门到实战 数组的声明 package main import "fmt" func main() { var a [3]int //声明并初始化为默认零值 a[0] 1 fmt.Println("a:", a) // 输出: a: [1 0 0] b : [3]int{1, 2, 3} //声明同时初始化 fmt.Println("b:…

Airtool for Mac——高效便捷的系统菜单栏网络工具!

在我们的数字化生活中,对于网络连接的稳定性和速度有着越来越高的需求。为了满足您对网络质量的实时监测和分析的需求,我们向大家介绍一款强大的Mac系统菜单栏网络工具——Airtool! Airtool是一款专为Mac设计的网络工具,它能够提…

番外5:下载+安装+配置Linux

任务前期工作: 01. 电脑已安装好VMware Workstation软件; 02.提前下载好Rhel-8.iso映像文件(文件较大一般在9.4GB,建议采用迅雷下载),本人使用的以下版本(地址ed2k://|file|rhel-8.4-x86_64-dvd…

基于PHP+MySQL的养老院管理系统

摘要 随着21世纪互联网时代的兴起,我们见证了人们生活方式的巨大改变。这个时代不仅深刻影响了我们的生活,还改变了我们对信息科学的看法。社会的各个领域都在不断发展,人们的思维也在不断进步,与此同时,信息的需求也与…

【React】React组件生命周期以及触发顺序(部分与vue做比较)

最近在学习React,发现其中的生命周期跟Vue有一些共同点,但也有比较明显的区别,并且执行顺序也值得讨论一下,于是总结了一些资料在这里,作为学习记录。 v17.0.1后生命周期图片 初始化阶段 由ReactDOM.render()触发 —…

百度交易中台之内容分润结算系统架构浅析

作者 | 交易中台团队 导读 随着公司内容生态的蓬勃发展,内容产出方和流量提供方最关注的“收益结算”的工作,也就成为重中之重。本文基于内容分润结算业务为入口,介绍了实现过程中的重难点,比如千万级和百万级数据量下的技术选型和…

用Java打印长方形、平行四边形 、三角形、菱形、空心菱形

今天复习使用嵌套for来完成一些任务,于是想着打印一些图形来练习 思考感悟 长方形 行数 和 每行的星星数嵌套遍历即可 平行四边形 核心:每行空格数总行数-行数 行数空格数132231 三角形 核心:每行星星数2*当前行数-1 行数星星数1123…

【VIM】VIm-plug插件

如何查找需要的插件 https://github.com/mhinz/vim-startify https://github.com/vim-airline/vim-airline https://github.com/Yggdroot/indentLine github.com/w0ng/vim-hybrid github.com/altercationi/vim-colors-solarized guithub.com/morhetz/gruvbox github.com/sc…

【2023保研】双非上岸东南网安

个人情况 学校:henu 专业:信息安全 排名:1/66 英语:六级500 竞赛:蓝桥杯PB国一,ISCC国一,密码数学挑战赛国三,还有其他一些省级水奖 论文:一篇EI在投(三作通…

C++:红黑树

目录 一、关于红黑树 1、红黑树和AVL树区别 2、红黑树规则 二、红黑树 1、红黑树变色举例 2、红黑树具体情况分析 ①、情况一:只变色 ②、情况二:单旋 变色 ③、情况三:双旋 变色 三、红黑树的模拟实现 一、关于红黑树 1、红黑树…

王道考研计算机网络——传输层

一、传输层概述 复用:发送方不同的应用进程都可以使用同一个传输层的协议来传送数据 分用:接收方的传输层在去除报文段的首部之后能把数据交给正确的应用进程 熟知端口号就是知名端口号0-1023 客户端使用的端口号是动态变化的,不是唯一确定…

某房产网站登录RSA加密分析

文章目录 1. 写在前面2. 抓包分析3. 扣加密代码4. 还原加密 1. 写在前面 今天是国庆节,首先祝福看到这篇文章的每一个人节日快乐!假期会老的这些天一直在忙事情跟日常带娃,抽不出一点时间来写东西。夜深了、娃也睡了。最近湖南开始降温了&…