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

news/2024/7/19 8:46:37 标签: python, 爬虫, 开发语言, tcp/ip, 网络

本文主要介绍如何使用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库:

python">pip install requests
BeautifulSoup库

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

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

python">pip install beautifulsoup4
代理IP

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

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

二、实现步骤

1. 发送请求获取HTML文本

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

python">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,并将它们保存在一个列表中。

python">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的文件夹,将下载的图片保存在其中。

python">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文件夹中。

python">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地址和对应的端口号保存在其中。

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

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

python">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的使用:

python">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.niftyadmin.cn/n/5052461.html

相关文章

进程管理--CFS调度器(2)

CFS调度流程分析 主要以CFS调度器为例,介绍一下进程调度的一般流程。首先是调度的时机,基本调度器会根据TIF_NEED_RESHED标记判断是否需要进行调度,所以这个标记的设置就是调度的开始。有以下几种情况都会设置这个标记。例如周期性调度会触发…

2023年第二届HiPChips解读

The 2nd International Workshop on High Performance Chiplet and Interconnnect Architectures (HiPChips) 主题 Optical and other advanced chiplet interconnect technologiesInterconnect standards of coherent and non-coherent data sharing protocols (e.g. CXL)D…

一、flex布局与float布局

1、float布局 2、flex布局

通过身份分析降低访问风险

网络威胁正在超出可见范围,随着公司在云采用方面变得越来越复杂,攻击者的创新也越来越复杂,从安全的角度来看,以下是组织最令人不安的两个事实:缺乏威胁的可见性和网络犯罪技术的快速发展。 一方面,当今的…

未来会是一个编程普及的时代吗?

在该领域工作了几年的开发人员已经看到了几种编程语言和工具的兴衰。软件开发是一个动态的领域,工作需求在不断变化,因此密切关注可能有助于这一过程的未来趋势和技术是关键。 以下是对10年后编程的五个预测。 1.编程会更抽象 哈蒙德预测,我…

提取PDF数据:Documents for PDF ( GcPdf )

在当今数据驱动的世界中,从 PDF 文档中无缝提取结构化表格数据已成为开发人员的一项关键任务。借助GrapeCity Documents for PDF ( GcPdf ),您可以使用 C# 以编程方式轻松解锁这些 PDF 中隐藏的信息宝藏。 考虑一下 PDF(最常用的文档格式之一…

Field-Based DI in Spring

Field-Based DI For Field-Based DI, we can inject the dependencies by marking them with an Autowired annotation。 If there’s no constructor or setter method to inject the dependencies, the container will use reflection to inject dependencies. # Field-Bas…

算法系列-链表操作总结

我们做了单链表反转、求链表中间节点、删除链表第n个节点、链表中环的检测、判断回文链表5个练习,并且这5个练习都是针对单链表的; 在操作链表的过程中有哪些需要注意的地方呢? 我们可以声明一个哑结点,可以避免多余的判断&…