Python爬虫获取百度的图片

一. 爬虫的方式:

主要有2种方式:

①Scrapy+Xpath  (API 静态 爬取-直接post get) 

②selenium+Xpath (点击 动态 爬取-模拟) 

Scrapy+Xpath  

XPath 是 Scrapy 中常用的一种解析器,可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。

Scrapy 中使用 XPath 的方式和普通的 Python 程序基本一致。我们需要首先导入 scrapy 的 Selector 类和 scrapy 的 Request 类,然后使用 Selector 类来解析 Response 对象,并使用 XPath 表达式来定位和提取数据。

详细讲解可以参考:Scrapy爬虫学习笔记之二(Xpath的用法) - 知乎

selenium+Xpath

Selenium 是为了解决 requests 无法直接执行 JavaScript 代码的问题。本质是通过驱动浏览器,完全模拟浏览器的操作,输入、点击、下拉等。

安装:pip install selenium

使用需要下载浏览器驱动,并且驱动要跟浏览器版本对应

chrome浏览器版本在114之前

浏览器版本在114之前,可以进入以下网址http://chromedriver.storage.googleapis.com/index.html,直接下载相应的文件

chrome浏览器版本在115以上

以下版本皆为chromedriver版本

例如:version : 119.0.6045.21,你电脑的浏览器版本为其他版本,如118.0.5952.2,只需要把链接中的版本号替换成这个编号即可

平台下载地址
linux64http:// https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/linux64/chromedriver-linux64.zip
mac-arm64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/mac-arm64/chromedriver-mac-arm64.zip
mac-x64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/mac-x64/chromedriver-mac-x64.zip
win32https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/win32/chromedriver-win32.zip
win64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/win64/chromedriver-win64.zip

Chromedriver 插件安装教程

参考:稳扎稳打学爬虫09—chromedriver下载与安装方法-CSDN博客

下面简单使用模拟百度搜索:

import timefrom selenium import webdriverbro = webdriver.Chrome(executable_path='./chromedriver.exe')  # 得到一个谷歌浏览器对象,并指定使用那个驱动bro.implicitly_wait(5)  # 隐士等待:找一个控件,如果控件没有加载出来,就等待5S,只需要写着一句,以后所有控件都按照这个操作来bro.get('https://www.baidu.com')  # 在地址栏里输入百度input_k = bro.find_element_by_id('kw')  # 找到百度输入框对应的控件input_k.send_keys('火灾火焰')  # 框里面输入pythonsou = bro.find_element_by_id('su')  # 找到搜索按钮sou.click()  # 点击搜索按钮time.sleep(3)bro.close()  # 关闭浏览器

selenium详细用法参考:https://www.cnblogs.com/XiaoYang-sir/p/15173174.html

二. selenium+xpath

利用selenium获取元素定位方法,爬取百度图片

通过定位获取完整爬取图片的超链接信息,鼠标放置百度页面右键=》检测

完整爬取代码

'''注释:@author is leilei百度图片爬虫,采用selenium模拟鼠标点击形式1. 将要搜索的文本表示成list2. 打开百度图片官网,输入文本,搜索3. 逐条下载对应的图片
注:本代码支持断点续爬!
'''import os
import uuid
import time
import random
import urllib
import urllib.request
from selenium import webdriver
from selenium.webdriver.common.keys import Keys  # 键盘类#爬取的种类图片
NameList=['火灾火焰', '火灾烟雾']def send_param_to_baidu(name, browser):''':param name:    str:param browser: webdriver.Chrome 实际应该是全局变量的:return:        将要输入的 关键字 输入百度图片'''# 采用id进行xpath选择,id一般唯一inputs = browser.find_element_by_xpath('//input[@id="kw"]')inputs.clear()inputs.send_keys(name)time.sleep(1)inputs.send_keys(Keys.ENTER)time.sleep(1)return'''
写Python爬虫的时候,没过多久Python就会报错,然后停止采集。总是没办法从头到尾把数据采集下来。
每一下次报错我都要去找原因,比如我要采集的标签里面没有URL,URL为空就会报错,
或者页面没有URL也会报错。于是我是用try…except语句跳过错误,但是还是会遇到其他问题,
就是try…except语句只能跳过一次错误,第二次错误就会失效。所以采用了下面这种mistaken方法处理异常。
'''
def mistaken():try:print('*****出现异常错误,跳过此次循环,爬取无内容*****')######采集代码##########print('——————————接下来继续运行——————————')except:mistaken()def download_baidu_images(save_path, img_num, browser):''' 此函数应在:param save_path: 下载路径 str:param img_num:   下载图片数量 int:param name:   爬取种类的名字:param browser:   webdriver.Chrome:return:'''if not os.path.exists(save_path):os.makedirs(save_path)##下面是打开第一张图片,然后在此界面中点击左右切换图片# // *[ @ id = "imgid"]/div[1]/ul/li[1]/div/div[2]/a/img#如果这里报错,其中下面这里的定位地址,需要根据百度你爬取的图片的位置进行相应的修改img_link = browser.find_element_by_xpath(' //*[@id = "imgid"]/div[1]/ul/li[1]/div/div[2]/a/img')img_link.click()# 切换窗口windows = browser.window_handlesbrowser.switch_to.window(windows[-1])  #切换到图像界面# time.sleep(3)time.sleep(random.random())for i in range(img_num):img_link_ = browser.find_element_by_xpath('//div/img[@class="currentImg"]')src_link = img_link_.get_attribute('src')print(src_link)# 保存图片,使用urlibimg_name = uuid.uuid4()# urllib.request.urlretrieve(src_link, os.path.join(save_path, str(img_name) + '.jpg'))# 上述一行代码直接去访问资源会报403错误,排查发现可能是服务器开启了反爬虫,针对这种情况添加headers浏览器头,模拟人工访问网站行为:opener = urllib.request.build_opener()# 构建请求头列表每次随机选择一个ua_list = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0']opener.addheaders = [('User-Agent', random.choice(ua_list))]urllib.request.install_opener(opener)#为了不中断程序完整爬取,所以处理爬虫的过程中出现资源请求不到的错误404 或者403的错误,只需要跳过这些错误继续执行try:urllib.request.urlretrieve(src_link, os.path.join(save_path, str(img_name) + '.jpg'))except Exception as e:print(e)mistaken()# 如果网站反爬虫级别特别高的,还需要切换代理ip:使用urllib模块设置代理IP是比较简单的,首先需要创建ProxyHandler对象,其参数为字典类型的代理IP,键名为协议类型(如HTTP或者HTTPS),值为代理链接。然后利用ProxyHandler对象与buildopener()# 方法构建一个新的opener对象,最后再发送网络请求即可。# 创建代理IP# proxy_handler = urllib.request.ProxyHandler({#     'https': '58.220.95.114:10053'# })# # 创建opener对象# opener = urllib.request.build_opener(proxy_handler)# 关闭图像界面,并切换到外观界面time.sleep(random.random())# 点击下一张图片browser.find_element_by_xpath('//span[@class="img-next"]').click()time.sleep(random.random())# 关闭当前窗口,并选择之前的窗口browser.close()browser.switch_to.window(windows[0])returndef main(names, save_root, img_num=[1000, ], continue_num=0, is_open_chrome=True):''':param names: list str:param save_root: str:param img_num: int list or int:param continue_num: int 断点续爬开始索引,从哪一个种类继续爬取:param is_open_chrome: 爬虫是否打开浏览器爬取图像 bool default=False:return:'''options = webdriver.ChromeOptions()# 设置是否打开浏览器if not is_open_chrome:options.add_argument('--headless')  # 不打开浏览器# else:#     prefs = {"profile.managed_default_content_settings.images": 2}  # 禁止图像加载#     options.add_experimental_option("prefs", prefs)# 欺骗反爬虫,浏览器可以打开,但是没有内容options.add_argument("--disable-blink-features=AutomationControlled")browser = webdriver.Chrome(executable_path=r"D:\Anconda\envs\temp\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe",options=options)browser.maximize_window()browser.get(r'https://image.baidu.com/')time.sleep(random.random())assert type(names) == list, "names参数必须是字符串列表"assert continue_num <= len(names), "中断续爬点需要小于爬虫任务数量"if type(img_num) == int:img_num = [img_num] * len(names)print(img_num)elif type(img_num) == list:print("lsit:{}".format(img_num))else:print("None, img_num 必须是int list or int")returnfor i in range(continue_num, len(names)):name = names[i]save_path = os.path.join(save_root, str(names.index(name)))  # 以索引作为文件夹名称send_param_to_baidu(name, browser)download_baidu_images(save_path=save_path, img_num=img_num[i],browser=browser)# 全部关闭browser.quit()returnif __name__ == "__main__":main(names=NameList,save_root=r'C:\Users\HUAWEI\Desktop\photo',img_num=[1000, 1000],continue_num=1)

具体selenium的动态定位法:

参考链接: https://blog.csdn.net/u012206617/article/details/132451577?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-132451577-blog-109838581.235^v40^pc_relevant_anti_vip&spm=1001.2101.3001.4242.1&utm_relevant_index=3

 三. Scrapy+Xpath  

 需要使用 icrawler 包   [ps:直接pip install icrawler]

完整的代码1:

import os
from icrawler.builtin import BaiduImageCrawler
from icrawler.builtin import BingImageCrawler#可以使用,使用icrawler包静态爬取图片def check_path(path):if not os.path.exists(path):os.makedirs(path)return pathdef baidu_bing_crwal(key_words=['中国人'], max_nums=[1000], save_root=r'./'):#看是否存在文件夹check_path(save_root)assert len(key_words)==len(max_nums), "关键词和数量必须一致"# 2个一起爬虫save_root1 = os.path.join(save_root, 'baidu')# 百度爬虫for i in range(len(key_words)):print('-'*20)image_save_root = os.path.join(save_root1, str(i))if not os.path.exists(image_save_root):os.makedirs(image_save_root)storage = {'root_dir': image_save_root}crawler = BaiduImageCrawler(storage=storage)crawler.crawl(key_words[i], max_num=max_nums[i])# bing爬虫save_root2 = os.path.join(save_root, 'bing')for i in range(len(key_words)):print('-'*20)image_save_root = os.path.join(save_root2, str(i))if not os.path.exists(image_save_root):os.makedirs(image_save_root)storage = {'root_dir': image_save_root}crawler = BingImageCrawler(storage=storage)crawler.crawl(key_words[i], max_num=max_nums[i])returnif __name__ == '__main__':# baidu_bing_crwal(key_words=['生活垃圾', '化学垃圾',],#                  max_nums=[1000, 1000],#                  save_root=r'C:\Users\HUAWEI\Desktop\photo\da')baidu_bing_crwal(key_words=['火灾火焰', '火灾烟雾'],max_nums=[1000, 1000],save_root=r'C:\Users\HUAWEI\Desktop\photo\da')

 其实简化的静态爬虫方式

完整的代码2:

'''底层肯定是scrapy静态报文,谷歌引擎不可以,百度最快,bing速度有点慢!直接pip install icrawler若想搜索多个关键词,可以遍历for循环;同时icrawler也可对图像链接list、txt直接遍历:UrlListCrawler
'''
from icrawler.builtin import GoogleImageCrawler
from icrawler.builtin import BaiduImageCrawler
from icrawler.builtin import BingImageCrawler# storage字典格式'root_dir': 保存路径
# crawler = BaiduImageCrawler(storage={'root_dir': r'D:\temp\dog'})
crawler = BaiduImageCrawler(storage={'root_dir': r'C:\Users\HUAWEI\Desktop\photo'})
crawler.crawl(keyword='火焰', max_num=10)

最后:爬取图片的任务完成了 ,☺☺☺

学习参考链接:python 爬虫_python爬虫断点续爬-CSDN博客

 稳扎稳打学爬虫09—chromedriver下载与安装方法-CSDN博客

爬虫selenium获取百度任意图片_img_link = browser.find_elements_by_xpath('//li/di-CSDN博客Python爬虫:爬取百度图片(selenium模拟登录,详细注释)_百度图片 爬虫 find_elements-CSDN博客

爬虫selenium获取元素定位方法总结(动态获取元素)_selenium如何定位动态元素-CSDN博客

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

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

相关文章

Intel x86架构之I/O APIC

全文来自Intel手册&#xff08;见参考1&#xff09;&#xff1a;Intel? 82093AA I/O Advanced Programmable Interrupt Controller (I/O APIC) Datasheet 注意&#xff1a;下文中已经指出手册中的对应页面和章节&#xff0c;请对照手册原文看&#xff0c;任何个人理解错误&…

期货日数据维护与使用_日数据维护_模块整体代码

目录 写在前面 setting.py sqlite_tool.py future_widget.py 写在前面 本文默认已经创建了项目&#xff0c;如果不知道如何创建一个空项目的&#xff0c;请参看以下两篇博文 PyQt5将项目搬到一个新的虚拟环境中 https://blog.csdn.net/m0_37967652/article/details/122…

tcp和udp的区别(附java实现)

TCP和UDP的区别 TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种不同的网络传输协议&#xff0c;它们在数据传输时有一些重要的区别。 TCP TCP是面向连接的协议&#xff0c;它在通信之前需要建立连接&…

InternLM第2节课笔记

轻松玩转书生浦语大模型趣味Demo InternLM模型全链条开源 InternLM-7B和InternLM-20B Lagent&#xff1a;智能体&#xff08;agent&#xff09;框架 浦语灵笔&#xff1a;InternLM-Xcomposer-7B 视觉-语言大模型 模型下载 Hugging Face huggingface-cli OpenXLab python…

【C++】- 类和对象(!!C++类基本概念!this指针详解)

类和对象 引入类类的定义类的访问限定操作符类的作用域类的实例化类对象模型this指针 引入类 在 C中&#xff0c;引入了一个新的定义----------类。类是一种用户自定义的数据类型&#xff0c;用于封装数据和行为。类可以看作是一个模板或蓝图&#xff0c;描述了一组相关的数据和…

第15课 利用openCV实现人脸识别

这节课&#xff0c;我们再来看一个简单且实用的例子&#xff1a;人脸识别。这个小例子可以让你进一步领略openCV的强悍。 1.复制demo14并改名为demo15。 2.修改capImg函数&#xff1a; int fmle::capImg() {// 加载人脸检测分类器cv::CascadeClassifier faceCascade;faceCas…

UEditor在编辑对齐方式时产生额外空行问题

一、问题描述 一个关于UEditor富文本编辑器的问题&#xff1a;在编辑内容对齐方式后保存后浏览器显示的段落上下会比原先多出一些间距。 下面是对齐编辑后&#xff0c;未保存前的的HTML&#xff1a; 保存后&#xff0c;实际会多出一个段落空行&#xff1a; 二、问题调查 经…

基于B/S架构的数字孪生智慧监所可视化监管系统

1 前言 物联网技术的发展使云计算技术得到了迅猛的发展及广泛的应用&#xff0c;智能体系的创建已经成为监狱发展的必然趋势。 智慧监狱的创建、智能化管理的推行是监狱管理的创新&#xff0c;也是监狱整体工作水平提升的具体体现。 1.1 建设背景 近年来&#xff0c;司法部不…

CISSP 第7章:PKI和密码学应用

第七章 PKI和密码学应用 7.1 非对称密码学 对称密码系统具有共享的秘钥系统&#xff0c;从而产生了安全秘钥分发的问题 非对称密码学使用公钥和私钥对&#xff0c;无需支出复杂密码分发系统 7.1.1 公钥与私钥 7.1.2 RSA&#xff08;兼具加密和数字签名&#xff09; RSA算法依赖…

ctrl + v获取图片和文字

1、效果实现 1.1、做法 容器监听paste事件。原生js则document.addEventListener(paste)&#xff0c;vue则paste 监听paste事件的回调函数有个参数e&#xff0c;获取e.clipboardData粘贴的文字信息 e.clipboardData.getData("text/plain")粘贴的图片信息 e.clipboard…

委托QAbstractItemDelegate

参考&#xff1a;QT(7)-初识委托_qt 委托-CSDN博客 一、 1、 模型&#xff1a;负责“组织”数据&#xff1b; 视图&#xff1a;负责“显示”数据&#xff1b; 委托&#xff1a;负责“修改”数据&#xff1b; 2、委托&#xff1a;在QT的MV模型中&#xff0c;处理特定类型的…

c++拷贝控制

文章目录 拷贝构造函数的基本概念定义语法何时使用拷贝构造函数示例代码运行结果注意事项 拷贝赋值运算符的基本概念定义语法何时使用拷贝赋值运算符示例代码运行结果注意事项 析构函数的基本概念定义语法何时调用析构函数示例代码运行结果注意事项 三/五法则三法则 (Rule of T…

【SpringCloud】之配置中心(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之远程消费》。&#x1f3af;&a…

精彩推荐 |【Java技术专题】「重塑技术功底」攻破Java技术盲点之剖析动态代理的实现原理和开发指南(上)

攻破Java技术盲点之剖析动态代理的实现原理和开发指南 背景介绍静态代理和动态代理动态代理与静态代理的区别 进入正题重温&#xff1a;静态代理实现静态代理案例静态代理的弊端 重温&#xff1a;动态代理Java动态代理InvocationHandlerJava动态代理的实现下面看具体的代码实例…

Blazor项目如何调用js文件

以下是来自千问的回答并加以整理&#xff1a;&#xff08;说一句&#xff0c;文心3.5所给的回答不完善&#xff0c;根本运行不起来&#xff0c;4.0等有钱了试试&#xff09; 在Blazor项目中引用JavaScript文件&#xff08;.js&#xff09;以实现与JavaScript的互操作&#xff…

基于JAVA的服装店库存管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

Java 11中的新字符串APIs详解

第1章 引言 大家好&#xff0c;我是小黑&#xff0c;咱们都知道&#xff0c;Java作为一种广泛使用的编程语言&#xff0c;每一次更新都会带来不少新鲜事物。而Java 11&#xff0c;作为长期支持&#xff08;LTS&#xff09;版本之一&#xff0c;更是引起了广大开发者的关注。好…

并发(8)

目录 46.Thread.sleep(),Object.wait(),Condition.await(),LockSupport.part()的区别&#xff1f; 47.如果在wait&#xff08;&#xff09;之前执行了notify&#xff08;&#xff09;会怎样&#xff1f; 48.如果在park()之前执行了unpark()会怎样&#xff1f; 49.什么是AQS&…

九州金榜|孩子厌学,作为父母有想做自己的原因吗?

孩子不会天生就厌学&#xff0c;如果孩子天生厌学&#xff0c;那么孩子就不可能学会说话&#xff0c;走路&#xff0c;日常生活&#xff0c;更不可能去上学&#xff0c;孩子厌学因素非常多&#xff0c;而作为父母&#xff0c;你有没有想过是你的原因造成的呢&#xff1f;九州金…

编程语言的未来,通用代码生成器和超级语言

编程语言的未来&#xff0c;通用代码生成器和超级语言 我们生活在一个编程语言种类繁多&#xff0c;百花齐放的年代。形形色色的编程语言覆盖了软件开发的方方面面。如果说这些变成语言有什么共性的话&#xff0c;大家都知道&#xff0c;大多数编程语言是高级语言。 何为高级…