利用Scrapy爬取壁纸图片

这次我们利用scrapy来爬取一个壁纸图片网站的壁纸图片,并且把它下载下来。地址链接为:http://pic.netbian.com/,这里我们爬取美食分类的图片。

1.首先我们先要去建立一个scrapy框架,定义爬虫类等等。

2.在image.py中写代码。

# -*- coding: utf-8 -*-
import scrapy
from ..items import  ImagenetItem

class ImageSpider(scrapy.Spider):
    name = 'image'
    allowed_domains = ['pic.netbian.com']
    start_urls = ['http://pic.netbian.com/4kmeishi/']

    def parse(self, response):
    # 根据响应来找到指定的内容,现在找到的是img的src属性
        img_list=response.xpath('//ul[@class="clearfix"]/li/a/img/@src')
        print(img_list)
        for img in img_list:
            item=ImagenetItem()
            # 拼接url,得到完整的网址
            src='http://pic.netbian.com'+img.extract()
            # print(src)
            # 将得到的下载地址放入数据模型中
            ## 下载地址要包在列表当中
            item['src']=[src]
            # 将数据模型传输给管道
            yield item
        #获取下一页的链接
        next_url=response.xpath('//div[@class="page"]/a[text()="下一页"]/@href').extract()
        print('-------------------------------------------------------'
        if len(next_url)!=0:
            # print(next_url)
            url='http://pic.netbian.com'+next_url[0]
            # 将url传给scrapy.Request 得到的结果继续用self.parse进行处理
            yield scrapy.Request(url=url,callback=self.parse)

这个就是首先获取图片的链接,拼接成完整的网址。然后把图片的下载链接传到管道里面。然后获取下一页的链接,把这个链接返回到最开始的地方使用,获取下一页的图片所有链接。

3.items.py中书写代码如下。

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

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class ImagenetItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    src=scrapy.Field()
    pass

4.settings.py中做以下操作。

# ROBOTSTXT_OBEY = True或者等于False

TEM_PIPELINES = {
   # 'imageNet.pipelines.ImagenetPipeline': 300,
   #  scrapy中专门负责图片下载的管道
    'scrapy.pipelines.images.ImagesPipeline':1
}
# 图片的存储路径
IMAGES_STORE='imageDownLoad'
# 图片的下载地址,这是根据item中的字段来设置哪一个内容需要被下载
IMAGES_URLS_FIELD='src'

在终端中输入命令:scrapy crawl image,按下回车,会得到以下的内容

这个就是我们爬取下载下来的图片。这样便算是完成了这个简单的项目。

再给大家说一下scrapy整个的运作流程,我从网上找到了一个很形象的叙说

制作 Scrapy 爬虫 一共需要4步:

  1. 新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
  2. 明确目标 (编写items.py):明确你想要抓取的目标
  3. 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
  4. 存储内容 (pipelines.py):设计管道存储爬取内容

scrapy.cfg :项目的配置文件

imageNet :项目的Python模块,将会从这里引用代码

items.py :项目的目标文件

pipelines.py :项目的管道文件

settings.py :项目的设置文件

spiders/:存储爬虫代码目录

Scrapy的运作流程

代码写好,程序开始运行...

  1. 引擎:Hi!Spider, 你要处理哪一个网站?

  2. Spider:老大要我处理xxxx.com。

  3. 引擎:你把第一个需要处理的URL给我吧。

  4. Spider:给你,第一个URL是xxxxxxx.com。

  5. 引擎调度器,我这有request请求你帮我排序入队一下。

  6. 调度器:好的,正在处理你等一下。

  7. 引擎调度器,把你处理好的request请求给我。

  8. 调度器:给你,这是我处理好的request

  9. 引擎:下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求

  10. 下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)

  11. 引擎Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)

  12. Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。

  13. 引擎管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。

  14. 管道:调度器:好的,现在就做!

我们在书写代码的时候,可能会根据个人的书写喜好原因等等,顺序会不太一样,本人的编写代码顺序如下:

1.我们先新建立好一个scrapy框架和爬虫类等等。

2.编写代码,获取我们所需要的内容,这里我们是获取到了图片的链接。然后对链接进行处理,拼接等等。 src='http://pic.netbian.com'+img.extract()

3.获取下一页的链接,拼凑成完整的网址,并且利用 yield scrapy.Request(url=url,callback=self.parse)构成一个循环。

4.进入到items.py中,编写我们获取的内容变量。src=scrapy.Field()

5.回到image.py中,引入模块:from ..items import  ImagenetItem,编写上: 

item=ImagenetItem()
item['src']=[src]
 yield item

6.进入到settings.py中,编写程序:

# ROBOTSTXT_OBEY = True或者等于False

TEM_PIPELINES = {
   # 'imageNet.pipelines.ImagenetPipeline': 300,
   #  scrapy中专门负责图片下载的管道
    'scrapy.pipelines.images.ImagesPipeline':1
}
# 图片的存储路径
IMAGES_STORE='imageDownLoad'
# 图片的下载地址,这是根据item中的字段来设置哪一个内容需要被下载
IMAGES_URLS_FIELD='src'

这里imageDownLoad是一个路径,你也可以在桌面或者其他文件夹下新建一个文件夹。把imageDownLoad替换成新建文件夹的路径。

IMAGES_URLS_FIELD='src'中src就是我们想要下载图片的链接。

7.终端中,输入命令,scrapy crawl image,静静的等它下完就好了。

好了,本次的分享就先告一段落,本人会不定时的继续和大家分享有关python的知识的。

猜你喜欢

转载自blog.csdn.net/qq_42543244/article/details/81457743
今日推荐