Scrapy实践:爬取斗鱼TV主播的头像(重写ImagesPipeline实现图片爬取)

注:若运行以下代码报出有关“PIL”的错误,则只需安装pillow即可。

实现思路:

(1)使用Fiddler抓包工具,找出为斗鱼APP颜值区提供数据的URL(Json格式)
(2)在items中定义需要记录的相关信息
(3)在spider中实现迭代爬取各主播的信息
(4)在Pipeline中通过继承内置的ImagesPipeline类,重写其功能,实现图片的下载 
(5)在settings.py文件中进行相关配置

代码实现:

items.py

# -*- coding: utf-8 -*-

import scrapy


class DouyuItem(scrapy.Item):
    #图片链接
    vertical_src = scrapy.Field()
    #主播名
    nickname = scrapy.Field()
    #图片保存路径
    imagePath = scrapy.Field()

爬虫文件(spiders/douyuMM.py)

# -*- coding: utf-8 -*-
import scrapy
import json
from Douyu.items import DouyuItem


class DouyummSpider(scrapy.Spider):
    name = 'douyuMM'
    allowed_domains = ['capi.douyucdn.cn']
    initial_URL = 'http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset='
    offset = 0
    URL = initial_URL + str(offset)
    start_urls = [URL]

    def parse(self, response):
        data = json.loads(response.text)['data']
        for each in data:
            item = DouyuItem()
            item['nickname'] = each['nickname']
            #将图片链接存储成列表形式,供pipelines迭代
            image_url = each['vertical_src']
            item['vertical_src'] = [image_url]
            yield item

        self.offset += 20
        #抓取前100个主播的图片
        if self.offset < 100:
            self.URL = self.initial_URL + str(self.offset)
            yield scrapy.Request(url=self.URL, callback=self.parse)

pipelines.py

# -*- coding: utf-8 -*-

import os
import scrapy
"""
    pipelines提供了图片相关的方法,因此只需继承ImagesPipeline
    并对“get_media_requests”和“item_completed”重写即可实现图片的下载
"""
from scrapy.pipelines.images import ImagesPipeline
#通过get_project_settings来获取settings.py文件中设置的变量
from scrapy.utils.project import get_project_settings


class DouyuImagesPipeline(ImagesPipeline):
    IMAGES_STORE = get_project_settings().get('IMAGES_STORE')

    def get_media_requests(self, item, info):
        for image_url in item['vertical_src']:
            yield scrapy.Request(image_url)

        """
            亦可用下面的代码,只不过下面的代码只能抓取一张图片
            image_url = item['vertical_src']
            yield scrapy.Request(image_url)
        """

    def item_completed(self, results, item, info):
        """
            result结构:
                [(True,
                  {'checksum': '2b00042f7481c7b056c4b410d28f33cf',
                   'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
                   'url': 'http://www.example.com/files/product1.pdf'}),
                 (False,
                  Failure(...))]
        """
        image_path = [x['path'] for ok, x in results if ok]
        # 修改图片保存名称为主播昵称
        # 并将爬取的图片存储在IMAGES_STORE设置的相对路径下,用“full”文件存储
        os.rename(self.IMAGES_STORE + image_path[0], self.IMAGES_STORE + 'full/' + item["nickname"] + ".jpg")
        item['imagePath'] = self.IMAGES_STORE + 'full/' + item["nickname"]
        return item

settings.py

BOT_NAME = 'Douyu'

SPIDER_MODULES = ['Douyu.spiders']
NEWSPIDER_MODULE = 'Douyu.spiders'

ROBOTSTXT_OBEY = True
DEFAULT_REQUEST_HEADERS = {
    'User-Agent':'DYZB/4.100 (iPhone; iOS 11.3.1; Scale/3.00)',
    'Accept': 'application/vnd.mapi-yuba.douyu.com.4.0+json',
    'Accept-Language': 'zh-Hans-CN;q=1'
}

IMAGES_STORE = 'data/斗鱼主播图片/'

ITEM_PIPELINES = {
    'Douyu.pipelines.DouyuImagesPipeline': 300,
}




全部评论

相关推荐

2025-12-31 19:23
已编辑
门头沟学院 Java
ssob是已读不回的,字节是压根不敢投的,简历是反反复复改了N遍的,八股是永远背不完的😅😅😅扯远了,道心破碎了,把简历发出来让大伙先看看笑话。再说正事。寒假日常实习还是很难找,连个面试都难约,我不是个例,这是网上普遍反映。不报希望了,趁着2、3月前赶紧做些什么才是。扔几个碎碎念:1.这破简历还能怎么改?写到什么程度才能过实习岗筛选?广大牛友来锐评一下2.火速辅修go,是否可行目前看来是学习成本最小的。首先,很多go实习岗位已经明确要求掌握gin等技术栈,拿java简历投go的时代已经过去了。其次,很多后端的东西,MySQL、Redis这些都是通用的,不用重新学。所以这个问题就具体为:2.1&nbsp;java&amp;go混血简历怎么写第一个项目,仿大麦的微服务,不太好改。因为有用到Redisson、AOP、SpringAI这些java强相关的东西,包装成go需要替换这些方案。第二个,点评魔改。应该可以包装成go,github上也有人用go重写过。2.2&nbsp;java&amp;go通用的轮子RPC直接pass了,太烂大街了。不知道动态线程池能不能做。反正项目上新有风险,不一定来得及,非必要就不开新的项目。补充:别跟我扯RAG了,这玩意已经成新的烂大街了,详见我上一篇的吐槽。3.认真学微调prompt什么的这个半步踩进算法了已经。八股和场景题完全就是另一套,没两三个月搞不定的。约等于换方向
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务