中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于pyspider的用法

發布時間:2020-08-03 09:44:35 來源:億速云 閱讀:290 作者:清晨 欄目:編程語言

小編給大家分享一下關于pyspider的用法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學習,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學習方法吧!

pyspider 用法詳解

前面我們了解了 pyspider 的基本用法,我們通過非常少的代碼和便捷的可視化操作就完成了一個爬蟲的編寫,本節我們來總結一下它的詳細用法。

1. 命令行

上面的實例通過如下命令啟動 pyspider:

pyspider all

命令行還有很多可配制參數,完整的命令行結構如下所示:

pyspider [OPTIONS] COMMAND [ARGS]

其中,OPTIONS 為可選參數,它可以指定如下參數。

Options:
  -c, --config FILENAME    指定配置文件名稱
  --logging-config TEXT    日志配置文件名稱,默認: pyspider/pyspider/logging.conf
  --debug             開啟調試模式
  --queue-maxsize INTEGER  隊列的最大長度
  --taskdb TEXT         taskdb 的數據庫連接字符串,默認: sqlite
  --projectdb TEXT         projectdb 的數據庫連接字符串,默認: sqlite
  --resultdb TEXT          resultdb 的數據庫連接字符串,默認: sqlite
  --message-queue TEXT     消息隊列連接字符串,默認: multiprocessing.Queue
  --phantomjs-proxy TEXT   PhantomJS 使用的代理,ip:port 的形式
  --data-path TEXT         數據庫存放的路徑
  --version                pyspider 的版本
  --help                   顯示幫助信息

例如,-c 可以指定配置文件的名稱,這是一個常用的配置,配置文件的樣例結構如下所示:

{
  "taskdb": "mysql+taskdb://username:password@host:port/taskdb",
  "projectdb": "mysql+projectdb://username:password@host:port/projectdb",
  "resultdb": "mysql+resultdb://username:password@host:port/resultdb",
  "message_queue": "amqp://username:password@host:port/%2F",
  "webui": {
    "username": "some_name",
    "password": "some_passwd",
    "need-auth": true
  }
}

如果要配置 pyspider WebUI 的訪問認證,可以新建一個 pyspider.json,內容如下所示:

{
  "webui": {
    "username": "root",
    "password": "123456",
    "need-auth": true
  }
}

這樣我們通過在啟動時指定配置文件來配置 pyspider WebUI 的訪問認證,用戶名為 root,密碼為 123456,命令如下所示:

pyspider -c pyspider.json all

運行之后打開:http://localhost:5000/,頁面如 12-26 所示:

關于pyspider的用法

圖 12-26 運行頁面

也可以單獨運行 pyspider 的某一個組件。

運行 Scheduler 的命令如下所示:

pyspider scheduler [OPTIONS]

運行時也可以指定各種配置,參數如下所示:

Options:
  --xmlrpc /--no-xmlrpc
  --xmlrpc-host TEXT
  --xmlrpc-port INTEGER
  --inqueue-limit INTEGER  任務隊列的最大長度,如果滿了則新的任務會被忽略
  --delete-time INTEGER    設置為 delete 標記之前的刪除時間
  --active-tasks INTEGER   當前活躍任務數量配置
  --loop-limit INTEGER     單輪最多調度的任務數量
  --scheduler-cls TEXT     Scheduler 使用的類
  --help              顯示幫助信息

運行 Fetcher 的命令如下所示:

pyspider fetcher [OPTIONS]

參數配置如下所示:

Options:
  --xmlrpc /--no-xmlrpc
  --xmlrpc-host TEXT
  --xmlrpc-port INTEGER
  --poolsize INTEGER     同時請求的個數
  --proxy TEXT         使用的代理
  --user-agent TEXT      使用的 User-Agent
  --timeout TEXT        超時時間
  --fetcher-cls TEXT     Fetcher 使用的類
  --help             顯示幫助信息

運行 Processer 的命令如下所示:

pyspider processor [OPTIONS]

參數配置如下所示:

Options:
  --processor-cls TEXT  Processor 使用的類
  --help           顯示幫助信息

運行 WebUI 的命令如下所示:

pyspider webui [OPTIONS]

參數配置如下所示:

Options:
  --host TEXT         運行地址
  --port INTEGER       運行端口
  --cdn TEXT          JS 和 CSS 的 CDN 服務器
  --scheduler-rpc TEXT   Scheduler 的 xmlrpc 路徑
  --fetcher-rpc TEXT     Fetcher 的 xmlrpc 路徑
  --max-rate FLOAT      每個項目最大的 rate 值
  --max-burst FLOAT     每個項目最大的 burst 值
  --username TEXT       Auth 驗證的用戶名
  --password TEXT       Auth 驗證的密碼
  --need-auth          是否需要驗證
  --webui-instance TEXT    運行時使用的 Flask 應用
  --help             顯示幫助信息

這里的配置和前面提到的配置文件參數是相同的。如果想要改變 WebUI 的端口為 5001,單獨運行如下命令:

pyspider webui --port 5001

或者可以將端口配置到 JSON 文件中,配置如下所示:

{
  "webui": {"port": 5001}
}

使用如下命令啟動同樣可以達到相同的效果:

pyspider -c pyspider.json webui

這樣就可以在 5001 端口上運行 WebUI 了。

2. crawl() 方法

在前面的例子中,我們使用 crawl() 方法實現了新請求的生成,但是只指定了 URL 和 Callback。這里將詳細介紹一下 crawl() 方法的參數配置。

url

url 是爬取時的 URL,可以定義為單個 URL 字符串,也可以定義成 URL 列表。

callback

callback 是回調函數,指定了該 URL 對應的響應內容用哪個方法來解析,如下所示:

def on_start(self):
    self.crawl('http://scrapy.org/', callback=self.index_page)

這里指定了 callback 為 index_page,就代表爬取 http://scrapy.org/ 鏈接得到的響應會用 index_page() 方法來解析。

index_page() 方法的第一個參數是響應對象,如下所示:

def index_page(self, response):
    pass

方法中的 response 參數就是請求上述 URL 得到的響應對象,我們可以直接在 index_page() 方法中實現頁面的解析。

age

age 是任務的有效時間。如果某個任務在有效時間內且已經被執行,則它不會重復執行,如下所示:

def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               age=10*24*60*60)

或者可以這樣設置:

@config(age=10 * 24 * 60 * 60)
def callback(self):
    pass

默認的有效時間為 10 天。

priority

priority 是爬取任務的優先級,其值默認是 0,priority 的數值越大,對應的請求會越優先被調度,如下所示:

def index_page(self):
    self.crawl('http://www.example.org/page.html', callback=self.index_page)
    self.crawl('http://www.example.org/233.html', callback=self.detail_page,
               priority=1)

第二個任務會優先調用,233.html 這個鏈接優先爬取。

exetime

exetime 參數可以設置定時任務,其值是時間戳,默認是 0,即代表立即執行,如下所示:

import time
def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               exetime=time.time()+30*60)

這樣該任務會在 30 分鐘之后執行。

retries

retries 可以定義重試次數,其值默認是 3。

itag

itag 參數設置判定網頁是否發生變化的節點值,在爬取時會判定次當前節點是否和上次爬取到的節點相同。如果節點相同,則證明頁面沒有更新,就不會重復爬取,如下所示:

def index_page(self, response):
    for item in response.doc('.item').items():
        self.crawl(item.find('a').attr.url, callback=self.detail_page,
                   itag=item.find('.update-time').text())

在這里設置了更新時間這個節點的值為 itag,在下次爬取時就會首先檢測這個值有沒有發生變化,如果沒有變化,則不再重復爬取,否則執行爬取。

auto_recrawl

當開啟時,爬取任務在過期后會重新執行,循環時間即定義的 age 時間長度,如下所示:

def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               age=5*60*60, auto_recrawl=True)

這里定義了 age 有效期為 5 小時,設置了 auto_recrawl 為 True,這樣任務就會每 5 小時執行一次。

method

method 是 HTTP 請求方式,它默認是 GET。如果想發起 POST 請求,可以將 method 設置為 POST。

params

我們可以方便地使用 params 來定義 GET 請求參數,如下所示:

def on_start(self):
    self.crawl('http://httpbin.org/get', callback=self.callback,
               params={'a': 123, 'b': 'c'})
    self.crawl('http://httpbin.org/get?a=123&b=c', callback=self.callback)

這里兩個爬取任務是等價的。

data

data 是 POST 表單數據。當請求方式為 POST 時,我們可以通過此參數傳遞表單數據,如下所示:

def on_start(self):
    self.crawl('http://httpbin.org/post', callback=self.callback,
               method='POST', data={'a': 123, 'b': 'c'})

files

files 是上傳的文件,需要指定文件名,如下所示:

def on_start(self):
    self.crawl('http://httpbin.org/post', callback=self.callback,
               method='POST', files={field: {filename: 'content'}})

user_agent

user_agent 是爬取使用的 User-Agent。

headers

headers 是爬取時使用的 Headers,即 Request Headers。

cookies

cookies 是爬取時使用的 Cookies,為字典格式。

connect_timeout

connect_timeout 是在初始化連接時的最長等待時間,它默認是 20 秒。

timeout

timeout 是抓取網頁時的最長等待時間,它默認是 120 秒。

allow_redirects

allow_redirects 確定是否自動處理重定向,它默認是 True。

validate_cert

validate_cert 確定是否驗證證書,此選項對 HTTPS 請求有效,默認是 True。

proxy

proxy 是爬取時使用的代理,它支持用戶名密碼的配置,格式為 username:password@hostname:port,如下所示:

def on_start(self):
    self.crawl('http://httpbin.org/get', callback=self.callback, proxy='127.0.0.1:9743')

也可以設置 craw_config 來實現全局配置,如下所示:

class Handler(BaseHandler):
    crawl_config = {'proxy': '127.0.0.1:9743'}

fetch_type

fetch_type 開啟 PhantomJS 渲染。如果遇到 JavaScript 渲染的頁面,指定此字段即可實現 PhantomJS 的對接,pyspider 將會使用 PhantomJS 進行網頁的抓取,如下所示:

def on_start(self):
    self.crawl('https://www.taobao.com', callback=self.index_page, fetch_type='js')

這樣我們就可以實現淘寶頁面的抓取了,得到的結果就是瀏覽器中看到的效果。

js_script

js_script 是頁面加載完畢后執行的 JavaScript 腳本,如下所示:

def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               fetch_type='js', js_script='''
               function() {window.scrollTo(0,document.body.scrollHeight);
                   return 123;
               }
               ''')

頁面加載成功后將執行頁面混動的 JavaScript 代碼,頁面會下拉到最底部。

js_run_at

js_run_at 代表 JavaScript 腳本運行的位置,是在頁面節點開頭還是結尾,默認是結尾,即 document-end。

js_viewport_width/js_viewport_height

js_viewport_width/js_viewport_height 是 JavaScript 渲染頁面時的窗口大小。

load_images

load_images 在加載 JavaScript 頁面時確定是否加載圖片,它默認是否。

save

save 參數非常有用,可以在不同的方法之間傳遞參數,如下所示:

def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               save={'page': 1})
def callback(self, response):
    return response.save['page']

這樣,在 on_start() 方法中生成 Request 并傳遞額外的參數 page,在回調函數里可以通過 response 變量的 save 字段接收到這些參數值。

cancel

cancel 是取消任務,如果一個任務是 ACTIVE 狀態的,則需要將 force_update 設置為 True。

force_update

即使任務處于 ACTIVE 狀態,那也會強制更新狀態。

以上便是 crawl() 方法的參數介紹,更加詳細的描述可以參考:http://docs.pyspider.org/en/latest/apis/self.crawl/。

3. 任務區分

在 pyspider 判斷兩個任務是否是重復的是使用的是該任務對應的 URL 的 MD5 值作為任務的唯一 ID,如果 ID 相同,那么兩個任務就會判定為相同,其中一個就不會爬取了。很多情況下請求的鏈接可能是同一個,但是 POST 的參數不同。這時可以重寫 task_id() 方法,改變這個 ID 的計算方式來實現不同任務的區分,如下所示:

import json
from pyspider.libs.utils import md5string
def get_taskid(self, task):
    return md5string(task['url']+json.dumps(task['fetch'].get('data', '')))

這里重寫了 get_taskid() 方法,利用 URL 和 POST 的參數來生成 ID。這樣一來,即使 URL 相同,但是 POST 的參數不同,兩個任務的 ID 就不同,它們就不會被識別成重復任務。

4. 全局配置

pyspider 可以使用 crawl_config 來指定全局的配置,配置中的參數會和 crawl() 方法創建任務時的參數合并。如要全局配置一個 Headers,可以定義如下代碼:

class Handler(BaseHandler):
    crawl_config = {
        'headers': {'User-Agent': 'GoogleBot',}
    }

5. 定時爬取

我們可以通過 every 屬性來設置爬取的時間間隔,如下所示:

@every(minutes=24 * 60)
def on_start(self):
    for url in urllist:
        self.crawl(url, callback=self.index_page)

這里設置了每天執行一次爬取。

在上文中我們提到了任務的有效時間,在有效時間內爬取不會重復。所以要把有效時間設置得比重復時間更短,這樣才可以實現定時爬取。

例如,下面的代碼就無法做到每天爬取:

@every(minutes=24 * 60)
def on_start(self):
    self.crawl('http://www.example.org/', callback=self.index_page)
@config(age=10 * 24 * 60 * 60)
def index_page(self):
    pass

這里任務的過期時間為 10 天,而自動爬取的時間間隔為 1 天。當第二次嘗試重新爬取的時候,pyspider 會監測到此任務尚未過期,便不會執行爬取,所以我們需要將 age 設置得小于定時時間。

6. 項目狀態

每個項目都有 6 個狀態,分別是 TODO、STOP、CHECKING、DEBUG、RUNNING、PAUSE。

TODO:它是項目剛剛被創建還未實現時的狀態。

STOP:如果想停止某項目的抓取,可以將項目的狀態設置為 STOP。

CHECKING:正在運行的項目被修改后就會變成 CHECKING 狀態,項目在中途出錯需要調整的時候會遇到這種情況。

DEBUG/RUNNING:這兩個狀態對項目的運行沒有影響,狀態設置為任意一個,項目都可以運行,但是可以用二者來區分項目是否已經測試通過。

PAUSE:當爬取過程中出現連續多次錯誤時,項目會自動設置為 PAUSE 狀態,并等待一定時間后繼續爬取。

7. 抓取進度

在抓取時,可以看到抓取的進度,progress 部分會顯示 4 個進度條,如圖 12-27 所示。

關于pyspider的用法

圖 12-27 抓取進度

progress 中的 5m、1h、1d 指的是最近 5 分、1 小時、1 天內的請求情況,all 代表所有的請求情況。

藍色的請求代表等待被執行的任務,綠色的代表成功的任務,黃色的代表請求失敗后等待重試的任務,紅色的代表失敗次數過多而被忽略的任務,從這里我們可以直觀看到爬取的進度和請求情況。

8. 刪除項目

pyspider 中沒有直接刪除項目的選項。如要刪除任務,那么將項目的狀態設置為 STOP,將分組的名稱設置為 delete,等待 24 小時,則項目會自動刪除。

以上是關于pyspider的用法的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

佛冈县| 济源市| 义乌市| 乌兰县| 华阴市| 西华县| 阿城市| 澄江县| 临朐县| 桂阳县| 安平县| 华蓥市| 邮箱| 明溪县| 镇远县| 昔阳县| 全州县| 东台市| 宾阳县| 遵义市| 贵德县| 洛川县| 白沙| 乐都县| 福贡县| 班戈县| 英德市| 济南市| 杭州市| 环江| 台东县| 蓬安县| 通许县| 天津市| 南木林县| 岗巴县| 如皋市| 福贡县| 福州市| 盐亭县| 庆安县|