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

本文深入探讨Scrapy框架的业务逻辑,解析spiders.py、items.py和pipelines.py的作用。通过实例展示如何使用Scrapy下载指定网站的所有图片,包括创建items定义容器格式,编写爬虫meizitu.py,以及设置pipelines处理和保存数据。
摘要由CSDN通过智能技术生成

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

一般主要文件是  爬虫文件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







深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值