Scrapy:學習筆記(2)——Scrapy項目
阿新 • • 發佈:2019-03-24
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爬蟲的四個步驟:
- 新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
- 明確目標 (編寫items.py):明確你想要抓取的目標
- 制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁
- 存儲內容 (pipelines.py):設計管道存儲爬取內容
所以,接下來我們需要明確目標。
2、明確目標
以我的博客網站為例,爬取文章的關鍵信息(標題、摘要、上傳時間、閱讀數量)
2.1、編寫items.py文件
-
打開 demo 目錄下的 items.py。
-
Item 定義結構化數據字段,用來保存爬取到的數據,有點像 Python 中的 dict,但是提供了一些額外的保護來減少錯誤。
-
可以通過創建一個 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項目