1. 程式人生 > >Scrapy爬蟲從入門到例項精講(上)

Scrapy爬蟲從入門到例項精講(上)

最近幾天一直在學習Scrapy這個框架,打算用幾篇文章來總結一下自己這段時間學習的知識。

      首先我們需要簡單介紹一下Scrapy是個什麼東西。先來看一張圖,是從官網上弄下來的。


Scrapy是一個框架,這個框架是用來爬取網站資料的,並且該框架為我們提供了各種介面,包括爬蟲介面,管道介面,資料

儲存介面以及資料庫訪問介面等等。

上圖中綠色的箭頭表示資料的流向,從Scheduler開始發起請求,返回資料後使用Spider來抓取我們想要的資料,之後把

資料交給相應的資料庫,如果返回的資料中包含連結,則Scheduler再次發起請求,直到所有請求傳送完畢。

那麼就先從一個最簡單的例子開始,當然開始之前還是要進行相應的準備工作。

  • 安裝Scrapy
pip install Scrapy

大家注意在安裝Scrapy時可能會遇到很多錯誤,特別是windows系統,這是因為Scrapy需要的依賴庫很多,而且每一個都有相應的版本要求。我在安裝的時候就遇到了一個問題“Miscrosoft visual studio 14.0 is required”,在網上查了一下,這是因為缺少一個叫Twisted-17.9.0-cp36-cp36m-win32.whl的檔案,在網上下載了這個檔案,具體要下載哪個版本的檔案要根據你的電腦是32位還是64位來定。安裝該檔案後,再執行pip install Scrapy就可以了。當然你在安裝時可能還會遇到其他的問題,這裡就不一一列舉了。
安裝好Scrapy後,就可以進行資料爬取了。今天我們先用一個單一的py檔案來爬取網路資料,明天我們再使用一個工程去爬取。 這個程式是要爬取一個網站所有人員的發言,爬取後儲存為一個.csv檔案並且儲存到本地。
# -*- coding:utf-8 -*-
import io
import sys
import scrapy


sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
class JokeSpider(scrapy.Spider):
	"""docstring for JulyeduSpider"""
	name = 'jokespider'
	start_urls = ['http://quotes.toscrape.com/tag/humor/']

	def parse(self, response):
		for joke in response.xpath('//div[@class="quote"]'):
			print(joke.xpath('span[1]/text()').extract_first())
			print(joke.xpath('span[2]/small/text()').extract_first())
			# print(joke.xpath('a/p[@class="course-info-tip info-time"][1]/text()').extract_first())

			yield {'content':joke.xpath('span[1]/text()').extract_first(),
			'Author':joke.xpath('span[2]/small/text()').extract_first()}
		
		# 得到下一頁的網址,並且判斷是否有下一頁
		next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()
		if next_page is not None:
			next_page = response.urljoin(next_page)
			yield scrapy.Request(next_page, callback = self.parse)
用這個例子來簡單說明一下Scrapy是如何使用的。 程式碼開始還是解決中文編碼的問題,之後定義了一個類JokeSpider,當然這個名字可以自己起。在class裡有兩個變數,name和start_urls,這兩個名字是並不可少,一個是給這個爬蟲一個名字,另一個告訴Scrapy爬蟲的起始網頁地址,從哪個網站開始爬取。 得到資料後,定義瞭解析資料的函式parse。這裡採用xpath的處理辦法,當然你也可以使用selenium webdriver或者BeautifulSoup,或者其他你擅長的方法進行爬取。框架就是有這個好處,這些東西框架都已經整合好了,你用哪個都可以。 相應的資料得到後,就是返回資料了。這裡使用了yield這個關鍵字,用迭代的方法返回資料,減少記憶體的開銷。其實python中的yield關鍵字挺不好理解的,建議大家花點時間好好研究一下,有些公司在面試時就愛問這個東西。推薦大家看看廖雪峰的一篇文章,裡面介紹的很詳細。https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 儲存資料後就要處理“下一頁”的問題了,首先要判斷該頁面有沒有“下一頁(next)”,如果有就再次發起請求,然後再parse取回來的資料。這裡使用了框架提供的urljoin函式,通過
next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()
得到的網頁“下一頁”的連結地址是一個不完整的地址,通過Scrapy提供的urljoin函式可以幫我們把網頁的連結地址補充完整。補充完整之後就再次發起請求,同時提供一個回撥函式,當然我們這裡的回撥函式還是parse,即進行遞迴呼叫。 上述程式碼完成後就需要在命令列中執行Scrapy,找到自己的該py檔案的路徑,然後執行下面的語句
我給該檔案起名為“ScrapySpider2.py”,執行上面這個命令。runspider命令是執行一個單一的py檔案,今後我們還會說到更多Scrapy的命令。後面的-o是輸出的意思,意思是將ScrapySpider.py的輸出結果儲存在該目錄下的一個叫ScrapySpider2.csv檔案,當然你也可以輸出xml或者json檔案等等,這些檔案格式Scrapy都是支援的,主要取決於你後臺資料庫的型別。 下面就是我執行之後結果的截圖,僅供參考
這是使用Scrapy最簡單的一種情況,今後幾天還會更新有關Scrapy更多的內容。 與您共勉!