爬蟲與swift

分析

使用爬蟲爬取網站page,並按事先的要求將須要的項目保存到數據庫中,而後再使用python flask框架編寫一個web 服務器講數據庫中的數據讀出來,最後用swift編寫一個應用將數據顯示出來。我這裏選區的所要爬取的網站是豆瓣電影網。css

技術選用

爬蟲:使用python的scrapy爬蟲
數據庫:使用mongoDB,存儲網頁只須要key和value形式進行存儲就行了,因此在這裏選擇mongoDB這種NOSQL數據庫進行存儲
服務器:使用python的flask框架,用了你就知道幾行代碼就能完成不少事情,固然特別是flask能夠根據須要組裝空間,超輕量級。html

實現:

  • scrapy爬蟲實現python

    圖片描述
    上圖是scrapy的文檔結構,下面主要介紹幾個文件。ios

a. items.pyweb

from scrapy.item import Item, Field
import scrapy
class TopitmeItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = Field()
    dataSrc = Field()
    dataId = Field()
    filmReview = Field()
    startCount = Field()
這裏能夠把items.py看做是mvc中的model,在items裏咱們定義了本身須要的模型。

b. pipelines.pymongodb

import pymongo
from scrapy.conf import settings
from scrapy.exceptions import DropItem
from scrapy import log
class MongoDBPipeline(object):
    def __init__(self):
        connection = pymongo.MongoClient(
            settings['MONGODB_SERVER'],
            settings['MONGODB_PORT']
        )
        db = connection[settings['MONGODB_DB']]
        self.collection = db[settings[‘MONGODB_COLLECTION’]]
    def process_item(self, item, spider):
        valid = True
        for data in item:
            if not data:
                valid = False
                raise DropItem("Missing {0}!".format(data))
        if valid:
            self.collection.insert(dict(item))
            log.msg("Beauty added to MongoDB database!",
                    level=log.DEBUG, spider=spider)
        return item

俗稱管道,這個文件主要用來把咱們獲取的item類型存入mongodb

c. settings.py數據庫

BOT_NAME = 'topitme'
SPIDER_MODULES = ['topitme.spiders']
NEWSPIDER_MODULE = 'topitme.spiders'
BOT_NAME = 'topitme'
ITEM_PIPELINES = ['topitme.pipelines.MongoDBPipeline',]
MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "topitme"
MONGODB_COLLECTION = "beauty"
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'topitme (+http://www.yourdomain.com)'

這裏須要設置一些常量,例如mongodb的數據庫名,數據庫地址和數據庫端口號等等

d. topitme_scrapy.pyjson

from scrapy import Spider
from scrapy.selector import Selector
from topitme.items import TopitmeItem

import sys
reload(sys)
sys.setdefaultencoding(‘utf8’)#設置默認編碼格式

class topitmeSpider(Spider):
    name = "topitmeSpider"
    allowed_domin =["movie.douban.com"]
    start_urls = [
        "http://movie.douban.com/review/latest/",
    ]
    def parse(self, response):
        results = Selector(response).xpath('//ul[@class="tlst clearfix"]')
        for result in results:
            item = TopitmeItem()
            # item['title'] = result.xpath('li[@class="ilst"]/a/@src').extract()[0]
            item['title'] = result.xpath('li[@class="ilst"]/a/@title').extract()[0].encode('utf-8')
            item['dataSrc'] = result.xpath('li[@class="ilst"]/a/img/@src').extract()[0]
            item['filmReview'] = result.xpath('li[@class="clst report-link"]/div[@class="review-short"]/span/text()').extract()[0].encode('utf-8')
            item['dataId'] = result.xpath('li[@class="clst report-link"]/div[@class="review-short"]/@id').extract()[0]
            item['dataId'] = result.xpath('li[@class="nlst"]/h3/a/@title').extract()[0]
            item['startCount'] = 0
            yield item

# ul[@class="tlst clearfix"]/li[3]/div[1]
# //ul[@class="tlst clearfix"]/li[@class="ilst"]/a/img/@src

這個文件是爬蟲程序的主要代碼,首先咱們定義了一個類名爲topitmeSpider的類,繼承自Spider類,而後這個類有3個基礎的屬性,name表示這個爬蟲的名字,等一下咱們在命令行狀態啓動爬蟲的時候,爬蟲的名字就是name規定的。
allowed_domin意思就是指在movie.douban.com這個域名爬東西。
start_urls是一個數組,裏面用來保存須要爬的頁面,目前咱們只須要爬首頁。因此只有一個地址。
而後def parse就是定義了一個parse方法(確定是override的,我以爲父類裏確定有一個同名方法),而後在這裏進行解析工做,這個方法有一個response參數,你能夠把response想象成,scrapy這個框架在把start_urls裏的頁面下載了,而後response裏所有都是html代碼和css代碼。這之中最主要的是涉及一個xpath的東西,XPath即爲XML路徑語言,它是一種用來肯定XML(標準通用標記語言的子集)文檔中某部分位置的語言。能夠經過xpath定位到咱們想要獲取的元素。
  • 服務器

使用python的flask框架實現flask

from flask import Flask, request
import json
from bson import json_util
from bson.objectid import ObjectId
import pymongo

app = Flask(__name__)

client = pymongo.MongoClient()
db = client['topitme']
def toJson(data):
    return json.dumps(data, default=json_util.default)

@app.route('/FilmReview', methods=['GET'])

def findMovie():
    if request.method == 'GET':
        json_results = []
        for result in results:
            json_results.append(result)
        return toJson(json_results)

if __name__ == '__main__':
    app.run(debug=True)



首先能夠看到代碼,client,db兩個參量是爲了取得數據庫鏈接。
findMovie函數響應http request,而後返回數據庫數據,以JSON形式返回
  • swift

ios的實現就不詳細介紹了,這裏寫這部分只是爲了,驗證結果。swift

運行:

  • 起服務器:

圖片描述

  • 起數據庫:

圖片描述

  • 運行爬蟲:

圖片描述

圖片描述

  • ios運行狀況:

圖片描述

  • 下面是原網站網頁展現,能夠看到所要的數據存儲到數據庫,而且正常顯示出來

圖片描述

相關文章
相關標籤/搜索