scrapy爬虫爬取小姐姐图片(不羞涩)

这个爬虫主要学习scrapy的item Pipeline

是时候搬出这张图了:

 

 

 当我们要使用item Pipeline的时候,要现在settings里面取消这几行的注释

 

 

 

我们可以自定义Item Pipeline,只需要实现指定的方法,其中必须要实现的一个方法是: p

  process_item(item,spider)

另外还有几个方法我们有时候会用到

  open_spider(spider)

  close_spider(spider)

  from_crawler(cls,crawler)

 

在不羞涩的主页(https://www.buxiuse.com/)我们使用xpath进行分析可以得到每一张小姐姐图片的url,我们将每一页urls作为一个item对象返回,并且找到下一页的链接,持续爬取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class IndexSpider(scrapy.Spider):
    name = 'index'
    allowed_domains = ['buxiuse.com']
    start_urls = ['https://www.buxiuse.com/?page=1']
    base_domain="https://www.buxiuse.com"
 
    def parse(self, response):
        image_urls=response.xpath('//ul[@class="thumbnails"]/li//img/@src').getall()
        next_url=response.xpath('//li[@class="next next_page"]/a/@href').get()
        item=BuxiuseItem(image_urls=image_urls)
        yield item
        if not next_url:
            return
        else:
            yield scrapy.Request(self.base_domain+next_url)  

 对于yield的item对象,因为只返回了一个urls,所以我们在items进行设置

1
2
3
4
class BuxiuseItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    image_urls=scrapy.Field()

  这样在刚才的index文件里面,才可以新建BuxiuseItem对象,

1
item=BuxiuseItem(image_urls=image_urls)

  当然要先在index导入BuxiuseItem这个类

接着在pipeline里面我们处理接收到的Item和下载图片

我们先创建一个image的文件夹储存爬取到的图片,使用os.mkdir(self.path)

这个self.path由我们自己设定,这里学到了一个知识点:os.path.dirname(__file__)可以显示当前文件所在的位置

我们先输出一下 

 

 

 

 使用os.path.dirname(os.path.dirname(__file__))可以返回到上一级目录位置

 

 

 

 我们使用这个方法控制储存的目录,如果是其他比较远的位置就使用绝对路径吧。

因为我是python2的环境,使用

1
urllib.urlretrieve(link,os.path.join(self.path,image_name))

  将链接上的图片以指定的文件名保存在指定位置上

所以pipeline里面的代码就是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import os
import urllib
from scrapy.pipelines.images import ImagesPipeline
import settings
i=1
class BuxiusePipeline(object):
    def __init__(self):
        self.path=os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')
        if not os.path.exists(self.path):
            os.mkdir(self.path)
 
    def process_item(self, item, spider):
        global i
        link_list=item['image_urls']
        for link in link_list:
            print i
            image_name=str(i)+".jpg"
            urllib.urlretrieve(link,os.path.join(self.path,image_name))
            i=i+1
        return item

  输出i是为了让我能看到脚本还在正常下载,免得被网站ban掉了还不知道。

运行一下看看效果:

 

 

 

 可以看到小姐姐的图片已经被下载下来了,并且按照i的编号整齐排列,完事。

 

github代码:

https://github.com/Cl0udG0d/scrapy_demo/tree/master/buxiuse


__EOF__

本文作者春告鳥
本文链接https://www.cnblogs.com/Cl0ud/p/12383630.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   春告鳥  阅读(774)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示