新增Scrapy專案
請執行『開始/Anaconda3(64-bits)/Anaconda Prompt』命令開啟Anaconda Prompt命令提示字元視窗後,輸入cd指令切換至欲新增專案的工作目錄,筆者是放在「\BigData\Cho8」資料夾,請依自己的狀況切換資料夾,若要切換到其他磁碟機,請在cd之後輸入Id,切換到工作目錄後,再輸入 scrapy startproject 指令新増 Scrapy 專案,在之後的参數是專案名稱Ch8_3,如下所示:
(base) C: \Users \JOE>cd \BigData\Ch08
(base) C: \BigData\Ch08>scrapy startprojectCh8_3
新增Python爬蟲程式
在成功新增 Ch8_3 專案後,我們需要在「spiders\」目錄新增Python爬蟲程式,請使用cd指令切換至專案目Ch8_3,然後輸入 scrapy genspider指令新増Python爬蟲程式,如下所示:
(base) C: \BigData\Ch08>cd Ch8_3 Enter
(base) C: \BigData\Ch08\Ch8_3>scrapy genspider pttnba ptt.cc Enter
上述指令的第1個參數 ptnba是爬蟲名稱,專案會在「spiders\」目錄新增同名 pttnba.py 程式檔案,最後是欲爬取的網域。
撰寫爬蟲程式擷取資料
在新增 pttnba,py爬蟲程式後,我們可以開始撰寫 parse()函數來取出每一篇發文的標題文字、推文數和作者。
mport scrapy
class PttnbaSpider (scrapy.Spider):
name = 'pttnba'
allowed_domains = ['ptt.cc']
start_urls = ['https://www.ptt.cc/bbs/NBA/index.html']
def parse (self, response):
上述 PttnbaSpider 類別的 name 屬性值是'pttnba',這是爬蟲程式名稱,之後需要使用此名稱來執行爬蟲程式,然後是allowed_domains屬性的允許網域清單,和 start_urls 屬性的開始爬蟲的網址,最後是 parse()函數:
def parse (self, response) :
titles = response.css ("div.r-ent > div.title > a::text"). extract ()
votes = response.xpath ("//div|@class='nrec']/span/text () "). extract ()
authors = response. xpath ("//div[@class='meta']/div[1]/text () "). extract ()
for item in zip(titles, votes, authors):
scraped_info = {
"title" : item[0],
"vote" : item[1],
"author":item[2],
}
yield scraped_info
上述函數參數是回應的 response 物件,我們可以使用css()或 xpath()函數取出標題文字、推文數和作者,在for/in迴圈使用 zip()函數先將取回資料打包成元組後,再一一取出資料建立成 scraped_info字典,即從每一篇發文取出的資料,最後呼叫yield傳回scraped_info字典。
yield scraped_info
上述 yield 是 Python 關鍵字,類似函數的 return 關鍵字可以回傳資料,只是傳回的是產生器,如同 for/in迴圈的range()函數。