2018 - Python 3.7 爬虫之 利用 Scrapy 框架 获取图片并下载(二)

一、 通过命令构建一个爬虫项目

二、定义 item

三、激活 pipeline 管道

四、编写爬虫 Spider

五、运行爬虫

六、结果视图


未安装 Scrapy 框架,见上一篇文章:框架安装及配置

一、 通过命令构建一个爬虫项目

注:SinanewsSpider 为项目名

scrapy startproject SinanewsSpider

成功创建后的目录如下:

这些文件主要是:
scrapy.cfg: 项目配置文件
SinanewsSpider/: 项目python模块, 代码将从这里导入
SinanewsSpider/items.py: 项目items文件
SinanewsSpider/pipelines.py: 项目管道文件
SinanewsSpider/settings.py: 项目配置文件
SinanewsSpider/spiders: 放置spider的目录

二、定义 item

编辑 settings.py 文件,定义两个数据存放的容器( items 是将要装载抓取的数据的容器 )

# -*- 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 SinanewsspiderItem(scrapy.Item): #定义数据项类,从scrapy.Item继承
    # define the fields for your item here like:
    # name = scrapy.Field()
    addr = scrapy.Field()
    name = scrapy.Field()
    pass

三、激活 pipeline 管道

编辑 settings.py 文件,添加如下代码:

BOT_NAME = 'SinanewsSpider'

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

ROBOTSTXT_OBEY = True

ITEM_PIPELINES = {
    'SinanewsSpider.pipelines.SinanewsspiderPipeline': 300,
}

四、编写爬虫 Spider

新建 SinanewsSpider.py 文件,Scrapy 框架已经帮助我们定义好了基础爬虫,只需要从 scrapy.spider 继承,并重写相应的解析函数 parse 即可。

注:案例使用的网站是 www.xiaohuar.com

# -*- coding: utf-8 -*-
# 导入爬虫框架
import scrapy
# 导入item中结构化数据模板
from SinanewsSpider.items import SinanewsspiderItem

import urllib.request
import time
import win32api,win32con
import os

class SinanewsSpider(scrapy.Spider):
    # 爬虫名称,唯一
    name = 'SinanewsSpider'
    # 允许访问的域
    allowed_domains = ['xiaohuar.com']
    # 初始URL
    start_urls = [
        'http://www.xiaohuar.com/2014.html'
    ]

    def parse(self, response):
        # 获取所有图片的a标签
        allPics = response.xpath('//div[@class="img"]/a')
        # 判断文件是否存在
        if not os.path.exists(get_desktop() + '\\TP'):
            os.mkdir(get_desktop() + '\\TP')
        for pic in allPics:
            # 分别处理每个图片,取出名称及地址
            item = SinanewsspiderItem()
            name = pic.xpath('./img/@alt').extract()
            # 没有这个属性就不取值
            if name.__len__() != 0:
                name = name[0]
            addr = pic.xpath('./img/@src').extract()
            # 没有这个属性就不取值
            if addr.__len__() != 0:
                addr = addr[0]
            # 没有前缀加前缀
            if 'http://www.xiaohuar.com' not in addr:
                addr = 'http://www.xiaohuar.com' + addr
            # 将数据存入到数据项
            item['name'] = name
            item['addr'] = addr
            # 下载并保存到桌面的TP文件夹中
            urllib.request.urlretrieve(addr, get_desktop() + "\\TP\\" + str(round(time.time() * 1000)) + '.jpg')
            print(addr, "下载成功")
            # 返回爬取到的数据
            yield item

# 获得桌面路径
def get_desktop():
    key =win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',0,win32con.KEY_READ)
    return win32api.RegQueryValueEx(key,'Desktop')[0]

五、运行爬虫

scrapy crawl SinanewsSpider

六、结果视图

猜你喜欢

转载自blog.csdn.net/Hack_Different/article/details/83833450