天天看點

Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

上個部落格寫了:  Scrapy的概念以及Scrapy的詳細工作流程 Scrapy架構的學習(1.scrapy的概念以及scrapy的工作流程)_還是那個同偉偉的部落格-CSDN部落格

1.scrapy的安裝  pip install scrapy

 2.建立Scarpy項目:

   在cmd中進入到想要建立Scrapy項目的路徑下(最好在已經建立好的pycharm的工程路徑下,就不用導入Python編譯器等):    輸入指令建立:scrapy startproject scrapy的項目名稱

Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)
 建立之後,可以在pycharm中檢視已經建立了什麼,一個
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

 items.py  可以預先定義好爬取那些字段

 middlewares.py  : 中間鍵

 pipelines.py:  管道  , 進行資料的處理以及儲存

 settings.py  :  整個項目的設定

spiders檔案夾;  建立好的爬蟲,建立好是空的

3.生成一個爬蟲   

   首先cd 建立的scrapy的項目名

   然後  scrapy  genspider   爬蟲名   域名(即爬取的範圍)

Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)
然後進入到pycharm中檢視生成的東西:
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

4.然後就可以寫爬蟲了,  這是一個專門測試scrapy的爬蟲網站 :Quotes to Scrape  裡面是一些名言名句

   在剛才建立好的爬蟲名字的py檔案裡面寫。

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


class ScrapetestSpider(scrapy.Spider):
    name = 'scrapeTest'  # 爬蟲名
    '''允許爬取的範圍'''
    allowed_domains = ['quotes.toscrape.com']
    '''最開始請求的url位址'''
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        """處理start_url位址對應的響應"""
        # 爬取頁面上的名言
        ret1 = response.xpath("//span[@class='text']//text()")
        print(ret1)
           
  然後列印出這個名言, 
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

5.  啟動爬蟲的架構:

首先cmd中進入到你剛才建立的項目路徑下。

 輸入指令: scrapy crawl 爬蟲名

(1)會列印出很多的東西,包括日志等等,

Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)
(2)看着有點亂,我們可以在settings.py加入下面設定
LOG_LEVEL = "WARNING"
           
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)
然後在執行指令就可以了  : scrapy crawl 爬蟲名
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

 可以看到爬取的資料都在一個清單當中,清單當中的每個元素是一個Selector對象,

(3). 直接取出當中的資料  extract()方法,可以在代碼中這樣寫

ret1 = response.xpath("//span[@class='text']//text()").extract()
           
然後在執行啟動架構,運作指令,可以看到資料就取出來了 
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)
  有關取值:
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

 當使用extrat_first()的時候,如果xpath寫錯的話,取值的會是一個空值,None

6. pipelines管道的使用,   

  首先要在pipelines裡面開啟  ,在settings.py裡面把這個注釋去掉就行

Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

是一個字典, 鍵代表位置,值代表距離引擎的遠近,即權重

 對值的解釋:  我們可以定義多個pipeline,資料會先進行一個pipeline再進行一個pipeline,進入的pipeline的先後順序就可以通過值來指定。值越小會先執行

  爬蟲名字.py:

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


class ScrapetestSpider(scrapy.Spider):
    name = 'scrapeTest'  # 爬蟲名
    '''允許爬取的範圍'''
    allowed_domains = ['quotes.toscrape.com']
    '''最開始請求的url位址'''
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        """處理start_url位址對應的響應"""
        # 爬取頁面上的名言
        text = response.xpath("//span[@class='text']//text()").extract()
        # 爬取頁面上的作者
        aut = response.xpath("//small[@class='author']//text()").extract()
        for li in range(len(text)):
            item = {}
            item["author"] = aut[li]
            item["text"] = text[li]
            yield item
           
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)
pipelines.py:      
# -*- 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

import json
class MyspiderPipeline(object):
    def process_item(self, item, spider):
        with open("text.txt",'a') as f:
            f.write(json.dumps(item,ensure_ascii=False)+"\n")
        return item

    print("儲存資料成功")
           
然後開啟架構,檢視儲存的資料text.txt
Scrapy架構的學習(2.scrapy入門,簡單爬取頁面,并使用管道(pipelines)儲存資料)

繼續閱讀