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


    本文主要介绍如何使用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变量中。

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

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

    1. from bs4 import BeautifulSoup
    2. soup = BeautifulSoup(content, 'html.parser')
    3. img_tags = soup.find_all('img')
    4. img_urls = []
    5. for tag in img_tags:
    6.     img_url = tag.get('data-src')
    7.     if img_url:
    8.         img_urls.append(img_url)

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

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

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

    1. import os
    2. save_dir = "./images"
    3. if not os.path.exists(save_dir):
    4.     os.makedirs(save_dir)

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

    1. for i, img_url in enumerate(img_urls):
    2.     response = requests.get(img_url)
    3.     with open(os.path.join(save_dir, f"{i}.jpg"), "wb") as f:
    4.         f.write(response.content)

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

    4. 加入代理IP

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

    1. proxies = [
    2.     "http://ip_address1:port",
    3.     "http://ip_address2:port",
    4.     "http://ip_address3:port",
    5.     ...
    6. ]

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

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

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

    三、完整代码

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

    1. import requests
    2. import os
    3. import random
    4. url = "https://image.baidu.com/search/index?tn=baiduimage&word=美景"
    5. proxies = [
    6.     "http://ip_address1:port",
    7.     "http://ip_address2:port",
    8.     "http://ip_address3:port",
    9.     ...
    10. ]
    11. response = requests.get(url)
    12. content = response.content
    13. # 使用BeautifulSoup库解析HTML
    14. from bs4 import BeautifulSoup
    15. soup = BeautifulSoup(content, 'html.parser')
    16. img_tags = soup.find_all('img')
    17. img_urls = []
    18. for tag in img_tags:
    19.     img_url = tag.get('data-src')
    20.     if img_url:
    21.         img_urls.append(img_url)
    22. # 创建文件夹,存储下载的图片
    23. save_dir = "./images"
    24. if not os.path.exists(save_dir):
    25.     os.makedirs(save_dir)
    26. # 使用代理IP进行请求
    27. for i, img_url in enumerate(img_urls):
    28.     proxy = {
    29.         "http": "http://" + proxies[random.randint(0, len(proxies) - 1)]
    30.     }
    31.     response = requests.get(img_url, proxies=proxy)
    32.     with open(os.path.join(save_dir, f"{i}.jpg"), "wb") as f:
    33.         f.write(response.content)

    四、总结

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

  • 相关阅读:
    uniapp 微信对接地图的三种操作
    科研工具分享-SCI写作课
    MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(3)-系统数据集合设计
    Java项目:SSM校园帮跑腿管理平台
    MySQL查询语法
    Android 10.0 系统framework去掉截图功能
    C# 语言在AGI 赛道上能做什么
    MYSQL函数,一篇文章看完!
    python使用mitmproxy和mitmdump抓包在手机上抓包(三)
    ASO优化关键词篇—关键词到底要不要反复出现
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/133271031