1. 程式人生 > >scrapy爬蟲框架簡單入門例項(一)

scrapy爬蟲框架簡單入門例項(一)

scrapy是一個用於爬取網站資料,提取結構性資料的python應用框架。爬取的資料一般用於資料分析,資料處理,儲存歷史資料等。scrapy的整體架構大致如下:

主要包括了以下元件:

  • 引擎(Scrapy)
  • 用來處理整個系統的資料流, 觸發事務(框架核心)
  • 排程器(Scheduler)
  • 用來接受引擎發過來的請求, 壓入佇列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是連結)的優先佇列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
  • 下載器(Downloader)
  • 用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的非同步模型上的)
  • 爬蟲(Spiders)
  • 爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的資訊, 即所謂的實體(Item)。使用者也可以從中提取出連結,讓Scrapy繼續抓取下一個頁面
  • 專案管道(Pipeline)
  • 負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的資訊。當頁面被爬蟲解析後,將被髮送到專案管道,並經過幾個特定的次序處理資料。
  • 下載器中介軟體(Downloader Middlewares)
  • 位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中介軟體(Spider Middlewares)
  • 介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
  • 排程中介軟體(Scheduler Middewares)
  • 介於Scrapy引擎和排程之間的中介軟體,從Scrapy引擎傳送到排程的請求和響應。 

scrapy執行流程大概如下:

  1. 引擎從排程器中取出一個連結(URL)用於接下來的抓取
  2. 引擎把URL封裝成一個請求(Request)傳給下載器
  3. 下載器把資源下載下來,並封裝成應答包(Response)
  4. 爬蟲解析Response
  5. 解析出實體(Item),則交給實體管道進行進一步的處理
  6. 解析出的是連結(URL),則把URL交給排程器等待抓取

---------------------------------------------------------------------------------------------------------------------------------------------------

紙上得來終覺淺,絕知此事要躬行。安裝好scrapy框架後直接寫一個例項吧,首先在你想儲存專案程式碼的目錄下執行如下命令:

scrapy startproject '你的專案名稱'

現在已經建立了一個爬蟲專案,但是還需要建立一個爬蟲程式,繼續執行如下命令:(一般建立爬蟲檔案時,以網站域名命名)

cd '剛才建立的專案名稱'
scrapy genspider '爬蟲名稱'

建立的目錄及檔案:

  • scrapy.cfg  專案的配置資訊,主要為scrapy命令列工具提供一個基礎的配置資訊。(真正爬蟲相關的配置資訊在settings.py檔案中)
  • items.py    設定資料儲存模板,用於結構化資料。
  • pipelines    資料處理行為,如:儲存資料寫入檔案
  • settings.py 配置檔案,如:遞迴的層數、併發數,延遲下載等
  • spiders      爬蟲目錄,如:建立檔案,編寫爬蟲規則

好了,基本工作都做完了,現在分析一下要爬取的目標網站,這裡我選擇新浪的雙色球網站,爬取指定期數的雙色球中獎號資料;這裡涉及到一個表單提交,用瀏覽器抓一下請求看看提交的地址和欄位:

開始編寫爬蟲,定義一個Spider,只需繼承scrapy.Spider類並定於一些屬性:

(開啟在"專案名稱"/spiders資料夾下面的"建立的爬蟲".py)

  • name: Spider名稱,必須是唯一的
  • start_urls: 初始化下載連結URL
  • parse(): 用來解析下載後的Response物件,Response也是這個方法的唯一引數。 它負責解析返回頁面資料並提取出相應的Item(返回Item物件),還有其他合法的連結URL(返回Request物件)。
class SsqSpider(scrapy.Spider):
    name = 'ssq'
    allowed_domains = ['http://zst.aicai.com/ssq/']  # 爬取域名
    # start_urls = ['http://zst.aicai.com/ssq/']
    # 爬取網址,只適於不需要提交cookie的網站,因為沒法設定cookie等資訊
    scope_date = [['2012001', '2014200'], [
        '2015001', '2017200'], ['2018001', '2018130']]

    # 設定瀏覽器使用者代理
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'}

    def start_requests(self):
        # 第一次請求頁面,設定開啟cookie使其得到cookie,設定回撥函式
        return [Request('http://zst.aicai.com/ssq/', meta={'cookiejar': 1}, callback=self.parse)]

    def parse(self, response):
        print('請求頭資訊')
        print(response.request.headers)
        print('響應頭資訊')
        print(response.headers)
        print(response.status)
        print('---Cookie---')
        # 請求Cookie
        request_Cookie = response.request.headers.getlist('Cookie')
        print(request_Cookie)
        # 響應Cookie
        response_Cookie = response.headers.getlist('Set-Cookie')
        print(response_Cookie)
        print('---end---')

現在可以執行爬蟲檢視返回的Response物件了,執行命令:

scrapy crawl '爬蟲名稱'

後面的文章再繼續介紹,從Response物件中提取出我們需要的Item資料物件。