這里需要提前安裝 Anaconda,安裝之后才能添加 Anaconda 編譯環(huán)境。
第二步,安裝 Scrapy。單擊圖 1 界面右上角綠色加號按鈕,彈出如圖 2 所示的界面。輸入并搜索“scrapy”,然后單擊“Install Package”按鈕。等待,直至出現(xiàn)“Pakage‘scrapy’ installed successfully”:第一步,創(chuàng)建Scrapy爬蟲項目;
第二步,定義一個item容器;
第三步,定義settings文件進(jìn)行基本爬蟲設(shè)置;
第四步,編寫爬蟲邏輯;
第五步,代碼調(diào)試。
scrapy startproject stockstar
其中 scrapy startproject 是固定命令,stockstar 是筆者設(shè)置的工程名字。放置 spider 代碼的目錄文件 spiders(用于編寫爬蟲)。
項目中的 item 文件 items.py(用于保存所抓取的數(shù)據(jù)的容器,其存儲方式類似于 Python 的字典)。
項目的中間件
middlewares.py(提供一種簡便的機制,通過允許插入自定義代碼來拓展 Scrapy 的功能)。
項目的 pipelines 文件 pipelines.py(核心處理器)。
項目的設(shè)置文件 settings.py。
項目的配置文件 scrapy.cfg。
POBOTSOXT_OBEY = True
robots.txt 是遵循 Robot 協(xié)議的一個文件,在 Scrapy 啟動后,首先會訪問網(wǎng)站的 robots.txt 文件,然后決定該網(wǎng)站的爬取范圍。有時我們需要將此配置項設(shè)置為 False。在 settings.py 文件中,修改文件屬性的方法如下。ROBOTSTXT_OBEY=False
右擊 E:\stockstar\stockstar 文件夾,在彈出的快捷菜單中選擇“Mark Directory as”命令→選擇“Sources Root”命令,這樣可以使得導(dǎo)入包的語法更加簡潔,如圖 4 所示。import scrapyfrom scrapy.loader import ItemLoaderfrom scrapy.loader.processors import TakeFirstclass StockstarItemLoader (ItemLoader):#自定義itemloader,用于存儲爬蟲所抓取的字段內(nèi)容default_output_processor = TakeFirst()class StockstarItem (scrapy.Item) : # 建立相應(yīng)的字段#define the fields for your item here like:#name = scrapy.Field()code = scrapy.Field() # 股票代碼abbr = scrapy.Field() # 股票簡稱last_trade = scrapy.Field() # 最新價chg_ratio = scrapy.Field() # 漲跌幅chg_amt = scrapy.Field() # 漲跌額chg_ratio_5min = scrapy.Field() # 5分鐘漲幅volumn = scrapy.Field() # 成交量turn_over = scrapy.Field() # 成交額
from scrapy.exporters import JsonLinesItemExporter #默認(rèn)顯示的中文是閱讀性較差的Unicode字符#需要定義子類顯示出原來的字符集(將父類的ensure_ascii屬性設(shè)置為False即可)class CustomJsonLinesItemExporter(JsonLinesItemExporter):def __init__(self, file, **kwargs):super (CustomJsonLinesItemExporter, self).__init__(file, ensure_ascii=False, **kwargs)#啟用新定義的Exporter類\FEED_EXPORTERS = {'json':'stockstar.settings.CustomJsonLinesItemExporter',}...#Configure a delay for requests for the same website (default: 0)#See http:IIscrapy.readthedocs.org/en/latest/topics/settings.html#download-delay#See also autothrottle settings and docs DOWNLOAD DELAY = 0.25
cd stockstar
scrapy genspider stock quote.stockstar.com
import scrapyfrom items import StockstarItem, StockstarItemLoader\class StockSpider(scrapy.Spider):name = 'stock' #定義爬蟲名稱allowed_domains = ['quote.stockstar.com'] #定義爬蟲域start_urls = ['http://quote.stockstar.com/stock/ranklist_a_3_1_1.html']#定義開始爬蟲鏈接def parse (self, response) : #撰寫爬蟲邏輯page = int (response.url.split("_")[-1].split(".")[0])#抓取頁碼item_nodes = response.css('#datalist tr')for item_node in item_nodes:#根據(jù)item文件中所定義的字段內(nèi)容,進(jìn)行字段內(nèi)容的抓取item_loader = StockstarItemLoader(item=StockstarItem(), selector = item_node)item_loader.add_css("code", "td:nth-child(1) a::text")item_loader.add_css("abbr", "td:nth-child(2) a::text")item_loader.add_css("last_trade", “td:nth-child(3) span::text")item_loader.add_css("chg_ratio", "td:nth-child(4) span::text")item_loader.add_css("chg_amt", "td:nth-child(5) span::text")item_loader.add_css("chg_ratio_5min","td:nth-child(6) span::text")item_loader.add_css("volumn", "td:nth-child(7)::text")item_loader.add_css ("turn_over", "td:nth-child(8) :: text")stock_item = item_loader.load_item()yield stock_itemif item_nodes:next_page = page + 1next_url = response.url.replace ("{0}.html".format (page) , "{0}.html".format(next_page))yield scrapy.Request(url=next_url, callback=self.parse)
from scrapy.cmdline import execute
execute(["scrapy","crawl","stock","-o","items.json"])
E:\stockstar>scrapy crawl stock -o items.json
在代碼里可設(shè)置斷點(如在 spiders/stock.py 內(nèi)),然后單擊“Run”選項按鈕→在彈出的菜單中選擇“Debug‘main’”命令,進(jìn)行調(diào)試,如圖 7 和圖 8 所示。