首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Python爬虫五十个小案例】Python提取某斗颜值主播图片~

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

原创
作者头像
小馒头学Python
发布2024-12-08 23:02:25
发布2024-12-08 23:02:25
34900
代码可运行
举报
文章被收录于专栏:小馒头学Python小馒头学Python
运行总次数:0
代码可运行

今日推荐

在文章开始之前,推荐一篇值得阅读的好文章!感兴趣的也可以去看一下,并关注作者!

今日推荐:数据库数据同步到缓存方法

文章链接:https://cloud.tencent.com/developer/article/2474762

通过这篇文章,你将能够深入了解并介绍了数据库,数据库是数据的持久化存储核心,负责数据的持久保存与管理。然而,数据库的读写操作相对较慢,尤其是在高并发场景下,频繁的数据库访问可能导致系统性能瓶颈。缓存则是位于数据库与应用程序之间的高速数据存储层,能够显著提升数据的读取速度,减少数据库的负载压力。为了充分发挥缓存的优势,确保缓存数据与数据库数据的一致性成为了关键任务,即需要高效地将数据库数据同步到缓存中。

前言

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

项目准备

安装必要的库

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

代码语言:python
代码运行次数:0
运行
复制
import gevent
import json
import logging
from urllib import request
from gevent import monkey

rquests:用于发送 HTTP 请求,获取网页内容。

beautifulsoup4:用于解析 HTML 页面,提取其中的图片信息。

os:用于操作文件系统,创建文件夹和保存图片。

设置开发环境

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

代码语言:python
代码运行次数:0
运行
复制
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 对其进行解析,找出其中的图片标签 <img> 并提取其 src 属性,即图片的 URL。

下载并保存图片

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

代码实现

下面是案例的示例

请求网页并设置日志

代码语言:python
代码运行次数:0
运行
复制
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

代码语言:python
代码运行次数:0
运行
复制
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 []

下载图片并保存

代码语言:python
代码运行次数:0
运行
复制
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}")

主函数

代码语言:python
代码运行次数:0
运行
复制
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
代码运行次数:0
运行
复制
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 和下载图片。通过一些进阶功能的拓展,可以提升爬虫效率和稳定性。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 今日推荐
  • 前言
  • 项目准备
    • 安装必要的库
    • 设置开发环境
  • 爬虫原理介绍
    • 网络爬虫概述
    • HTTP 请求与响应
    • HTML 解析
  • 编写爬虫
    • 获取网页内容
    • 解析网页获取图片链接
    • 下载并保存图片
  • 代码实现
  • 完整源码
  • 进阶功能
  • 总结与展望
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档