如今scrapy的安裝教程都明顯過期了,隨便一搜都是要你安裝一大堆的依賴,什麼裝python(若是別人連python都沒裝,爲何要學scrapy….)wisted, zope interface,pywin32………如今scrapy的安裝真的很簡單的好很差!html
代碼我放github上了,能夠參考:
https://github.com/hk029/doubanbookpython
我以前講過了requests,也用它作了點東西,(【圖文詳解】python爬蟲實戰——5分鐘作個圖片自動下載器)感受它就挺好用的呀,那爲何我還要用scrapy呢?git
由於:它!更!好!用!就這麼簡單,你只要知道這個就好了。github
我相信全部能找到這篇文章的人多多少少了解了scrapy,我再copy一下它的特色來沒太多意義,由於我也不會在這篇文章內深刻提。就像你知道系統的sort函數確定比你本身編的快排好用就好了,若是須要知道爲何它更好,你能夠更深刻的去看代碼,但這裏,你只要知道這個爬蟲框架別人就專門作這件事的,確定好用,你只要會用就行。sql
我但願每一個來這裏的人,或者每一個在找資料的朋友,都能明確本身的目的,我也儘可能將文章的標題取的更加的明確。若是這是一篇標題爲《快速上手》的文章,那你可能就不要太抱但願於能在這篇文章裏找到有關scrapy架構和實現原理類的內容。若是是那樣,我可能會取標題爲《深刻理解scrapy》數據庫
好了廢話說了那麼多,咱們就上手把?json
一條命令解決全部問題vim
pip install scrapy
好吧,我認可若是用的是windows一條命令可能確實不夠,由於還要裝pywin32windows
https://sourceforge.net/projects/pywin32/files/pywin32/瀏覽器
如今sourceforge變的很慢,若是大家不能打開,我在網盤上也放一個64位的,最新220版本的:
連接: http://pan.baidu.com/s/1geUY6Dd 密碼: z2ep
而後就結束了!!結束了!!好很差!就這麼簡單!
咱們考慮下作一個什麼爬蟲呢?簡單點,咱們作一個豆瓣讀書9分書:
https://www.douban.com/doulist/1264675/
把scrapy命令的目錄加入環境變量,而後輸入一條命令
scrapy startproject doubanbook
而後你的目錄下就有一個文件夾名爲doubanbook目錄,按照提示,咱們cd進目錄,而後按提示輸入,這裏咱們爬蟲取名爲dbbook,網址就是上面的網址
關於pytharm的安裝配置:Pycharm的配置和使用
打開後,咱們在最頂層的目錄上新建一個python文件,取名爲main,這是運行的主程序(其實就一行代碼,運行爬蟲)
輸入
from scrapy import cmdline
cmdline.execute("scrapy crawl dbbook".split())
而後咱們進入spider-dbbook,而後把start_urls裏面重複的部分刪除(若是你一開始在命令行輸入網址的時候,沒輸入http://www.那就不用改動)而後把allowed_domains注掉
而且,把parse裏面改爲
print response.body
好了,到此第一個爬蟲的框架就搭完了,咱們運行一下代碼。(注意這裏選擇main.py)
運行一下,發現沒打印東西,看看,原來是403
說明爬蟲被屏蔽了,這裏要加一個請求頭部,模擬瀏覽器登陸
在settings.py里加入以下內容就能夠模擬瀏覽器了
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
咱們再運行,發現網頁內容已經被爬取下來了
好了,咱們的scrapy教程結束!
若是真這樣結束,我知道你會打我。。
這裏咱們就要得分,標題名和做者名
觀察網頁源代碼,用f12,咱們能夠快速找到,這裏不細講怎麼找信息的過程了,具體過程,參考上一個教程【圖文詳解】python爬蟲實戰——5分鐘作個圖片自動下載器
根據先大後小的原則,咱們先用bd doulist-subject,把每一個書找到,而後,循環對裏面的信息進行提取
提取書大框架:
'//div[@class="bd doulist-subject"]'
提取題目:
'div[@class="title"]/a/text()'
提取得分:
'div[@class="rating"]/span[@class="rating_nums"]/text()'
提取做者:(這裏用正則方便點)
'<div class="abstract">(.*?)<br'
通過以前的學習,應該很容易寫出下面的代碼吧:做者那裏用正則更方便提取
selector = scrapy.Selector(response)
books = selector.xpath('//div[@class="bd doulist-subject"]')
for each in books:
title = each.xpath('div[@class="title"]/a/text()').extract()[0]
rate = each.xpath('div[@class="rating"]/span[@class="rating_nums"]/text()').extract()[0]
author = re.search('<div class="abstract">(.*?)<br',each.extract(),re.S).group(1)
print '標題:' + title
print '評分:' + rate
print author
print ''
關鍵這個代碼在哪裏編寫呢?答案就是還記得大明湖……不對,是還記得剛纔輸出response的位置嗎?就是那裏,那裏就是咱們要對數據處理的地方。咱們寫好代碼,這裏注意:
咱們看看結果,很差看,對於注重美觀的咱們來講,簡直不能忍
加入兩條代碼:
title = title.replace(' ','').replace('\n','') author = author.replace(' ','').replace('\n','')
再看看結果,這纔是咱們想要的嘛
好了,剩下的事情就是如何把結果寫入文件或數據庫了,這裏我採用寫入文件,由於若是是寫入數據庫,我又得花時間講數據庫的一些基本知識和操做,仍是放在之後再說吧。
好了,咱們終於要講裏面別的.py文件了,關於這個items.py,你只要考慮它就是一個存儲數據的容器,能夠考慮成一個結構體,你全部須要提取的信息都在這裏面存着。
這裏咱們須要存儲3個變量,title,rate,author,因此我在裏面加入三個變量,就這麼簡單:
title = scrapy.Field()
rate = scrapy.Field()
author = scrapy.Field()
通常來講,若是你要操做數據庫什麼的,須要在這裏處理items,這裏有個process_item的函數,你能夠把items寫入數據庫,可是今天咱們用不到數據庫,scrapy自帶了一個很好的功能就是Feed exports,它支持多種格式的自動輸出。因此咱們直接用這個就行了,pipelines維持不變
Feed 輸出須要2個環境變量:
FEED_FORMAT :指示輸出格式,csv/xml/json/
FEED_URI : 指示輸出位置,能夠是本地,也能夠是FTP服務器
FEED_URI = u'file:///G://douban.csv'
FEED_FORMAT = 'CSV'
FEED_URI改爲本身的就好了
其實也就加了3條命令,是把數據寫入item
固然,你要使用item,須要把item類引入
from doubanbook.items import DoubanbookItem
下面的yield可讓scrapy自動去處理item
好拉,再運行一下,能夠看見G盤出現了一個douban.csv的文件
用excel打開看一下,怎麼是亂碼
不要緊又是編碼的問題,用能夠修改編碼的編輯器好比sublime打開一下,
保存編碼爲utf-8包含bom,或者用gvim打開:set fileencoding=gbk
再打開,就正常了
這還只保存了一個頁面,那剩下的頁面怎麼辦呢?難道要一個個複製網址??固然不是,咱們從新觀察網頁,能夠發現有個後頁的連接,裏面包含着後一頁的網頁連接,咱們把它提取出來就好了。
由於只有這裏會出現標籤,因此用xpath輕鬆提取
'//span[@class="next"]/link/@href'
而後提取後 咱們scrapy的爬蟲怎麼處理呢?
答案仍是yield,
yield scrapy.http.Request(url,callback=self.parse)
這樣爬蟲就會自動執行url的命令了,處理方式仍是使用咱們的parse函數
改後的代碼這樣:
這裏要加一個判斷,由於在最後一頁,「後一頁」的連接就沒了。
好了,咱們再運行一下(先把以前的csv刪除,否則就直接在後面添加了)能夠發現,運行的特別快,十幾頁一下就運行完了,若是你用requests本身編寫的代碼,能夠比較一下,用scrapy快不少,並且是自動化程度高不少。
咱們打開csv,能夠看見,有345篇文章了,和豆瓣上一致。
好了,這個豆瓣9分圖書的爬蟲結束了,相信經過這個例子,scrapy也差很少能上手,至少編寫通常的爬蟲是so easy了!
代碼我放github上了,能夠參考:
https://github.com/hk029/doubanbook