scrapy爬蟲框架簡單入門例項(一)
阿新 • • 發佈:2018-11-27
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執行流程大概如下:
- 引擎從排程器中取出一個連結(URL)用於接下來的抓取
- 引擎把URL封裝成一個請求(Request)傳給下載器
- 下載器把資源下載下來,並封裝成應答包(Response)
- 爬蟲解析Response
- 解析出實體(Item),則交給實體管道進行進一步的處理
- 解析出的是連結(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資料物件。