你們好,本篇文章咱們來看一下強大的Python爬蟲框架Scrapy。Scrapy是一個使用簡單,功能強大的異步爬蟲框架,咱們先來看看他的安裝。python
Scrapy的安裝數據庫
Scrapy的安裝是很麻煩的,對於一些想使用Scrapy的人來講,它的安裝經常就讓不少人死在半路。在此我將個人安裝過程和網絡上整理的安裝方法,分享給你們,但願你們可以安裝順利。若是你在學習Python的過程當中碰見了不少疑問和難題,能夠加-q-u-n 227 -435-450裏面有軟件視頻資料免費
json
Windows安裝xcode
開始以前,咱們要肯定本身安裝了Python,本篇文章咱們以Python3.5爲例。Scrapy有不少依賴的包,咱們來一一安裝。瀏覽器
首先,使用pip -v,查看pip是否安裝正常,若是正常,那麼咱們進行下一步;安全
pip install wheel這個包咱們以前的文章介紹過,安裝好他咱們就能夠安裝一些wheel件;網絡
lxml安裝,以前的文章說過他的安裝,那麼咱們這裏在從新整理一下。whl文件地址:here。找到本身對應版本的文件,下載好後,找到文件位置,右鍵點擊文件屬性,點擊安全標籤,複製他的所在路徑。打開管理員工具(cmd),pip install <粘貼whl路徑>;框架
PyOpenssl 的whl文件地址:here。點擊下載,whl文件安裝方式同上;dom
Twisted框架這個框架是一個異步網絡庫,是Scrapy的核心。whl文件地址:here;異步
Pywin32這是一個Pywin32兼容的庫,下載地址:here,選好版本進行下載;
若是上面的庫全都安裝好了,那麼咱們就能夠安裝咱們的Scrapy了,pip install scrapy
是否是很麻煩呢,若是你們不喜歡折騰,那麼在Windows下也能夠很方便的安裝。那就要使用咱們以前提到的Anaconda了。具體安裝你們本身找找,或者在以前的文章中找。那麼他的安裝Scrapy只須要一行:
conda install scrapy
Linux安裝
Linux系統安裝起來就要簡單一點:
sudo apt-get install build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev
Mac OS安裝
咱們須要先安裝一些C++的依賴庫,xcode-select --install
須要安裝命令行開發工具,咱們點擊安裝。安裝完成,那麼依賴庫也就安裝完成了。
而後咱們直接使用pip安裝pip install scrapy
以上,咱們的Scrapy庫的安裝基本上就解決了。
Scrapy的基本使用
Scrapy的中文文檔地址:here
Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。 能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
他的基本項目流程爲:
建立一個Scrapy項目
定義提取的Item
編寫爬取網站的spider並提取Item
編寫Item Pipeline來存儲提取到的Item(即數據)
而通常咱們的爬蟲流程爲:
抓取索引頁:請求索引頁的URL並獲得源代碼,進行下一步分析;
獲取內容和下一頁連接:分析源代碼,提取索引頁數據,而且獲取下一頁連接,進行下一步抓取;
翻頁爬取:請求下一頁信息,分析內容並請求在下一頁連接;
保存爬取結果:將爬取結果保存爲特定格式和文本,或者保存數據庫。
咱們一步一步來看看如何使用。
建立項目
在開始爬取以前,您必須建立一個新的Scrapy項目。 進入您打算存儲代碼的目錄中,運行下列命令(以知乎日報爲例):
scrapy startproject zhihurb
該命令將會建立包含下列內容的 zhihu 目錄:
zhihurb/
scrapy.cfg zhihurb/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py ...
這些文件分別是:
scrapy.cfg: 項目的配置文件zhihurb/: 該項目的python模塊。以後您將在此加入代碼。zhihurb/items.py: 項目中的item文件.zhihurb/pipelines.py: 項目中的pipelines文件.zhihurb/settings.py: 項目的設置文件.zhihurb/spiders/: 放置spider代碼的目錄.
定義Item
這一步是定義咱們須要獲取到的數據信息,好比咱們須要得到網站裏的一些url,網站文章的內容,文章的做者等。這一步定義的地方就在咱們的items.py文件。
import scrapy
class ZhihuItem(scrapy.Item):
name = scrapy.Field() article = scrapy.Field()
編寫Spider
這一步就是寫咱們最熟悉的爬蟲了,而咱們的Scrapy框架可讓咱們不須要去考慮實現的方法,只須要寫出爬取的邏輯就能夠了。
首先咱們須要在 spiders/ 文件夾下建立咱們的爬蟲文件,好比就叫spider.py。寫爬蟲前,咱們須要先定義一些內容。咱們以知乎日報爲例:https://daily.zhihu.com/
from scrapy import Spider
class ZhihuSpider(Spider):
name = "zhihu" allowed_domains = ["zhihu.com"] start_urls = ['https://daily.zhihu.com/']
這裏咱們定義了什麼呢?首先咱們導入了Scrapy的Spider組件。而後建立一個爬蟲類,在類裏咱們定義了咱們的爬蟲名稱:zhihu(注意:爬蟲名稱獨一無二的,是不能夠和別的爬蟲重複的)。還定義了一個網址範圍,和一個起始 url 列表,說明起始 url 能夠是多個。
而後咱們定義一個解析函數:
def parse(self, response):
print(response.text)
咱們直接打印一下,看看這個解析函數是什麼。
運行爬蟲
scrapy crawl zhihu
因爲Scrapy是不支持在IDE中執行,因此咱們必須在命令行裏執行命令,咱們要肯定是否是cd到爬蟲目錄下。而後執行,這裏的命令顧名思義,crawl是蜘蛛的意思,zhihu就是咱們定義的爬蟲名稱了。
查看輸出,咱們先看到的是一些爬蟲類的輸出,能夠看到輸出的log中包含定義在 start_urls 的初始URL,而且與spider中是一一對應的。咱們接着能夠看到打印出了網頁源代碼。但是咱們彷佛並無作什麼,就獲得了網頁的源碼,這是Scrapy比較方便的一點。
提取數據
接着就可使用解析工具解析源碼,拿到數據了。
因爲Scrapy內置了CSS和xpath選擇器,而咱們雖然可使用Beautifulsoup,可是BeautifulSoup的缺點就是慢,這不符合咱們Scrapy的風格,全部我仍是建議你們使用CSS或者Xpath。
因爲以前我並無寫過關於Xpath或者CSS選擇器的用法,那麼首先這個並不難,並且熟悉瀏覽器的用法,能夠很簡單的掌握他們。
咱們以提取知乎日報裏的文章url爲例:
from scrapy import Request
def parse(self, response):
urls = response.xpath('//div[@class="box"]/a/@href').extract() for url in urls: yield Request(url, callback=self.parse_url)
這裏咱們使用xpath解析出全部的url(extract()是得到全部URL集合,extract_first()是得到第一個)。而後將url利用yield語法糖,回調函數給下一個解析url的函數。
使用item
後面詳細的組件使用留在下一章講解,這裏假如咱們解析出了文章內容和標題,咱們要將提取的數據保存到item容器。
Item對象至關因而自定義的python字典。 您可使用標準的字典語法來獲取到其每一個字段的值。(字段便是咱們以前用Field賦值的屬性)。
def parse_url(self, response):
# name = xxxx # article = xxxx # 保存 item = DmozItem() item['name'] = name item['article'] = article # 返回item yield item
保存爬取到的數據
這裏咱們須要在管道文件pipelines.py裏去操做數據,好比咱們要將這些數據的文章標題只保留 5 個字,而後保存在文本里。或者咱們要將數據保存到數據庫裏,這些都是在管道文件裏面操做。咱們後面在詳細講解。
那麼最簡單的存儲方法是使用命令行命令:
scrapy crawl zhihu -o items.json
這條命令就會完成咱們的數據保存在根目錄的json文件裏,咱們還能夠將他格式保存爲msv,pickle等。改變命令後面的格式就能夠了。