1. 程式人生 > >Scrapy:學習筆記(2)——Scrapy項目

Scrapy:學習筆記(2)——Scrapy項目

rtp body 新的 art 發的 保存信息 就是 desc 讀數

Scrapy:學習筆記(2)——Scrapy項目

1、創建項目

  創建一個Scrapy項目,並將其命名為“demo”

scrapy startproject demo
cd demo

  稍等片刻後,Scrapy為我們生成了一個目錄結構:

  技術分享圖片

  其中,我們目前需要重點關註三個文件:

  • items.py:設置數據存儲模板,用於結構化數據,如:Django的Model。
  • pipelines.py: 定義數據處理行為,如:一般結構化的數據持久化
  • settings.py:配置文件,如:遞歸的層數、並發數,延遲下載等

1.1、明確爬蟲開發的四個步驟

  項目已經創建完成了,為了指導接下來的開發,我們必須明確Scrapy爬蟲的四個步驟:

  1. 新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
  2. 明確目標 (編寫items.py):明確你想要抓取的目標
  3. 制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁
  4. 存儲內容 (pipelines.py):設計管道存儲爬取內容

  所以,接下來我們需要明確目標。

2、明確目標

  以我的博客網站為例,爬取文章的關鍵信息(標題、摘要、上傳時間、閱讀數量)

  技術分享圖片

2.1、編寫items.py文件

  1. 打開 demo 目錄下的 items.py。

  2. Item 定義結構化數據字段,用來保存爬取到的數據,有點像 Python 中的 dict,但是提供了一些額外的保護來減少錯誤。

  3. 可以通過創建一個 scrapy.Item 類, 並且定義類型為 scrapy.Field 的類屬性來定義一個 Item(可以理解成類似於 ORM 的映射關系)。

  正如下面這樣:

import scrapy


class DemoItem(scrapy.Item):
    # define the fields for your item here like:
    postTitle = scrapy.Field()
    postDate = scrapy.Field()
    postDesc = scrapy.Field()
    postNumber = scrapy.Field()

  

3、制作爬蟲

3.1、快速生成爬蟲

  Scrapy提供了相關命令來幫助我們快速生成爬蟲結構,執行下面語句,來生成名為basic的爬蟲:

scrapy genspider basic web

  它的結構如下:

import scrapy

class BasicSpider(scrapy.Spider):
    name = ‘basic‘
    allowed_domains = [‘web‘]
    start_urls = [‘website‘]

    def parse(self, response):
        pass

  它確定了三個強制屬性和方法:

  • name = "basic" 這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。
  • allow_domains = [] 是搜索的域名範圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。
  • start_urls = () 爬取的URL元祖/列表。爬蟲從這裏開始抓取數據,所以,第一次下載的數據將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。
  • parse(self, response) 解析的方法,每個初始URL完成下載後將被調用,調用的時候傳入從每一個URL傳回的Response對象來作為唯一參數,主要作用如下:
    • 負責解析返回的網頁數據(response.body),提取結構化數據(生成item)
    • 生成需要下一頁的URL請求。

3.2、取數據

  我們在前面已經講解了XPath的基本使用,此處不在贅述。

  這一過程,我們需要觀察網頁源代碼。首先每一頁的博客是根據日期可以分為幾大塊,然後每一塊內依次排列這每一篇文章的各項信息。

  技術分享圖片

  根據抽象出的結構,我們取出數據要爬出的數據。

import scrapy
from demo.items import DemoItem


class BasicSpider(scrapy.Spider):
    name = ‘basic‘
    allowed_domains = [‘web‘]
    start_urls = [‘https://www.cnblogs.com/MrSaver/default.html?page=1‘]

    def parse(self, response):
        posts = response.xpath(‘//div[@class="day"]‘)
        result = []
        for each_day_post in posts:
            day_postTitles = each_day_post.xpath(‘./div[@class="postTitle"]/a[@class="postTitle2"]/text()‘).extract();
            day_postDescs = each_day_post.xpath(‘./div[@class="postDesc"]/text()‘).extract();
            if isinstance(day_postTitles, list):
                if (len(day_postTitles) == 1):
                    tmp = DemoItem()
                    tmp[‘postTitle‘] = day_postTitles
                    tmp[‘postDesc‘] = day_postDesc
                    result.append(tmp);
                else:
                    for i in range(len(day_postTitles)):
                        tmp = DemoItem()
                        tmp[‘postTitle‘] = day_postTitles[i]
                        tmp[‘postDesc‘] = day_postDesc[i]
                        result.append(tmp);
        return result

  

4、保存數據

scrapy保存信息的最簡單的方法主要有四種,-o 輸出指定格式的文件,命令如下:

scrapy crawl basic -o items.json

json lines格式,默認為Unicode編碼

scrapy crawl basic -o items.jsonl

csv 逗號表達式,可用Excel打開

scrapy crawl basic -o items.csv

xml格式

scrapy crawl basic -o items.xml

  

Scrapy:學習筆記(2)——Scrapy項目