Python爬虫案例-爬取主题图片(可以选择自己喜欢的主题)

news2024/11/13 18:52:13

在这里插入图片描述

2024年了,你需要网络资源不能还自己再慢慢找吧?
跟着博主一块学习如何利用爬虫获取资源,从茫茫大海中寻找那个她到再妹子群中找妹子,闭着眼睛都可以找到合适的那种。文章有完整示例代码,拿过来就可以用,欢迎实践尝试。

-
˃̣̣̣̣˂
˗ˏˋˎ˗

1.案例简介

本次案例主要针对网络图片下载,使用网络爬虫技术抓取百度图片,能够根据指定的关键字搜索相关主题的图片,然后把图片下载到本地指定的文件夹中。本次讲解内容主题是python,大家实践可以换成自己喜欢的主题。

2.设计思路

目标:通过百度图片引擎入口,抓取指定主题的图片,然后把抓取的图片保存到本地文件夹中。

设计爬虫,首先需要把握抓取对象(URL)的规律。分析网页源代码和网页结构,配合F12键查看网页源代码。这一步是抓取成功的关键。

接着,借助HTTP第三方库,获取HTML源代码;使用正则表达式、XPath表达式等技术,解析其结构,根据一定的逻辑分解其中的图片URL。

最后,把网上URL图片保存到本地,完成本例操作。

3.关键技术

把网上图片下载到本地。可以使用request.urlretrieveO函数;也可以使用Python的文件操作函数write()写入文件。

爬取指定网页中的图片。首先用urllib库来模拟浏览器访问网站的页的源代码(htinl标签)。其中,源代码以字符串的形式返回;然后用正则表达式re库在字符串(网页源代码)中匹配表示图片链接的子字符串,返 回一个列表;最后循环列表,根据图片链接将图片保存到本地。

也可以使用BeautifulSoup抓取图片。BeautifulSoup是一个Python处理HTML/XML的函数库,是Python内置的网页分析工具,用来快速地转换被抓取的网页。它产生一个转换后DOM树,尽可能和原文档内容的含义一致,这种措施通常能够满足用户搜集数据的需求。BeautifulSoup提供了一些简单的方法以及类Python语法来查找、定位、修改一棵转换后DOM树。BeautifulSoup自动将送进来的文档转换为Unicode编码,而且在输出的时候转换为UTF-8

使用requests请求URL和读取网页源代码。requests库和urllib库的作用相似且使用方法基木一致,都是根据HTTP协议操作各种消息和页而,但使用requests库比使用urllib库更简单些。

4.设计过程

第1步,先研究百度图片的入口规律。

进入百度图片(https://image.baidu.com/ ),输入某个关键字(如python),然后单击“百度一下”按钮搜索,可见如下网址:

https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=python&oq=python&rsp=-1

在这里插入图片描述

其中,word=python查询字符串表示搜索的主题。所看见的页面是瀑布流版木,当向下滑动的时候可以不停刷新,这是一种动态的网页。需要按F12键,通过Network下的XHR分析网页的结构。
在这里插入图片描述

第2步,找到源代码规律之后,就可以动手编写Python代码了。
在这里插入图片描述

5.示例结果

在这里插入图片描述
在这里插入图片描述

6.示例源码

# test1.py  运行程序之前,需要现在当前目录下创建pictures文件夹。
# 导入库
import requests 
import os.path
import  re
# 设置默认配置
MaxSearchPage = 20 # 收索页数
CurrentPage = 0 # 当前正在搜索的页数
DefaultPath = "pictures" # 默认储存位置
NeedSave = 0 # 是否需要储存
# 图片链接正则和下一页的链接正则
def imageFiler(content): # 通过正则获取当前页面的图片地址数组
    return re.findall('"objURL":"(.*?)"',content,re.S)
def nextSource(content): # 通过正则获取下一页的网址
    next = re.findall('<div id="page">.*<a href="(.*?)" class="n">',content,re.S)[0]
    print("---------" + "http://image.baidu.com" + next) 
    return next
# 爬虫主体
def spidler(source):
    content = requests.get(source).text  # 通过链接获取内容
    imageArr = imageFiler(content) # 获取图片数组
    global CurrentPage
    print("当前页: " + str(CurrentPage) )
    for imageUrl in imageArr:
        print(imageUrl)
        global  NeedSave
        if NeedSave:  			# 如果需要保存图片则下载图片,否则不下载图片
            global DefaultPath
            try:
                # 下载图片并设置超时时间,如果图片地址错误就不继续等待了
                picture = requests.get(imageUrl,timeout=10) 
            except:                
                print("下载错误! errorUrl:" + imageUrl)   
                continue
            # 创建图片保存的路径
            # imageUrl = imageUrl.replace('/','').replace(':','').replace('?','')
            imageUrl1 = os.path.basename(imageUrl)
            basepath = os.getcwd()
            print( imageUrl1 )
            pictureSavePath = basepath + "/" + DefaultPath + imageUrl1
            pictureSavePath = pictureSavePath.split("?")[0]
            print(pictureSavePath)
            fp = open(pictureSavePath,'wb') # 以写入二进制的方式打开文件
            fp.write(picture.content)
            fp.close()
    global MaxSearchPage
    if CurrentPage <= MaxSearchPage:    # 继续下一页爬取
        if nextSource(content):
            CurrentPage += 1 
            # 爬取完毕后通过下一页地址继续爬取
            spidler("http://image.baidu.com" + nextSource(content)) 
#爬虫的开启方法
def  beginSearch(page=1,save=0,savePath="pictures/"): 
    # (page:爬取页数,save:是否储存,savePath:默认储存路径)
    global MaxSearchPage,NeedSave,DefaultPath
    MaxSearchPage = page
    NeedSave = save					# 是否保存,值0不保存,1保存
    DefaultPath = savePath				# 图片保存的位置
    key = input("请输入关键词: ") 
    StartSource = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=" + str(key) + "&ct=201326592&v=flip" # 分析链接可以得到,替换其`word`值后面的数据来搜索关键词
    spidler(StartSource)
#调用开启的方法就可以通过关键词搜索图片了
beginSearch(page=5,save=1)			# page=5是下载前5页,save=1保存图片

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

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

相关文章

就业班 第二阶段 2401--3.18 day1 初识mysql

初识&#xff1a; 1、关系型数据库mysql、mariadb、sqlite 二维关系模型 2、非关系型数据库 redis、memcached sql 四个部分 DDL 数据库定义语言 创建数据库&#xff0c;创建用户&#xff0c;创建表 DML 数据库操作语言 增删改 DQL 数据库查询语言 查 DCL 数据库控制语言 授权 …

Pake一键打包,轻松构建桌面级应用!

Pake&#xff1a;顷刻之间&#xff0c;智能封装——WEB到桌面瞬间联通&#xff0c;让网站应用像搭积木般部署 - 精选真开源&#xff0c;释放新价值。 概览 Pake&#xff0c;作为一款新颖且极具创新性的桌面应用开发框架&#xff0c;凭借其独特的技术路径和高效的实现方式&…

时代教育期刊投稿发表

《时代教育》是由成都传媒集团主管主办&#xff0c;中华人民共和国新闻出版总署批准国内公开出版发行的专业教育类期刊&#xff0c;主要刊登各类高等院校、职业技术学校、中小学教师及研究生、教育科研工作者的教育实践研究成果&#xff1b;教育教学行业的最新动态&#xff1b;…

基于SSM+Jsp+Mysql的KTV点歌系统

基于SSMJspMysql的KTV点歌系统 基于SSMJspMysql的KTV点歌系统的设计与实现 开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工…

jvm提供的远程调试 简单使用

JVM自带远程调试功能 JVM远程调试&#xff0c;其实是两个虚拟机之间&#xff0c;通过socket通信&#xff0c;达到远程调试的目的&#xff1b; 前提 确保本地和远程的网络是开通的&#xff1b; 本地操作 远程操作 在启动命令参数中 把上面的内容复制进去

第 6 章 ROS-URDF练习(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.3.4 URDF练习 需求描述: 创建一个四轮圆柱状机器人模型&#xff0c;机器人参数如下&#xff0c;底盘为圆柱…

NIVision-相机图像采集

应用场景 上位机与工业相机通讯&#xff0c;控制相机抓取图像。 工业相机的通讯接口大多为USB口或网口。 USB口则直接将通讯线缆插入上位机USB端口&#xff0c;打开MAX中设备与接口一栏可以看到电脑给相机分配的资源名称&#xff1b;网口则需要将网线连接相机和上位机&#xf…

【数据库】SQL Server 2008 R2 安装过程

启动安装程序&#xff0c;点击setup&#xff0c;进入【SQLServer安装中心】 点击界面左侧的【安装】&#xff0c;然后点击右侧的【全新SQLServer独立安装或向现有安装添加功能】&#xff0c;进入【SQLServer2008R2安装程序】界面&#xff0c;如下图所示&#xff1a; 进入【安装…

浅谈Postman与Jmeter的区别、用法

前阶段做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人…

师徒互电,眼冒金星,采集系统变电刺激系统!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;很高兴分享我的原创文章&#xff0c;喜欢和支持我的工程师&#xff0c;一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流 电的我眼冒金星&#xff0c;以为自己被三体召唤&#xff0c;整个世界为我…

预测一下,GPT-5 会在什么时候发布,又会有哪些更新?

发布预期&#xff1a;GPT-5预计将于11月发布&#xff0c;可能与ChatGPT发布两周年同期。竞争态势&#xff1a;谷歌的Gemini与GPT-4 turbo已展开竞争。逐步发布&#xff1a;GPT-5可能通过模型训练过程中的中间检查点逐步发布。训练与安全测试&#xff1a;实际训练可能需3个月&am…

【Java前端技术栈】Vue2、Vue Cli、Axio入门

一、基本介绍 1.Vue 是什么? Vue (读音 /vjuː/&#xff0c;类似于 view) 是一个前端框架, 易于构建用户界面 2. Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或项目整合 3. 支持和其它类库结合使用 4. 开发复杂的单页应用非常方便 5.…

【隐私计算实训营003详解隐私计算框架及技术要点】

1. 隐语架构一览 1.1 隐语架构 隐语架构通常指的是一种面向隐私保护计算的软件框架或解决方案&#xff0c;它采用了密码学、可信执行环境&#xff08;TEE&#xff09;、多方安全计算&#xff08;MPC&#xff09;等多种隐私保护技术来实现在数据加密状态下进行计算&#xff0c;…

咖啡饮品抖音品牌打造流量运营规划方案PPT

【干货资料持续更新&#xff0c;以防走丢】 咖啡饮品抖音品牌打造流量运营规划方案PPT 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑共50页&#xff08;完整资料包含以下内容&#xff09; 目录 抖音品牌打造方案 社交话题引领&#xff0c;内容共创…

一、SpringBoot3 介绍

本章概要 SpringBoot3 简介系统要求快速入门入门总结 1.1 SpringBoot3 简介 此处使用 SpringBoot 版本&#xff1a;3.0.5 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html 无论使用XML、注解、Java配置类还是他们的混合用法&#xff0…

unity3d——沙盒路径

文章目录 Unity3D中不同平台的沙盒路径&#xff1a; 示例 在Unity3D中&#xff0c;尤其是在移动平台如Android和iOS上&#xff0c;由于系统安全机制&#xff0c;应用程序不能直接访问操作系统的所有文件和目录&#xff0c;而是被限制在一个特定的“沙盒”环境中。这个沙盒是一个…

elementUI Tree 树形控件单选实现

文章目录 展示效果代码实现elementui Tree树形控件其他详细数据 在Element UI中&#xff0c;树形控件&#xff08;el-tree&#xff09;本身不支持单选功能。但是&#xff0c;你可以通过监听节点点击事件并手动更新选中状态来实现单选树。 以下是一个简单的例子&#xff0c;展示…

docker入门(八)—— dockerfile详细介绍,编写dockerfile

dockerfile&#xff08;重点&#xff09; 大家想想&#xff0c;Nginx&#xff0c;tomcat&#xff0c;mysql 这些镜像都是哪里来的&#xff1f;官方能写&#xff0c;我们不能写吗&#xff1f; 我们要研究自己如何做一个镜像&#xff0c;而且我们写的微服务项目打包上云部署&am…

开关电源测试项目大解密:如何成为合格的开关电源

开关电源作为重要的电源供应器&#xff0c;在其研发生产过程中对质量的把控是非常严格的。为了保证开关电源的质量和性能&#xff0c;开关电源测试贯穿研发、生产的始终。那么一个合格的开关电源需要经过哪些测试呢&#xff1f; 一、常规功能测试 1. 过压保护 2. 短路保护 3. 过…

Qt教程 — 3.7 深入了解Qt 控件: Layouts部件

目录 2 如何使用Layouts部件 2.1 QBoxLayout组件-垂直或水平布局 2.2 QGridLayout组件-网格布局 2.3 QFormLayout组件-表单布局 在Qt中&#xff0c;布局管理器&#xff08;Layouts&#xff09;是用来管理窗口中控件位置和大小的重要工具。布局管理器可以确保窗口中的控件在…