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

本文主要介绍如何使用Python爬虫根据关键字爬取某度图片批量下载到本地,并且加入代理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变量中。

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,以提高程序的可用性和稳定性。

相关推荐
Estar.Lee14 分钟前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
drebander36 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
友友马1 小时前
『 Linux 』网络层 - IP协议(一)
linux·网络·tcp/ip
威威猫的栗子1 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
墨染风华不染尘2 小时前
python之开发笔记
开发语言·笔记·python
Dxy12393102162 小时前
python bmp图片转jpg
python
麦麦大数据2 小时前
Python棉花病虫害图谱系统CNN识别+AI问答知识neo4j vue+flask深度学习神经网络可视化
人工智能·python·深度学习
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
LKID体2 小时前
Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三)
开发语言·python·neo4j
小屁孩大帅-杨一凡2 小时前
Python-flet实现个人视频播放器
开发语言·python·音视频