Python爬虫实战:根据关键字爬取某度图片批量下载到本地

news2024/11/24 13:30:10

本文主要介绍如何使用Python爬虫根据关键字爬取某度图片批量下载到本地,并且加入代理IP的使用,绕过反爬措施,提高程序的可用性和稳定性。文章包含了代码实现和详细解释,适合于初学者学习。

目录

前言

准备工作

Requests库

BeautifulSoup库

代理IP

实现步骤

1. 发送请求获取HTML文本

2. 解析HTML文本获取图片URL

3. 创建文件夹并下载图片

4. 加入代理IP

完整代码

总结


前言

随着互联网的发展,我们可以方便地通过搜索引擎搜索到各种图片,比如旅游、风景等。但是我们有时需要批量下载这些图片,手动一个个下载太麻烦,这就需要使用爬虫来实现。

在实际的爬虫开发中,我们会面临一些反爬措施,比如IP限制、请求频率限制等。为了绕过这些限制,我们可以使用代理IP来隐藏我们的真实IP地址,降低被封禁的风险。

因此,在本文中,我们将通过Python爬虫实现根据关键字爬取某度图片批量下载到本地,并加入代理IP的使用,绕过反爬措施。

一、准备工作

在开始编写代码之前,我们需要先了解一些必要的知识和工具。

Requests库

Requests是Python中的第三方库,提供了简洁而又直观的HTTP请求API,使得我们可以用Python发送HTTP/1.1请求。它采用Python的标准库模块urllib中的基本方法,但是Requests库可以更加方便地发送HTTP/1.1请求,并且支持更多的HTTP请求方法,比如PUT、DELETE、HEAD、OPTIONS等。Requests库还提供了更便捷的Session类,可以在多次请求之间保持cookies等信息,也更容易使用代理等高级功能。

我们可以使用以下命令安装Requests库:

pip install requests
BeautifulSoup库

BeautifulSoup是Python中的第三方库,提供了一种从HTML或XML文件中提取数据的方法。它可以自动将复杂的HTML文本解析成树形结构,并提供了内置的遍历和搜索方法,简化了解析HTML文本的过程。使用BeautifulSoup库可以方便地提取出网页中指定的标签或属性,并进行相应的处理。

我们可以使用以下命令安装BeautifulSoup库:

pip install beautifulsoup4
代理IP

代理IP就是一种中转服务器,可以使我们的请求通过代理服务器发送出去,隐藏我们的真实IP地址。使用代理IP可以绕过一些反爬措施,防止IP被封禁,提高程序的可用性。

我们可以通过网上一些免费代理IP网站进行获取,包括HTTP和HTTPS两种类型。但是,需要注意代理IP的可用性和稳定性,以免造成不必要的麻烦。

二、实现步骤

1. 发送请求获取HTML文本

我们需要先发送请求获取HTML文本,这里我们以某度图片搜索页为例。首先使用requests库中的get方法发送请求,并将得到的内容保存在content变量中。

import requests

url = "https://image.baidu.com/search/index?tn=baiduimage&word=美景"
response = requests.get(url)
content = response.content
2. 解析HTML文本获取图片URL

接下来使用BeautifulSoup库解析HTML文本,获取所有的img标签,并从中提取出图片URL。这里我们只提取了data-src属性中的图片URL,并将它们保存在一个列表中。

from bs4 import BeautifulSoup

soup = BeautifulSoup(content, 'html.parser')
img_tags = soup.find_all('img')

img_urls = []
for tag in img_tags:
    img_url = tag.get('data-src')
    if img_url:
        img_urls.append(img_url)

需要注意的是,由于图片URL可能存在于data-src属性中而不是src属性中,因此我们需要判断是否存在data-src属性。有些图片也可能没有data-src属性,我们需要根据实际情况进行修改。

3. 创建文件夹并下载图片

在获取了所有的图片URL之后,我们需要将它们批量下载到本地。这里我们创建一个名为images的文件夹,将下载的图片保存在其中。

import os

save_dir = "./images"
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

接下来使用requests库的get方法请求每个图片URL,并将得到的内容保存为二进制文件。我们将下载的文件命名为0.jpg、1.jpg、2.jpg...,并依次保存在images文件夹中。

for i, img_url in enumerate(img_urls):
    response = requests.get(img_url)

    with open(os.path.join(save_dir, f"{i}.jpg"), "wb") as f:
        f.write(response.content)

需要注意的是,如果直接将图片URL作为文件名,可能会因为包含了一些特殊字符而导致文件保存失败。因此我们采用了使用数字依次命名的方法,可以避免这个问题。

4. 加入代理IP

在使用代理IP之前,我们需要先获取一些可用的代理IP地址。这里我们使用一个名为proxies的列表,将多个代理IP地址和对应的端口号保存在其中。

proxies = [
    "http://ip_address1:port",
    "http://ip_address2:port",
    "http://ip_address3:port",
    ...
]

接下来,我们使用requests库的proxies参数来设置代理IP进行请求。我们随机选择一个可用的代理IP进行请求,避免了被封禁的风险。

import random

proxy = {
    "http": "http://" + proxies[random.randint(0, len(proxies) - 1)]
}
response = requests.get(img_url, proxies=proxy)

需要注意的是,每个代理IP的格式为http://ip_address:port或者https://ip_address:port,这里我们选择了使用http协议的代理IP。另外,如果我们需要使用https协议的代理IP,只需要将http替换成https即可。

三、完整代码

下面是完整的代码实现,包括代理IP的使用:

import requests
import os
import random

url = "https://image.baidu.com/search/index?tn=baiduimage&word=美景"

proxies = [
    "http://ip_address1:port",
    "http://ip_address2:port",
    "http://ip_address3:port",
    ...
]

response = requests.get(url)
content = response.content

# 使用BeautifulSoup库解析HTML
from bs4 import BeautifulSoup

soup = BeautifulSoup(content, 'html.parser')
img_tags = soup.find_all('img')

img_urls = []
for tag in img_tags:
    img_url = tag.get('data-src')
    if img_url:
        img_urls.append(img_url)

# 创建文件夹,存储下载的图片
save_dir = "./images"
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 使用代理IP进行请求
for i, img_url in enumerate(img_urls):
    proxy = {
        "http": "http://" + proxies[random.randint(0, len(proxies) - 1)]
    }
    response = requests.get(img_url, proxies=proxy)

    with open(os.path.join(save_dir, f"{i}.jpg"), "wb") as f:
        f.write(response.content)

四、总结

本文介绍了如何使用Python爬虫根据关键字爬取某度图片批量下载到本地,并加入代理IP的使用,绕过反爬措施。需要注意的是,代理IP的可用性和稳定性对程序效果有着很大的影响,我们需要仔细选择和测试代理IP,以提高程序的可用性和稳定性。

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

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

相关文章

微信小程序,动态设置三级联动, 省市区街道

1.第一步 传parentId0 查询省份 2.第二步 选择省份,传pathId选择省份的pathId, 不传parentId,会查询出 市/县数据 3.第三步 根据选择县的parentId 查询街道数据,传parentId选择的县id 4.选择结果回显 显示所选择的 path 以/分割 取最后一级<van-dropdown-menu…

零基础教程:Yolov5模型改进-添加13种注意力机制

1.准备工作 先给出13种注意力机制的下载地址&#xff1a; https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例&#xff08;不需要接收通道数的注意力机制&#xff09; 1.在models文件下新建py文件&#xff0c;取名叫Sim…

数据链路层协议

文章目录 数据链路层协议0. 数据链路层解决的问题1. 以太网协议(1) 认识以太网(2) 以太网帧格式<1> 两个核心问题 (3) 认识MAC地址(4) 局域网通信原理(5) MTU<1> 认识MTU<2> MTU对IP协议的影响<3> MTU对UDP协议的影响<4> MTU对TCP协议的影响<…

R语言中更改R包安装路径

看到这些包下载到我的C盘&#xff0c;我蛮不爽的&#xff1a; 所以决定毫不犹豫的改到D盘&#xff1a; 首先&#xff0c;我们需要在RStudio中新建一个初始启动文件&#xff1a; file.edit(~/.Rprofile) 然后去你喜欢的环境新建一个文件夹存放安装的包的位置&#xff0c;我喜欢…

第三章 图标辅助元素的定制

第三章 图标辅助元素的定制 1.认识图表常用的辅助元素 ​ 图表的辅助元素是指除了根据数据绘制的图形之外的元素&#xff0c;常用的辅助元素包括坐标轴、标题、图例、网格、参考线、参考区域、注释文本和表格&#xff0c;它们都可以对图形进行补充说明。 ​ 上图中图表常用辅…

混合Rollup:探秘 Metis、Fraxchain、Aztec、Miden和Ola

1. 引言 混合Rollup为新的以太坊L2扩容方案&#xff0c;其分为2大类&#xff1a; 将乐观与ZK技术结合的混合Rollup同时支持公开智能合约 和 私人智能合约 的混合Rollup 本文将重点关注Metis、Fraxchain、Aztec、Miden和Ola这五大项目。 2. 何为混合Rollup&#xff1f; 混合…

VMware Aria 曝光“关键”身份验证漏洞,6.x 版本均受影响

导读近日消息&#xff0c;VMware Aria Operations for Networks 近日曝光了一个高危的身份验证漏洞&#xff0c;远程攻击者可以绕过 SSH 身份认证&#xff0c;访问专用终端。 VMware Aria 是一款用于管理和监控虚拟化环境和混合云的套件&#xff0c;支持 IT 自动化、日志管理、…

ROS2 从头开始:第 7/8回 - 使用 QoS 配置在 ROS 2 中实现可靠通信

一、说明 在机器人操作系统 (ROS) 2 系统中,服务质量 (QoS) 用于指定各种策略,这些策略确定如何通过 ROS 2 主题或服务传输和接收消息。QoS 策略允许您优化 ROS 2 系统中节点之间通信的性能和可靠性。这些设置可用于调整 DDS 系统的性能和行为,以满足应用程序的特定需求…

Ubuntu 安装Nacos

1、官网下载最新版nacos https://github.com/alibaba/nacos/releases 本人环境JDK8&#xff0c;Maven3.6.3&#xff0c;启动Nacos2.2.1启动失败&#xff0c;故切换到2.1.0启动成功 2、放到服务器目录下&#xff0c;我的在/home/xxx/apps下 3、解压 $ tar -zxvf nacos-serve…

人机逻辑中的家族相似性与非家族相似性

维特根斯坦的家族相似性理论是他在《哲学研究》中提出的一个重要概念。他认为&#xff0c;语言游戏是一种人们使用语言的方式&#xff0c;不同的语言游戏之间可能存在相似性&#xff0c;就像一个家族的成员之间存在相似性一样。维特根斯坦认为&#xff0c;相似性不是通过一个共…

Linux基本操作符(1)

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 Linux的登录 Linux下基本指令 指令操作的理解 几个与用户操作符 ls 指令 pwd命令 cd 指令 touch指令 mkdir指令 rmdir指令 && rm 指令 什么叫操作系统&#xff0c;我相信如果是学计算机的都听说过&…

Stm32_标准库_TIM中断_PWM波形_呼吸灯

基本原理 PWM相关物理量的求法 呼吸灯代码 #include "stm32f10x.h" // Device header #include "Delay.h"TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructuer;//结构体 GPIO_InitTypeDef GPIO_InitStructur…

LeetCode每日一题:1993. 树上的操作(2023.9.23 C++)

目录 1993. 树上的操作 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟 dfs 原理思路&#xff1a; 1993. 树上的操作 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 p…

buildroot移植Qt5无法显示字体问题

报错&#xff1a;QFontDatabase: Cannot find font directory /usr/lib/fonts. Note that Qt no longer ships fonts. Deploy some (from DejaVu Fonts for example) or switch to fontconfig. 原因&#xff1a;很明显是Qt没有找到字库文件&#xff1b; 解决方法&#xff1a; 1…

排查内存泄露

1 通过Performance确认是否存在内存泄露 一个存在内存泄露的 DEMO 代码&#xff1a; App.vue <template><div><button click"myFn" style"width: 200px; height: 200px;"></button><home v-if"ishow"></hom…

VUE使用DXFParser组件解析dxf文件生成图片

<template><div><input type"file" change"handleFileChange" /></div><el-table :data"tableData" style"width: 100%"><el-table-column prop"Control_No" label"序号" width…

图像处理与计算机视觉--第四章-图像滤波与增强-第一部分

目录 1.灰度图亮度调整 2.图像模板匹配 3.图像裁剪处理 4.图像旋转处理 5.图像邻域与数据块处理 学习计算机视觉方向的几条经验: 1.学习计算机视觉一定不能操之过急&#xff0c;不然往往事倍功半&#xff01; 2.静下心来&#xff0c;理解每一个函数/算法的过程和精髓&…

C语言入门Day_25 函数与指针小结

目录 前言&#xff1a; 1.函数 2.指针 3.易错点 4.思维导图 前言&#xff1a; 函数就像一个“有魔法的加工盒”&#xff0c;你从入口丢一些原材料进去&#xff0c;它就能加工出一个成品。不同的函数能加工出不同的成品。 入口丢进去的瓶子&#xff0c;水和标签就是输入&a…

win使用git(保姆级教程)

序言 上学期间用的git并不多&#xff0c;但是从研三实习以及后面工作来看&#xff0c;git是一项必备技能&#xff0c;所以在此来学习一下。 下载git安装包 打开网站&#xff0c;根据需求来下载&#xff1b;一般按照如下方式进行下载&#xff1a; 然后安装的时候记得按下图勾…

NebulaGraph实战:3-信息抽取构建知识图谱

自动信息抽取发展了几十年&#xff0c;虽然模型很多&#xff0c;但是泛化能力很难用满意来形容&#xff0c;直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核&#xff0c;但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练&am…