關於爬蟲平臺的架構設計實現和框架的選型(一)

關於爬蟲平臺的架構設計實現和框架的選型(一)html

關於爬蟲平臺的架構設計實現和框架的選型(二)--scrapy的內部實現以及實時爬蟲的實現node

 

首先來看一下一個爬蟲平臺的設計,做爲一個爬蟲平臺,須要支撐多種不一樣的爬蟲方式,因此通常爬蟲平臺須要包括python

一、 爬蟲規則的維護,平臺在接收到爬蟲請求時,須要能按照匹配必定的規則去進行自動爬蟲linux

二、 爬蟲的job調度器,平臺須要能負責爬蟲任務的調度,好比定時調度,輪詢調度等。數據庫

三、 爬蟲能夠包括異步的海量爬蟲,也能夠包括實時爬蟲,異步爬蟲指的是爬蟲的數據不會實時返回,可能一個爬蟲任務會執行好久。 實時爬蟲指爬的數據要實時返回,這個就要求時間很短,通常適合少許數據的爬蟲。json

四、 爬蟲好的數據能夠生成指定的文件,好比csv文件,json文件等,而後經過數據處理引擎作統一處理,好比csv文件能夠經過數據交換落入大數據平臺,或者爬蟲好的數據也能夠丟入kafka中,而後再經過流式處理任務(spark或者storm,flink)作爬蟲數據的清洗和處理,處理完的數據,能夠入到數據庫中。瀏覽器

下圖就是在平臺設計時,爬蟲處理的一個流程,這個裏面包含了實時爬蟲,異步爬蟲。bash

 

根據上圖的處理流程,咱們能夠把架構圖進一步演進下架構

 

 

時序圖以下:併發

 

 

 

咱們這裏先介紹異步爬蟲,爬蟲的框架不少,異步爬蟲通常用的比較多就是scrapy。

首先安裝scrapy

pip install scrapy

  

安裝完成後,就能夠經過命令行建立一個基於scrapy的爬蟲項目,咱們以爬取應用寶中理財類APP的名稱爲示例

 

 

 

建立爬蟲項目的命令行命令:

scrapy startproject zj_scrapy

  

而後在命令行中,進入到建立的zj_scrapy目錄下

 

cd zj_scrapy

 

執行
scrapy genspider sjqq 「sj.qq.com」 

  

建立一個爬蟲
爬蟲建立好了後,可使用IDE打開建立好的python項目,好比用idea(須要安裝python插件,默認沒有安裝)打開咱們建立好的項目

項目建立好了後,會默認生成一些模板代碼文件
 
 
 
 一、 
 
 
 
 items.py
items用於存儲字段的定義。即爬取的內容存與item類中,在這裏咱們定義了一個name字段。

# -*- 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 ZjScrapyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    pass

  

 
 
 
 二、 
 
 
 
 spider文件編寫
這個文件通常在spiders 這個package下面,默認會繼承scrapy.Spider

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import HtmlResponse

from zj_scrapy.items import ZjScrapyItem


class SjqqSpider(scrapy.Spider):
    name = 'sjqq'
    allowed_domains = ['sj.qq.com']
    start_urls = ['https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114']

    def parse(self, response:HtmlResponse):
        name_list =  response.xpath('/html/body/div[3]/div[2]/ul/li')
        print("=============",response.headers)
        for each in name_list:
            item = ZjScrapyItem()
            name = each.xpath('./div/div/a[1]/text()').extract()
            item['name'] = name[0]
            yield item
        pass

  關於這段代碼的解釋以下:

 
 
 
 三、 
 
 
 
 pipeline文件編寫
pipeline文件通常用於對處理好的爬蟲結果數據作處理,能夠入到數據庫中,也能夠生成到指定的文件中,process_item 方法就是對數據作處理的。
另外pipeline 還包含了__init__和close_spider 兩個方法。__init__ 用於作初始化處理。  close_spider 用於執行結束時的操做處理。好比數據寫入數據庫或者文件後,對數據庫作連接關閉或者文件流作關閉操做等。
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


class ZjScrapyPipeline(object):
    def process_item(self, item, spider):
        print("+++++++++++++++++++",item['name'])
        print("-------------------",spider.cc)
        return item

  

 
 
 
 四、 
 
 
 
 setting文件修改
setting文件中存放的是爬蟲的配置,經常使用的配置通常能夠包括
1)、ITEM_PIPELINES的配置,好比
ITEM_PIPELINES = {
    'zj_scrapy.pipelines.ZjScrapyPipeline': 300,
}
這裏的300表明了一個優先級,數值範圍通常在0-1000,這個數值肯定了運行的順序,數字越小,優先級越高。
2)、字符集配置,能夠經過FEED_EXPORT_ENCODING指定字符集
FEED_EXPORT_ENCODING = 'utf-8'
3)、CONCURRENT_REQUESTS配置Scrapy執行的最大併發請求數
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32
4)配置請求的header,能夠經過DEFAULT_REQUEST_HEADERS來進行配置
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
}
 
 
 
 五、 
 
 
 
 本地執行爬蟲
在上面的都作完後,能夠經過執行命令行scrapy crawl sjqq -o items.csv 來在本地運行爬蟲,sjqq 就是前面指定的爬蟲名,-o items.csv 表示生成一個csv文件。

 

運行完成後,能夠看到爬取的內容已經寫到了指定的文件中。

在運行時,能夠經過-a 指定自定義的參數,好比scrapy crawl sjqq -o items.csv -a cc=scrapttest
在這條執行命令中,咱們指定了一個cc參數等於scrapttest,在Pipeline
中,咱們能夠經過代碼獲取這個參數

class ZjScrapyPipeline(object):
    def process_item(self, item, spider):
        print("+++++++++++++++++++",item['name'])
        print("-------------------",spider.cc)
        return item

  

在代碼中,咱們經過spider.cc 就能夠獲取到這個參數的值,而後在運行日誌能夠看到,咱們打印出來了這個參數值。

經過這種方式,咱們就解決了爬蟲運行時,參數的的動態傳遞問題。
 
 
 
 六、 
 
 
 
 爬蟲部署到服務端
安裝scrapyd 
pip install scrapyd 

 

安裝scrapyd-deploy
pip install scrapyd-client

 

 
scrapyd scrapy的爬蟲服務端,安裝完成後,執行scrapyd能夠啓動服務端。
啓動時默認端口爲6800

 

 

 

啓動後,經過瀏覽器能夠訪問http://localhost:6800/

服務端啓動後,就能夠經過scrapyd-deploy 來提交部署開發好的爬蟲了。
scrapyd-deploy <target> -p <project>  --version <version>
部署成功後,就能夠看到本身的爬蟲項目了

 

 
 
 
 七、 
 
 
 
 建立服務端的爬蟲任務
若是是在linux命令下,能夠經過
curl http://localhost:6800/schedule.json -d project= zj_scrapy -d spider=sjqq

  




來提交一個爬蟲任務,提交完成後,會返回提交的任務狀態,這個其實就是提交了一個http請求
{
   "node_name": "ZJPH-0321",
   "status": "ok",
   "jobid": "dd7f10aca76e11e99b656c4b90156b7e"
}
提交成功後,能夠在瀏覽器的job下面看到任務的執行狀況

若是須要攜帶自定義的參數,那麼能夠經過-d來指定,好比-d cc=scrapttest,和前面在本地執行時,增長自定義參數是同樣的。
也能夠經過http請求工具(好比soapui)提交一個http請求來觸發一個爬蟲任務

 

schedule.json請求中還能夠包含以下參數
setting (string, optional) –自定義爬蟲settings
jobid (string, optional) jobid,以前啓動過的spider,會有一個id,這個是可選參數
_version (string, optional) –版本號,以前部署的時候的version,只能使用int數據類型,沒指定,默認啓動最新版本
 
 
 
 
 八、 
 
 
 
 scrapyd 其餘的API
1)、curl http://localhost:6800/daemonstatus.json   檢查爬蟲服務的狀態
2)、addversion.json增長項目到服務端  若是項目已經存在,則增長一個新的版本
POST請求:
project (string, required) –項目名
version (string, required) –項目版本,不填寫則是當前時間戳
egg (file, required) –當前項目的egg文件
curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F egg=@myproject.egg
3)、  cancel.json
取消一個 spdier的運行
若是 spider是運行狀態,則中止其運行
若是 spider是掛起狀態,則刪除spider
POST請求:
project (string, required) –項目名
job (string, required) -jobid
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444
4)、listprojects.json
獲取當前已上傳的項目的列表
GET請求:
curl http://localhost:6800/listprojects.json
5)、listversions.json
獲取指定項目的可用版本
GET請求:
project (string, required) –項目名
 curl http://localhost:6800/listversions.json?project=myproject
6)、listspiders.json
獲取指定版本的項目中的爬蟲列表,若是沒有指定版本,則是最新版本
GET請求:
project (string, required) –項目名
_version (string, optional) –版本號
$ curl http://localhost:6800/listspiders.json?project=myproject
7)、 listjobs.json
獲取指定項目中全部掛起、運行和運行結束的job
GET請求
project (string, option) - restrict results to project name
curl http://localhost:6800/listjobs.json?project=myproject | python -m json.tool
8)、delversion.json
刪除指定項目的指定版本
POST請求
project (string, required) - the project name
version (string, required) - the project version
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99
9)、delproject.json
刪除指定項目,而且包括全部的版本
POST請求
project (string, required) - the project name
curl http://localhost:6800/delproject.json -d project=myproject  

 未完待續 第二篇

關於爬蟲平臺的架構設計實現和框架的選型(二)--scrapy的內部實現以及實時爬蟲的實現 

 http://www.javashuo.com/article/p-uscqsijk-dp.html

相關文章
相關標籤/搜索