scrapy 也能爬取妹子图?(5)

发布时间:2025-09-02 00:55:17 作者:益华网络 来源:undefined 浏览量(0) 点赞(0)
摘要:目录 前言 Media Pipeline 启用Media Pipeline 使用 ImgPipeline 抓取妹子图 瞎比比与送书后话 前言 我们在抓取数据的过程中,除了要抓

目录

前言

Media Pipeline

启用Media Pipeline

使用 ImgPipeline

抓取妹子图

瞎比比与送书后话

前言

我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有抓取图片的需求。那我们的 scrapy 能爬取图片吗?答案是,当然的。说来惭愧,我也是上个月才知道,在 zone7 粉丝群中,有群友问 scrapy 怎么爬取图片数据?后来搜索了一下才知道。现在总结一下分享出来。

Media Pipeline

我们的 itempipeline 处理可以处理文字信息以外,还可以保存文件和图片数据,分别是 FilesPipeline 和 ImagesPipeline

Files Pipeline

避免重新下载最近已经下载过的数据

指定存储路径

FilesPipeline的典型工作流程如下:

在一个爬虫里,你抓取一个项目,把其中图片的URL放入 file_urls 组内。

项目从爬虫内返回,进入项目管道。

当项目进入 FilesPipeline,file_urls 组内的URLs将被Scrapy的调度器和下载器(这意味着调度器和下载器的中间件可以复用)安排下载,当优先级更高,- - 会在其他页面被抓取前处理。项目会在这个特定的管道阶段保持“locker”的状态,直到完成文件的下载(或者由于某些原因未完成下载)。

当文件下载完后,另一个字段(files)将被更新到结构中。这个组将包含一个字典列表,其中包括下载文件的信息,比如下载路径、源抓取地址(从 file_urls 组获得)和图片的校验码(checksum)。 files 列表中的文件顺序将和源 file_urls 组保持一致。如果某个图片下载失败,将会记录下错误信息,图片也不会出现在 files 组中。

Images Pipeline

避免重新下载最近已经下载过的数据

指定存储路径

将所有下载的图片转换成通用的格式(JPG)和模式(RGB)

缩略图生成

检测图像的宽/高,确保它们满足最小限制

启用Media Pipeline

# 同时启用图片和文件管道ITEM_PIPELINES = { # 使用时,请修改成你自己的 ImgPipeline

    girlScrapy.pipelines.ImgPipeline: 1,

}

FILES_STORE = os.getcwd() + /girlScrapy/file  # 文件存储路径IMAGES_STORE = os.getcwd() + /girlScrapy/img  # 图片存储路径# 避免下载最近90天已经下载过的文件内容

FILES_EXPIRES = 90

# 避免下载最近90天已经下载过的图像内容

IMAGES_EXPIRES = 30

# 设置图片缩略图

IMAGES_THUMBS = {

    small: (50, 50),

    big: (250, 250),

}

# 图片过滤器,最小高度和宽度,低于此尺寸不下载

IMAGES_MIN_HEIGHT = 128

IMAGES_MIN_WIDTH = 128

需要说明的是,你下载的图片名最终会以图片 URL 的 hash 值命名,例如:

0bddea29939becd7ad1e4160bbb4ec2238accbd9.jpg

最终的保存地址为:

your/img/path/full/0

bddea29939becd7ad1e4160bbb4ec2238accbd9.jpg

使用 ImgPipeline

这是我 demo 中的一个 ImgPipeline,里面重写了两个方法。

from scrapy.pipelines.images import

 ImagesPipeline

class ImgPipeline(ImagesPipeline):#继承 ImagesPipeline 这个类    def get_media_requests(self, item, info):        for image_url in item[image_urls

]:

            image_url = image_url

            yield

 scrapy.Request(image_url)

    def item_completed(self, results, item, info):        image_paths = [x[pathfor ok, x in results if

 ok]

        if not

 image_paths:

            raise DropItem("Item contains no images"

)

        return

 item

分别是:

get_media_requests(self

, item, info):

item_completed(self

, results, item, info):

get_media_requests(self, item, info):

在这里,我们可以获取到 parse 中解析的 item 值,因此我们可以获取到相应的图片地址。在这里返回一个 scrapy.Request(image_url) 去下载图片。

item_completed(self, results, item, info):

item 和 info 打印出来都是 url 地址列表。其中 results 打印出来是如下值。

# 成功[(True, {pathfull/0bddea29939becd7ad1e4160bbb4ec2238accbd9.jpg

,

 checksum98eb559631127d7611b499dfed0b6406

urlhttp://mm.chinasareview.com/wp-content/uploads/2017a/06/13/01.jpg

})]

# 错误[(False

,

  Failure(...))]

抓取妹子图

ok,理论部分也讲完了,那我们来实践一下吧

spider

spider 部分很简单,如下:

class GirlSpider(scrapy.spiders.Spider):    name = girl    start_urls = ["http://www.meizitu.com/a/3741.html"

]

    def parse(self, response):        soup = BeautifulSoup(response.body, html5lib

)

        pic_list = soup.find(div, id="picture").find_all(img)  # 找到界面所有图片

        link_list = []

        item = ImgItem()

        for i in

 pic_list:

            pic_link = i.get(src)  # 拿到图片的具体 url            link_list.append(pic_link)  # 提取图片链接        item[image_urls

] = link_list

        print(item)

        yield

 item

itemclass ImgItem(scrapy.Item):    image_urls = scrapy.Field()#图片的链接

    images = scrapy.Field()

ImgPipelineclass ImgPipeline(ImagesPipeline):#继承 ImagesPipeline 这个类    def get_media_requests(self, item, info):        for image_url in item[image_urls

]:

            image_url = image_url

            yield

 scrapy.Request(image_url)

    def item_completed(self, results, item, info):        image_paths = [x[pathfor ok, x in results if

 ok]

        if not

 image_paths:

            raise DropItem("Item contains no images"

)

        return

 item

启动scrapy

 crawl girl

最终爬取结果如下:

瞎比比与送书后话

今天的更新就到此结束啦,是不是 get 到了新技能?至于如何批量下载妹子图?这个,我相信妹子的颜值会驱使你完善这些代码,手动滑稽!!!

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!