使用Python和Proxy302代理IP高效采集Bing图片

目录

    • 项目背景
    • 一、项目准备
      • 环境配置
    • 二、爬虫设计与实现
      • 爬虫设计思路
        • 目标网站分析
        • 数据获取流程
      • 代码实现
        • 1. 初始化爬虫类(BingImageSpider)
        • 2. 创建存储文件夹
        • 3. 获取图像链接
        • 4. 下载图片
        • 5. 使用Proxy302代理IP
        • 6. 主运行函数
      • 运行截图
    • 三、总结

项目背景

本篇博客详细介绍了一个网络爬虫项目的准备和实现过程。该项目的目标是从Bing图片搜索中获取图片链接并下载图片。此类爬虫项目通常用于收集大量的图片数据,以便用于训练各种人工智能模型,特别是计算机视觉模型。计算机视觉领域的研究需要大量的图像数据来训练和测试模型,以便实现图像分类、对象检测、图像生成等功能。

一、项目准备

环境配置

在开始编写爬虫之前,确保已经完成以下环境配置:

1.Python安装: 确保已安装Python 3.x版本。Python是一种功能强大且易于学习的编程语言,适合于各种编程任务,包括网络爬虫开发。

2.需要的库: Python拥有庞大的第三方库生态系统,我们将使用几个核心库来开发爬虫:

  • requests: 用于发送HTTP请求和处理响应。
  • os: 提供了与操作系统交互的功能,用于创建文件夹等文件操作。
  • time: 提供了时间相关的功能,例如休眠程序以及计时等。
  • urllib: 提供了在网络上获取数据的一些功能,主要用于URL编码。

可以使用以下命令通过pip安装这些库:

pip install requests

如果你使用的是Anaconda等集成环境,可以使用conda命令:

conda install requests

这些库将帮助我们处理HTTP请求、解析和存储数据,以及进行一些基本的系统操作。

二、爬虫设计与实现

爬虫设计思路

目标网站分析

在设计爬虫之前,分析目标网站是必不可少的。对于Bing图片搜索网站,我们进行如下分析:

  • 网页结构:Bing图片搜索页面的结果通常以HTML的形式呈现,其中包含了多个图片的缩略图。每张图片的缩略图通常通过<img>标签展示,图片的真实链接保存在src属性中。
  • 动态加载:Bing的图片搜索结果可能采用了动态加载的方式。即在页面初始加载时,可能只加载部分图片,更多图片会在用户滚动页面时动态加载。Selenium可以模拟用户行为(如滚动)以加载这些动态内容。
  • 请求限制:Bing图片搜索可能对请求频率或IP地址进行限制。使用代理服务器有助于分散请求负载,避免IP被封禁。
数据获取流程

构建请求URL:根据用户输入的搜索关键词构建Bing图片搜索的URL。URL的格式通常为https://www.bing.com/images/search?q={搜索词},其中{搜索词}是用户的查询内容。
发送GET请求:通过Selenium WebDriver发送GET请求,加载目标网页。由于Bing图片搜索页面可能含有动态内容,Selenium能够处理这些动态加载的内容,确保图片链接完全加载。
解析网页数据:使用Selenium解析网页源代码,提取所有图片缩略图的src属性。通常,缩略图链接可以通过CSS选择器找到,例如使用img.mimg选择器获取图片标签。
下载图片:对于每个提取到的图片链接,使用Requests库发送GET请求以获取图片数据,并将其保存到本地目录。确保在保存时处理任何可能的下载异常,如网络问题或链接无效等。
存储管理:将下载的图片保存到预先创建的目录中,目录结构可按搜索词分类,方便后续管理和使用。

代码实现

以下是代码的主要部分及其功能说明:

1. 初始化爬虫类(BingImageSpider)

在爬虫开发过程中,首先需要定义一个爬虫类以实现图片的爬取功能。我们定义了一个名为BingImageSpider的类,用于处理从Bing图片搜索页面抓取和下载图片的任务。

import requests
import os
import time
from urllib import parseclass BingImageSpider(object):def __init__(self):self.url = 'https://www.bing.com/images/search?q={}&form=HDRSC2&first=1&tsc=ImageBasicHover'self.directory = r"D:\价值一个亿\python-mini-projects\projects\bingimg\{}"self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Accept-Language': 'en-US,en;q=0.9','Referer': 'https://www.bing.com'}
2. 创建存储文件夹

在图片爬取的过程中,为了组织和管理下载的图片,需要创建一个专门的存储文件夹。这个文件夹的名称通常与搜索关键词相关,以便于后续查找和管理。以下是创建存储图片文件夹的代码:

def create_directory(self, name):self.directory = self.directory.format(name)if not os.path.exists(self.directory):os.makedirs(self.directory)
3. 获取图像链接

该方法通过发送HTTP请求获取网页内容,并从Bing图片搜索结果页面获取图片的缩略图链接:

def get_image_link(self, url):list_image_link = []response = requests.get(url, headers=self.header)# 解析网页内容并提取图片链接try:json_data = response.json()for item in json_data['value']:if 'thumbnailUrl' in item:list_image_link.append(item['thumbnailUrl'])except Exception as e:print(f"Error occurred: {e}")return list_image_link

返回一个包含所有提取到的图片缩略图链接的列表,用于后续的图片下载操作。

4. 下载图片

此段代码的主要任务是下载指定的图片并将其保存到本地存储。实现这一功能需要处理网络请求、文件操作以及错误处理等多个方面。下面是该方法的实现代码:

def save_image(self, img_link, filename):try:res = requests.get(img_link, headers=self.header)with open(filename, "wb") as f:f.write(res.content)print("存储路径:" + filename)except requests.RequestException as e:print(f"Error downloading image: {e}")
  • 下载图片:该方法接受两个参数:img_link 和 filename。img_link 是要下载的图片的URL链接,filename 是保存图片的本地文件路径。方法通过HTTP请求下载图片数据,并将其写入到指定的文件中。
  • 文件存储:下载的图片以二进制模式(“wb”)写入到本地文件系统中,确保图片数据被正确保存。
    通过这种方法,可以确保从网络上下载的图片被正确存储在本地,以便于后续的使用和管理。
5. 使用Proxy302代理IP

在网络爬虫中,频繁的请求可能会被目标网站识别为异常流量,导致IP地址被封禁。为降低此风险,可以使用Proxy302等代理IP服务。Proxy302与302.AI是同一个开发团队,302.AI是一个汇集全球顶级品牌的AI超市,按需付费,无月费,全面开放使用各种类型AI。Proxy302跟302.AI的账号余额是通用的。

首先我们来到 proxy302.com 官网注册账号,选择自己所需要的代理ip

在这里插入图片描述

定义一个变量 proxy,包含了你要使用的代理服务器的地址和端口号。在这个例子中,代理服务器的地址是 proxy.proxy302.com,端口号是 2222。

# 配置代理设置
proxy = "proxy.proxy302.com:2222"  # 代理地址:端口

创建一个 Options 对象,这是Selenium提供的一个配置类,用于设置Chrome浏览器的各种选项。

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{proxy}')
  • 通过 add_argument 方法将一个新的命令行参数添加到Chrome浏览器的启动选项中。这行代码添加了 --proxy-server 参数,指定了要使用的代理服务器。
  • http://{proxy} 表示使用 http 协议连接到代理服务器,{proxy} 是上面定义的代理地址和端口。最终,这个参数告诉Chrome浏览器所有的网络请求都要通过这个指定的代理服务器进行。

在这里插入图片描述

在选择代理服务时,可靠性和灵活性是至关重要的考虑因素。Proxy302凭借其全面的代理类型、多样的支持协议,以及灵活的定价模式,成为了众多用户的首选。这些优势不仅确保了高效的数据采集,还为不同场景的应用提供了极大的便利。

最全面代理类型:Proxy302提供市面上最全面的代理类型,满足各种业务需求。

  • 全球240+国家和地区,6500万个住宅IP可供选择。
  • Proxy302支持HTTP、SOCKS5网络协议的代理。
  • Proxy302支持动态、静态代理,代理类型分为【动态按流量扣费】、【动态按IP扣费】、【静态按流量扣费】、【静态按IP扣费】,静态代理还分为住宅IP、数据中心IP。

简洁易用:用户界面简洁而不简单,易用且高效。提供浏览器扩展插件,实现一键设置代理,省去复杂配置步骤。
按需付费,无月付套餐:无需套餐捆绑购买,按需付费,充值即可使用所有类型的代理IP,无阶梯式定价。

使用代理ip 这种方式能够有效地隐藏真实IP地址,从而规避被封禁的风险。

6. 主运行函数

run函数是程序的入口点,负责控制整个爬虫的执行流程。它依次处理用户输入、构建请求URL、提取图片链接、下载图片,并进行适当的延时以防止过于频繁的请求。以下是run函数的具体代码:

def run(self):searchName = input("查询内容:")self.create_directory(searchName)search_url = self.url.format(parse.quote(searchName))image_links = self.get_image_link(search_url)for index, link in enumerate(image_links):self.save_image(link, os.path.join(self.directory, f"{index + 1}.jpg"))time.sleep(1)  # 防止请求过于频繁

通过这些方法,爬虫能够高效地从Bing图片搜索中获取并下载相关图片,实现自动化的图像数据收集。

运行截图

在这里插入图片描述

在这里插入图片描述

三、总结

本文档介绍了如何通过Python实现一个简单的Bing图片爬虫,并解释了各部分代码的功能与逻辑。同时,为了规避频繁请求可能带来的IP封禁风险,我们还介绍了如何在爬虫中使用Proxy302代理IP服务。通过这个项目,大家可以轻松获取大量的图片数据,用于训练计算机视觉模型或其他用途。

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

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

相关文章

VS开发 - 静态编译和动态编译的基础实践与混用

目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件&#xff08;从VS2015起&#xff09; 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库&#xff08;Runtime Library&#xff09;就是WINDOWS系统…

爬虫库是什么?是ip吗

爬虫库通常指的是用于网页爬虫&#xff08;Web Scraping&#xff09;开发的代码库或框架&#xff0c;它不是IP地址。以下是关于爬虫库的详细解释&#xff1a; 爬虫库的定义 爬虫库是一些用于简化网络数据抓取过程的工具和框架&#xff0c;通常提供了一系列函数和类&#xff0…

C++面向对象基础

目录 一.作用域限定符 1.名字空间 2.类内声明&#xff0c;类外定义 二.this指针 1 概念 2.功能 2.1 类内调用成员 2.2 区分重名的成员变量和局部变量 2.3链式调用 三.stastic关键字 1.静态局部变量 2 静态成员变量 3 静态成员函数 4 单例设计模式&#xff08;了解…

WPS在表格中填写材料时,内容过多导致表格不换页,其余内容无法正常显示 以及 内容过多,导致表格换页——解决方法

一、现象 1&#xff0c;内容过多导致表格不换页&#xff0c;其余内容无法正常显示 2&#xff0c;内容过多&#xff0c;导致表格换页 二、解决方法 在表格内右击&#xff0c;选择表格属性 在菜单栏选择行&#xff0c;勾选允许跨页断行&#xff0c;点击确定即可 1&#xff0…

【WRF工具】WRF Domain Wizard第二期:服务器中下载及安装

【WRF工具】WRF Domain Wizard第二期&#xff1a;服务器下载及安装 准备WRF Domain Wizard下载及安装WRF Domain Wizard下载WRF Domain Wizard安装添加环境变量&#xff08;为当前用户永久添加环境变量&#xff09;Java环境安装报错-Exception in thread "main" java…

今年Java回暖了吗

今年回暖了吗 仅结合师兄和同学的情况 BG 大多双非本 少部分211本 985硕 去年十月一之前 基本转正都失败 十月一之前0 offer 只有很少的人拿到美团 今年十月一之前 有HC的基本都转正了&#xff08;美团、字节等&#xff09;&#xff0c;目前没有HC的说也有机会&#xff08;…

STM32F1+HAL库+FreeTOTS学习15——互斥信号量

STM32F1HAL库FreeTOTS学习15——互斥信号量 1. 优先级翻转2. 互斥信号量3. 相关API函数&#xff1b;3.1 互斥信号量创建3.2 获取信号量3.3 释放信号量3.4 删除信号量 4. 操作实验1. 实验内容2. 代码实现3. 运行结果 上期我们介绍了数值信号量。这一期我们来介绍互斥信号量 1. 优…

[Docker学习笔记]利用Dockerfile创建镜像

Dockerfile 指令 指令作用from继承基础镜像maintainer镜像制作者信息(可缺省)run用来执行shell命令expose暴露端口号cmd启动容器默认执行的命令entrypoint启动容器真正执行的命令volume创建挂载点env配置环境变量add复制文件到容器copy复制文件到容器workdir设置容器的工作目录…

QT C++ 自学积累 『非技术文』

QT C 自学积累 『非技术文』 最近一段时间参与了一个 QT 项目的开发&#xff0c;使用的是 C 语法&#xff0c;很遗憾的是我之前从来没有接触过 C &#xff0c;大学没有开过这堂课&#xff0c;也没用自己学习过&#xff0c;所有说上手贼慢&#xff0c;到现在为止其实也不是很清楚…

【IOS】申请开发者账号(公司)

目录 申请开发者账号前提 查询/申请D-U-N-S 编号 申请开发者 官网&#xff1a;Apple Developer (简体中文) 申请开发者账号前提 如果是第一次申请建议注册一个新的apple id作为组织的开发者账号。&#xff08;确保apple id的个人信息是真实的&#xff0c;不能是网名或者是…

Chainlit集成LlamaIndex实现知识库高级检索(组合对象检索)

检索原理 对象组合索引的原理 是利用IndexNode索引节点&#xff0c;将两个不同类型的检索器作为节点对象&#xff0c;使用 SummaryIndex &#xff08;它可以用来构建一个包含多个索引节点的索引结构。这种索引通常用于从多个不同的数据源或索引方法中汇总信息&#xff0c;并能…

golang学习笔记19-面向对象(一):面向对象的引入

注&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点。 这节开始就是面向对象的内容了&#xff0c;为方便复用结构体等类型&#xff0c;本人定义了一个utils包&#xff0c;用于定义这些类型&#xff0c;之后的文章也会用到&#xff0c;希望读者注意…

Java如何将Object转换成指定Class对象

在Java中&#xff0c;将Object转换为指定类型的Class对象实际上是两个不同概念的操作&#xff1a; 将Object实例转换为特定类型的实例&#xff1a;这通常涉及到类型转换&#xff08;如(MyType) myObject&#xff09;或者通过反射机制&#xff08;Class.cast(Object)&#xff0…

后端开发如何提高项目系统的性能

引言 提高后端PHP开发系统的性能可以从多个维度进行&#xff0c;例如通过代码优化、缓存优化、数据库优化、异步处理和消息队列、服务器优化、内容分发网络&#xff08;CDN&#xff09;的应用以及系统安全性的强化。 本文主要介绍如何通过以上方法对系统进行优化&#xff0c;…

删除搜狗拼音输入法,右键菜单打印及pdf操作

删除搜狗拼音输入法流氓右键菜单打印及pdf操作&#xff1a; 1、注册表分别搜以下字段&#xff0c;全部删除&#xff0c;可用Registry Workshop 方便搜索&#xff1a; {7BCE96FA-77AF-4288-9E16-2388A50EC807} {85212cfd-77ed-4add-8e24-a0a39e3dbfc3} {1BB732FA-391B-4648-BC00…

【TabBar嵌套Navigation案例-新特性页面-介绍图片 Objective-C语言】

一、接下来,我们接着来说这个介绍图片啊, 1.看一下我们的示例程序,在这一块儿,有一些介绍图片, 这个飞镖的盘子,全新娱乐场,疯狂什么玩意儿,这些东西呢,实际上,都是我们的素材啊,在素材里边,Guide里边,我们这儿有一个guide1, Open With External Editor,这张图片…

MobaXterm基本使用 -- 服务器状态、批量操作、显示/切换中文字体、修复zsh按键失灵

监控服务器资源 参考网址&#xff1a;https://www.cnblogs.com/144823836yj/p/12126314.html 显示效果 MobaXterm提供有这项功能&#xff0c;在会话窗口底部&#xff0c;显示服务器资源使用情况 如内存、CPU、网速、磁盘使用等&#xff1a; &#xff08;完整窗口&#xff0…

经典sql题(十四)炸裂函数的恢复

下面是一个关于 SELECT 语句的例子&#xff0c;该示例展示了如何使用 CONCAT_WS 和 COLLECT_LIST 函数来处理炸裂之后学生成绩的数据。假设我们有一个名为 test 的表&#xff0c;结构如下&#xff1a; 表结构 test student_idstudent_nameclassscore1AliceClass1901AliceClas…

蓝桥杯—STM32G431RBT6(RTC时钟获取时间和日期)

一、RTC是什么&#xff0c;有什么用&#xff1f; 在 STM32 中&#xff0c;RTC&#xff08;Real-Time Clock&#xff0c;实时时钟&#xff09;主要有以下作用&#xff1a; 时间保持&#xff1a;即使在系统断电情况下&#xff0c;也能持续记录时间。&#xff08;需要纽扣电池供电…

【2.使用VBA自动填充Excel工作表】

目录 前言什么是VBA如何使用Excel中的VBA简单基础入门控制台输出信息定义过程&#xff08;功能&#xff09;定义变量常用的数据类型Set循环For To 我的需求开发过程效果演示文件情况测试填充源文件测试填充目标文件 全部完整的代码sheet1中的代码&#xff0c;对应A公司工作表Us…