爬虫 scrapy 框架学习 2. Scrapy框架业务逻辑的理解 + 爬虫案例 下载指定网站所有图片

进一步理解业务流程以及各个模式:

一般主要文件是  爬虫文件spiders.py,   items.py    piplines.py  。以及我们要理解在scrapy框架里面的scrapy引擎和items并不是我们写的主要文件,而是scrapy所内涵。

以下是各个文件的功能:

    spiders.py  :   这就是所谓的爬虫文件,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。

   items.py      : 这里面主要是用于编写处理item这个容器的格式,而不是容器本身。

   piplines.py  :  主要是用于分析,处理,保存数据。


以下为下载指定网页所有图片   (多次抓取会使的下载的图片无法打开)


首先是  items.py   来设定容器格式

import scrapy

class MeizituItem(scrapy.Item):
    url = scrapy.Field()
    name = scrapy.Field()
    tags = scrapy.Field()
    image_urls = scrapy.Field()
    images = scrapy.Field()

然后是蜘蛛的编写,因为抓的是妹子图片  所以蜘蛛命名为meizitu.py:

# -*- coding: utf-8 -*-
from scrapy.selector import Selector
import scrapy
from scrapy.contrib.loader import ItemLoader, Identity
from tutorial.items import MeizituItem


class MeizituSpider(scrapy.Spider):
    name = "meizitu"
    allowed_domains = ["meizitu.com"]
    start_urls = (
        'http://www.meizitu.com/',
    )

    def parse(self, response):
        sel = Selector(response)#使用Selector选择器分析返回的网页内容
        for link in sel.xpath('//h2/a/@href').extract():
            request = scrapy.Request(link, callback=self.parse_item)
            yield request

        pages = sel.xpath("//div[@class='navigation']/div[@id='wp_page_numbers']/ul/li/a/@href").extract()
        print('pages: %s' % pages)

        if len(pages) > 2:
            page_link = pages[-2]
            page_link = page_link.replace('/a/', '')#Python replace(old, new)方法把字符串中的 old(旧字符串)替换成 new(新字符串)
            print page_link
            request = scrapy.Request('http://www.meizitu.com/a/%s' % page_link, callback=self.parse)
            yield request

    def parse_item(self, response):
        # Spider中的Item Loader方法  本质的意义就是如果一个页面可能属于不同的协议,html或者xml或者别的,可以针对性的用不同类
        # 型的itemload方法,把它们筛选出来,然后用loader方法最终把数值取出来,这样可以减少修改方式更高效
        l = ItemLoader(item=MeizituItem(), response=response)
        l.add_xpath('name', '//h2/a/text()')
        l.add_xpath('tags', "//div[@id='maincontent']/div[@class='postmeta  clearfix']/div[@class='metaRight']/p")
        l.add_xpath('image_urls', "//div[@id='picture']/p/img/@src", Identity())

        l.add_value('url', response.url)
        return l.load_item()
        # 最终, 当所有数据被收集起来之后, 调用ItemLoader.load_item()
        # 方法, 实际上填充并且返回了之前通过调用add_xpath()所提取和收集到的数据的Item.

然后   piplines.py     来处理蜘蛛下载后,保存到item的网页数据

import requests
from tutorial import settings
import os


class ImageDownloadPipeline(object):
    def process_item(self, item, spider):
        if 'image_urls' in item:
            images = []
            dir_path = '%s/%s' % (settings.IMAGES_STORE, spider.name)

            if not os.path.exists(dir_path):#os.path.exists()Python内置模块 路径存在则返回True,路径损坏返回False
                os.makedirs(dir_path)#os.makedirs()建立目录
            for image_url in item['image_urls']:
                us = image_url.split('/')[3:]
                image_file_name = '_'.join(us)
                file_path = '%s/%s' % (dir_path, image_file_name)
                images.append(file_path)
                if os.path.exists(file_path):
                    continue
                # 注释内容为通过图片网址来下载图片到指定位置的示范。以下的则是本文的示例
                # r = requests.get(图片网络地址, stream=True)
                # with open("/图片地址/" + 图片命名, 'wb') as f:
                #     for chunk in r.iter_content(chunk_size=1024):
                #         if chunk:  # filter out keep-alive new chunks
                #             f.write(chunk)
                #             f.flush()
                #     f.close()

                with open(file_path, 'wb') as handle:
                    response = requests.get(image_url, stream=True)
                    for block in response.iter_content(1024):
                        if not block:
                            break

                        handle.write(block)

            item['images'] = images
        return item
最后是设置文件

BOT_NAME = 'tutorial'

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

ITEM_PIPELINES = {'tutorial.pipelines.ImageDownloadPipeline': 1}

IMAGES_STORE = '/tmp/images'

DOWNLOAD_DELAY = 0.25    # 250 ms of delay

ROBOTSTXT_OBEY = True

然后在根目录运行  

scrapy crawl meizitu







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值