(點擊上方公眾號,可快速關注)
來源: 拓海
http://www.cnblogs.com/tuohai666/p/8879765.html
本系列:
上期我們理性的分析了為什麼要學習Scrapy,理由只有一個,那就是免費,一分錢都不用花!
咦?怎麼有人扔西紅柿?好吧,我承認電視看多了。不過今天是沒得看了,為了趕稿,又是一個不眠夜。。。言歸正傳,我們將在這一期介紹完Scrapy的基礎知識, 如果想深入研究,大家可以參考官方文檔,那可是出了名的全面,我就不佔用公眾號的篇幅了。
架構簡介下面是Scrapy的架構,包括組件以及在系統中發生的數據流的概覽(紅色箭頭所示)。 之後會對每個組件做簡單介紹,數據流也會做一個簡要描述。
架構就是這樣,流程和我第二篇裡介紹的迷你架構差不多,但擴展性非常強大。
One more thing
scrapy startproject tutorial
該命令將會創建包含下列內容的 tutorial 目錄:
tutorial/
scrapy.cfg # 項目的配置文件
tutorial/ # 該項目的python模塊。之後您將在此加入代碼
__init__.py
items.py # 項目中的item文件
pipelines.py # 項目中的pipelines文件
settings.py # 項目的設置文件
spiders/ # 放置spider代碼的目錄
__init__.py
編寫第一個爬蟲
Spider是用戶編寫用於從單個網站(或者一些網站)爬取數據的類。其包含了一個用於下載的初始URL,以及如何跟進網頁中的連結以及如何分析頁面中的內容的方法。
以下為我們的第一個Spider代碼,保存在 tutorial/spiders 目錄下的 quotes_spider.py文件中:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
運行我們的爬蟲
進入項目的根目錄,執行下列命令啟動spider:
scrapy crawl quotes
這個命令啟動用於爬取 quotes.toscrape.com 的spider,你將得到類似的輸出:
2017-05-10 20:36:17 [scrapy.core.engine] INFO: Spider opened
2017-05-10 20:36:17 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-05-10 20:36:17 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-1.html
2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-2.html
2017-05-10 20:36:17 [scrapy.core.engine] INFO: Closing spider (finished)
提取數據
我們之前只是保存了HTML頁面,並沒有提取數據。現在升級一下代碼,把提取功能加進去。至於如何使用瀏覽器的開發者模式分析網頁,之前已經介紹過了。
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').extract_first(),
'author': quote.css('small.author::text').extract_first(),
'tags': quote.css('div.tags a.tag::text').extract(),
}
再次運行這個爬蟲,你將在日誌裡看到被提取出的數據:
2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>
{'tags': ['life', 'love'], 'author': 'André Gide', 'text': '「It is better to be hated for what you are than to be loved for what you are not.」'}
2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>
{'tags': ['edison', 'failure', 'inspirational', 'paraphrased'], 'author': 'Thomas A. Edison', 'text': "「I have not failed. I've just found 10,000 ways that won't work.」"}
保存爬取的數據
最簡單存儲爬取的數據的方式是使用 Feed exports:
scrapy crawl quotes -o quotes.json
該命令將採用 JSON 格式對爬取的數據進行序列化,生成quotes.json文件。
在類似本篇教程裡這樣小規模的項目中,這種存儲方式已經足夠。如果需要對爬取到的item做更多更為複雜的操作,你可以編寫 Item Pipeline,tutorial/pipelines.py在最開始的時候已經自動創建了。
看完本文有收穫?請轉發分享給更多人
關注「Python開發者」,提升Python技能