【Python爬虫五十个小案例】Python提取某斗颜值主播图片~

请添加图片描述

博客主页:小馒头学python

本文专栏: Python爬虫五十个小案例

专栏简介:分享五十个Python爬虫小案例

在这里插入图片描述

前言

在这个博客中,我们将详细讲解如何通过 Python 编写一个爬虫来从斗鱼平台抓取美女主播的图片。随着爬虫技术的普及,抓取互联网上的公开数据变得越来越容易,而斗鱼作为一个主流的直播平台,提供了丰富的直播内容和主播的相关信息。在这里,我们通过实例来展示如何抓取斗鱼页面上的图片,并将其保存到本地。

项目准备

安装必要的库

在开始编写爬虫之前,我们需要安装一些常用的 Python 库。通过以下命令来安装所需库:

import gevent
import json
import logging
from urllib import request
from gevent import monkey

rquests:用于发送 HTTP 请求,获取网页内容。
beautifulsoup4:用于解析 HTML 页面,提取其中的图片信息。
os:用于操作文件系统,创建文件夹和保存图片。

设置开发环境

你可以选择使用本地的 Python 环境,也可以使用虚拟环境来管理依赖。推荐使用虚拟环境以避免与其他项目的依赖冲突:

python -m venv douyin_env
source douyin_env/bin/activate  # 在 macOS/Linux 上
douyin_env\Scripts\activate  # 在 Windows 上

爬虫原理介绍

网络爬虫概述

网络爬虫是通过模拟浏览器行为,从互联网中自动下载网页内容的程序。它能够高效地抓取网站上的数据,通常用于数据挖掘、信息收集等用途。

HTTP 请求与响应

网络爬虫与服务器的交互是通过 HTTP 协议完成的。通过发送 HTTP 请求,我们获取到服务器返回的 HTML 页面内容。在爬取斗鱼页面时,我们使用 requests 库来发起 HTTP 请求。

HTML 解析

HTML(超文本标记语言)是网页内容的基础格式。我们通过解析 HTML 文档,提取需要的信息。通常使用 BeautifulSoup 库来解析 HTML,并从中提取图片链接、文本等数据。

编写爬虫

获取网页内容

首先,我们需要获取斗鱼页面的 HTML 内容。在这个示例中,我们爬取一个美女主播的列表页面。我们将发送 GET 请求并获取返回的网页内容。

解析网页获取图片链接

获取到 HTML 内容后,我们需要使用 BeautifulSoup 对其进行解析,找出其中的图片标签 并提取其 src 属性,即图片的 URL。

下载并保存图片

通过提取到的图片链接,我们使用 requests.get() 获取图片的二进制数据,并将其保存到本地文件夹。

代码实现

下面是案例的示例

请求网页并设置日志

HEADER = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

monkey.patch_all()
}

# 获取网页内容
def get_page_content(url):
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        print(f"Failed to retrieve page: {url}")
        return None

解析 HTML 并提取图片 URL

def fetch_image_urls():
    try:
        req = request.Request("https://www.douyu.com/gapi/rknc/directory/yzRec/1", headers=HEADER)
        json_obj = json.loads(request.urlopen(req).read().decode("utf-8"))
        return [src["rs16"] for src in json_obj["data"]["rl"]]
    except Exception as e:
        logging.error(f"获取图片URL失败:{e}")
        return []

下载图片并保存

def download(img_src):
    try:
        img_src = img_src.replace("/dy1", "")
        file_name = img_src.split("/")[-1]
        response = request.urlopen(request.Request(img_src, headers=HEADER))
        with open(ROOT + file_name, "wb") as f:
            f.write(response.read())
        logging.info(f"{file_name} 下载完成!")
    except Exception as e:
        logging.error(f"下载 {img_src} 失败:{e}")

主函数

if __name__ == '__main__':
    image_urls = fetch_image_urls()
    if not image_urls:
        logging.error("没有获取到图片URL,程序将退出。")
    else:
        tasks = [gevent.spawn(download, src) for src in image_urls]
        gevent.joinall(tasks)

完整源码

import gevent
import json
import logging
from urllib import request
from gevent import monkey

# 配置参数
ROOT = "./douyu_images/"
HEADER = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

monkey.patch_all()

def download(img_src):
    try:
        img_src = img_src.replace("/dy1", "")
        file_name = img_src.split("/")[-1]
        response = request.urlopen(request.Request(img_src, headers=HEADER))
        with open(ROOT + file_name, "wb") as f:
            f.write(response.read())
        logging.info(f"{file_name} 下载完成!")
    except Exception as e:
        logging.error(f"下载 {img_src} 失败:{e}")

def fetch_image_urls():
    try:
        req = request.Request("https://www.douyu.com/gapi/rknc/directory/yzRec/1", headers=HEADER)
        json_obj = json.loads(request.urlopen(req).read().decode("utf-8"))
        return [src["rs16"] for src in json_obj["data"]["rl"]]
    except Exception as e:
        logging.error(f"获取图片URL失败:{e}")
        return []

if __name__ == '__main__':
    image_urls = fetch_image_urls()
    if not image_urls:
        logging.error("没有获取到图片URL,程序将退出。")
    else:
        tasks = [gevent.spawn(download, src) for src in image_urls]
        gevent.joinall(tasks)

进阶功能

  • 多线程优化爬虫速度
    通过 Python 的 concurrent.futures 库,可以让图片下载并行化,从而提高爬取速度。多线程方式可以显著提升下载效率,尤其是当需要下载大量图片时。

  • 防止重复下载
    可以根据图片的 URL 或使用哈希值来判断图片是否已经下载过,从而避免重复下载。

  • 处理反爬机制
    如果斗鱼使用了反爬措施(如验证码、IP 限制等),可以考虑使用代理 IP、设置请求头、延时访问等手段来模拟正常用户行为,避免被封禁。

总结与展望

本文详细介绍了如何编写一个简单的 Python 爬虫,从斗鱼平台抓取美女主播的图片。爬虫的实现过程包括获取网页内容、解析网页、提取图片 URL 和下载图片。通过一些进阶功能的拓展,可以提升爬虫效率和稳定性。

爬虫技术是一个非常有趣的领域,未来我们可以继续研究如何处理更复杂的网站结构、如何使用机器学习处理图片等问题。希望这篇博客能帮助你快速掌握爬虫的基本技巧,开始自己的数据抓取之旅。

若感兴趣可以访问并订阅我的专栏:Python爬虫五十个小案例:https://blog.youkuaiyun.com/null18/category_12840403.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12840403&sharerefer=PC&sharesource=null18&sharefrom=from_link
请添加图片描述

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馒头学python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值