前言

新近本身感受了三回全栈(伪)开发App的经历,收益良多,我想把进程记录一下,一是想起与巩固,二是一得之见,如有谬误以求大神引导。

首先,大家须求明白大家最终的目的是哪些。
例如现在自己要做一个简约的游玩评测资讯的App。
那么自己第一须要【数据来源于】然后须要一个提供数据接口的【服务端】,我将先完结那二者,然后才起来App的支出。

就此我将分成三步[Python爬虫]->[Ruby服务端]->[iOS客户端]来形成那些App。

而爬虫技术,将用作先遣部队,为大家攻下第四个数据堡垒。

开始

不以为奇言语都有成熟的爬虫框架,我选用的是利用Python语言的Scrapy框架,那是一个格外周全同时效率强大的爬虫框架,大家只必要用到最基础的功能。Scrapy拥有极度棒的汉语文档
安装和入门教程文档一应俱全,我就不赘述了。

安装好未来,我们打开终端,开始创制让人激动的爬虫

scrapy startproject yxReview

cd yxReview 

scrapy genspider yx_review www.ali213.net/news/pingce

达成后社团大体上如图

json 1

k

就那样,基础的框架和代码已经被生成了,接着大家用编辑器打开yxReview目录,首先在items.py文本下新建一个item。
俺们可以先打开网页侠客评测剖析一下

json 2

侠客评测

概括起见,我们脚下只抓取4个属性,成立代码:

class ArticleItem(scrapy.Item):
    title = scrapy.Field()
    cover_image = scrapy.Field()
    summary = scrapy.Field()
    score = scrapy.Field()

然后我们进去目录下的spiders文件夹,打开yx_review.py
一般来说编辑

# -*- coding: utf-8 -*-
import scrapy

from yxReview.items import ArticleItem

class YxReviewSpider(scrapy.Spider):
    name = "yx_review"
    allowed_domains = ["www.ali213.net"]
    start_urls = (
        'http://www.ali213.net/news/pingce/',
    )

    def parse(self, response):
        items = []
        for sel in response.xpath('//div[@class="t3_l_one_l"]'):
            item = ArticleItem()
            item["cover_image"] = sel.xpath("div[@class='one_l_pic']/a/img/@src").extract()
            item["title"] =   sel.xpath("div[@class='one_l_con']/div[@class='one_l_con_tit']/a/text()").extract()
            item["summary"] = sel.xpath("div[@class='one_l_con']/div[@class='one_l_con_con']/text()").extract()
            items.append(item)

        index = 0
        for scoreSel in response.xpath('//div[@class = "t3_l_one_r"]'):
            item = items[index]
            item["score"] = scoreSel.xpath("div/span/text()").extract()
            index = index + 1
            yield item

        print items

那边最重假设parse方法,再次来到请求到的HTML然后分析出我们要求的数目装进ArticleItem里,然后将items传输到pipeline中。

传输管道

在爬虫scrapy中,pipeline是一个根本的概念,它一定于一个“加工器”,可以接连多少个自定义的pipeline,已毕数据的接轨处理工作,比如举行筛选分类,或者持久化到地方等等,按优先级串连。

在本例中,为了便利,我将成立一个管道将数据简单处理并保存到地面文件中。

打开pipelines.py,编辑如下

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

from scrapy import signals
from scrapy.contrib.exporter import JsonItemExporter

class YxreviewPipeline(object):

    @classmethod
    def from_crawler(cls, crawler):
         pipeline = cls()
         crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
         crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
         return pipeline

    def spider_opened(self, spider):
        self.file = open('items.json', 'wb')
        self.exporter = JsonItemExporter(self.file)
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        self.file.close()

    def process_item(self, item, spider):
        self.checkData(item, "title")
        self.checkData(item, "summary")
        self.checkData(item, "cover_image")
        self.checkData(item, "score")

        self.exporter.export_item(item)

        return item

    def checkData(self ,item, field):
        if len(item[field]) > 0:
            newText = item[field][0].encode("utf-8")
            item[field] = newText.strip()
        else:
            item[field] = ""

json,前面四个法子,相当于给当下的pipeline提供了一个JsonItemExporter的插件,用于将装有爬取的item导出为JSON格式的公文之中。

除此以外索要证实的是,那里自定义了一个checkData主意,作为一个简约的数据类型验证,以及将事先解析的情节转换成字符串并且开展了utf-8编码的转码,有限支撑粤语内容的不利显示。

做到后,打开工程目录下的items.json文本,可以阅览数据已经以JSON格式保存了下去。

json 3

items.json

终止

迄今截止,爬虫的职分可以告一段落,当然,在实质上运用中还索要解决越来越多的标题,比如分页爬取,反爬虫的应对等等,迫于小说篇幅暂且不表,算作扩张阅读吧
:)

下一篇,我们将动用ruby on rails编写服务端,提供移动端的REST API接口。


一系列链接
从零先河开发一个App(1)-
Scrapy爬虫

从零伊始开发一个App(2)- 简易REST
API服务端

从零初阶开发一个App(3)-
iOS客户端

相关文章

网站地图xml地图