首页 > 编程语言 >【Python爬虫五十个小案例】Python提取某斗颜值主播图片~

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

时间:2024-12-07 18:33:30浏览次数:7  
标签:src logging 某斗 img Python 颜值 爬虫 import 图片

请添加图片描述

博客主页:小馒头学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.csdn.net/null18/category_12840403.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12840403&sharerefer=PC&sharesource=null18&sharefrom=from_link
请添加图片描述

标签:src,logging,某斗,img,Python,颜值,爬虫,import,图片
From: https://blog.csdn.net/null18/article/details/144311976

相关文章

  • WxPython跨平台开发框架之用户选择和标签组件的设计
    在系统的权限管理中,往往都会涉及到用户的选择处理,特别是基于角色的访问控制中,很多情况下需要用到选择用户的处理。本篇随笔,基于WxPython跨平台开发框架,采用原有开发框架成熟的一套权限系统理念,对机构、用户、角色、权限、菜单、日志、字典等内容进行管理的,因此也涉及到了用户选择......
  • Python 潮流周刊#80:Django 项目性能调优(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,3则音视频,全文2100字。以下是本期摘要:......
  • [python]批量转换ncm格式文件
    前言最近想换用本地其它播放器听音乐,但网易云音乐下载下来的文件格式是.ncm,不兼容其它播放器。网上找了下方案,参考网易云音乐ncm格式分析以及ncm与mp3格式转换实现了基本功能,在此基础上加了个多进程同时转换,以及通过命令行传一些参数,比如并发执行数、输入输出目录路径。示例代码......
  • D90【python 接口自动化学习】- pytest基础用法
    day90pytest的setup,setdown详解(二)学习日期:20241206学习目标:pytest基础用法--pytest的setup,setdown详解(二)学习笔记:setup、teardown详解(二)函数级setup_function/teardown_function对每条函数用例生效(不在类中)importrequestsimportpytestdefsetup_function():......
  • D89【python 接口自动化学习】- pytest基础用法
    day89pytest的setup,setdown详解学习日期:20241205学习目标:pytest基础用法--pytest的setup,setdown详解学习笔记:setup、teardown详解模块级setup_module/teardown_module开始于模块始末,生效一次importpytestimportrequestsdefsetup_module():print("准备测......
  • python初学笔记
    1.python的安装通过csdn上的教程进行安装以及完成了环境的调配;2.python的基础认识Python是一种解释型、高级、通用的编程语言。它由GuidovanRossum于1989年发明,并于1991年首次发布。Python的设计哲学强调代码的可读性和简洁的语法,尤其是使用空格缩进来表示代码块,而非使用大......
  • Python语言基础(二):注释、保留字与标识符、变量
    前言:精通一门编程语言的不二法门,在于深刻理解并掌握其基础,并通过实践来不断磨砺技能,正如那句老话所说:“熟能生巧”。从本章起,我们将正式启程,踏上Python开发的奇妙之旅,一同感受Python带来的简洁与乐趣。在本章中,我们将逐步揭开Python的神秘面纱,内容包括但不限于:注释:了解如何在代......
  • python基于大数据的电商行业产品评价系统
    收藏关注不迷路!!......
  • 频谱分析—Python代码
    下面是一个用python进行频谱分析的代码案例。importmatplotlib.pyplotaspltimportnumpyasnpdefmyfft(signal,fs):'''FFT变换,用于频谱分析:paramsignal:type:ndarray,shape:(n,):paramfs:采样频率,Hz:paramone_side(default:......
  • 时频分析—连续小波变换python代码实现
    连续小波变换python代码实现:importmatplotlib.pyplotaspltimportnumpyasnpimportpywtdefMyCWT(y,fs,wavelet='cmor2-5',total_scal=512):'''连续小波变换CWT:paramy:信号,nnumpy,(n,):paramfs:采样频率:paramwavelet:复小......