scrapy入門

由於公司項目需求,須要作一個爬蟲。因此我一個python小白就被拉去作了爬蟲。花了兩週時間,拼拼湊湊總算趕出來了。因此寫個blog作個記錄。

快速入門

首先,初步要作的就是快速構建一個爬蟲。html

配置環境

Mac下安裝

1) 直接從官網下載
python下載官網python

2) 是經過brew安裝
首先安裝xcode
能夠選擇在App Store安裝或者使用xcode-select --install這個命令安裝git

接着安裝brewgithub

usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

把這個命令輸入終端運行就能夠安裝了
brew官網docker

接着利用brew安裝python3
brew install python3數據庫

安裝完python3之後,咱們來裝scrapy。由於python3是自帶pip3的,
因此若是找不到該命令的話,能夠去看看python3的安裝路徑。brew是將其安裝在了\usr\local\bin這個目錄下。bootstrap

若是pip沒安裝上的話,不要慌。咱們還能夠經過命令來安裝windows

curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

接下來安裝scrapy
輸入命令pip3 install Scrapy就能夠了xcode

windows下安裝

首先從官網上下載msi文件
在安裝選項中勾選上須要pipruby

而後在cmd中輸入
pip3 install Scrapy

完成

Linux安裝

sudo get-apt install python36 python36-devel gcc
sudo pip3 install Scrapy

兩條命令就搞定了。
由於個人爬蟲是跑在docker上,有些鏡像可能沒有gcc。因此須要devel和gcc,不然有些包會安不上。切記

Redhat系的話,只須要把get-apt改爲yum就能夠了


快速開始

  1. 創建項目 scrapy startproject demo
  2. 創建爬蟲 scrapy genspider demo_spider www.google.com
  3. 啓動爬蟲 scrapy crwal demo_spider

當你創建完項目的時候,scrapy會幫你生成一堆文件。

目錄結構是這樣的
clipboard.png

在你的demo項目中,會有個scrapy.cfg的配置文件和一個demo的文件夾

scrapy.cfg這個文件咱們先暫時不去關心。咱們來關心一下demo文件夾下的東西
分別是items.py,middlewares.py,pipelines.py,settings.py和一個spiders文件夾。

接着咱們去spiders目錄下去建立一個爬蟲scrapy genspider demo_spider www.google.com

clipboard.png

OK,爬蟲生成功了。


spider初步解析

咱們來初步解析一下這個爬蟲。
有一個DemoSpiderSpider的類。很明顯,這個是咱們剛纔生成爬蟲的名字爲demo_spider而後後面又添加了一個Spider。

接着往下看,有個name的屬性,這個屬性很重要,咱們到時候啓動爬蟲的時候,就要經過這個name來告知scarpy啓動的是哪一個爬蟲

allowed_demains是用來指定,咱們只爬取哪些域名下的。好比說,我在爬取google的搜索結果的時候,會爬到不少別的網站,這個屬性就是用來告知,除了www.google.com之外的,我都不爬取。

start_urls是用來作啓動url,看命名就知道了。能夠把Scrapy的爬取過程當作一個廣度搜索。因此它會先迅速把start_urls下的全部url都爬取一遍。而後把結果加入到一個隊列中。也是由於這個緣由,因此在作併發爬蟲時,會讓不一樣的爬蟲的start_urls不同。固然還有重複的問題要解決(笑)

接下來就是parse方法了,咱們對頁面的爬取也是在這個parse中解決


向外走

初步理解了spider,咱們往外層走。

咱們首先來假想幾個問題,若是我是Scrapy框架的設計者,我會這麼設計這個框架。
既然是通用的爬蟲框架,那用戶是否是應該能夠操做header之類的,讓個人每個爬蟲都通過代理,或者是設置不一樣的cookie。

噹噹噹,因此就有了中間件。middlewares.py
咱們來看看Scrapy生成的是什麼樣的。

clipboard.png

clipboard.png

既然是入門,咱們確定是先關心咱們須要的。看第二張圖。有這麼幾個幹方法process_request,process_response,process_exception
處理request,response,exception。很好,咱們就要這幾個東西。

咱們能夠這麼理解,咱們的爬蟲爬到的每個頁面,都會通過這些中間件。

來看看架構圖
Scrapy架構圖

因此咱們的數據是通過每個中間件。而後中間件來決定去留。

而後咱們來想一想具體process_request下的狀況。

  1. 第一種,我修改了代理,可是我只是改了代理,我還須要把這個數據繼續下去。返回None
  2. 第二種,這個已經處理好了,如今我須要想直接把數據發給spider了,這個時候,咱們就須要返回一個response了。
  3. 第三種,我想要從新調度個人request.這時候只要返回request。調度器會終止process_request,而後用這個request從新開始。
  4. 第四種,這個數據我直接丟棄了,不想用了。直接raise一個IgnoreRequest,也就是,若是你不處理這個異常,這異常就直接扔了。固然,你還能夠選擇在process_exception去處理這個異常

Python爬蟲從入門到放棄(十七)之 Scrapy框架中Download Middleware用法


初步理解了中間件,咱們來講說items
spider處理完數據之後,寫入item中,而後就來到了這兒。
scrapy生成的代碼

clipboard.png

怎麼用呢。舉個例子,我在spider中須要存儲url。因而我在這個文件中就寫入
url = scrapy.Field
接着在spider中生成這個item。而後將item['url'] = url,在處理完了之後。yield item
完成

這個數據呢,就會交給pipelines來處理


接着,咱們來看看pipelines

clipboard.png

咱們和剛纔同樣,思考一下,數據拿過來有幾種可能。

  1. 數據不是個人,我不處理。OK,我直接返回itme
  2. 數據是個人,可是數據錯了。扔掉。raise一個DropItem就能夠了

這邊呢,若是要寫入數據庫,玩玩寫入的時間特別長,因此推薦使用Twisted來作一個異步寫入


最後。咱們來看看settings

clipboard.png

配置文件,好比是否遵照robots.txt之類的。固然,你剛纔寫的全部middlewarespipelines。都要在這兒註冊!!!!隨便給它一個不重複的數字就行了

相關文章
相關標籤/搜索