本文主要介绍如何使用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变量中。
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,以提高程序的可用性和稳定性。