【圖文詳解】scrapy安裝與真的快速上手——爬取豆瓣9分榜單

寫在開頭

如今scrapy的安裝教程都明顯過期了,隨便一搜都是要你安裝一大堆的依賴,什麼裝python(若是別人連python都沒裝,爲何要學scrapy….)wisted, zope interface,pywin32………如今scrapy的安裝真的很簡單的好很差!html

代碼我放github上了,能夠參考:
https://github.com/hk029/doubanbook
python

爲何要用scrapy

我以前講過了requests,也用它作了點東西,(【圖文詳解】python爬蟲實戰——5分鐘作個圖片自動下載器)感受它就挺好用的呀,那爲何我還要用scrapy呢?git

由於:它!更!好!用!就這麼簡單,你只要知道這個就好了。github

我相信全部能找到這篇文章的人多多少少了解了scrapy,我再copy一下它的特色來沒太多意義,由於我也不會在這篇文章內深刻提。就像你知道系統的sort函數確定比你本身編的快排好用就好了,若是須要知道爲何它更好,你能夠更深刻的去看代碼,但這裏,你只要知道這個爬蟲框架別人就專門作這件事的,確定好用,你只要會用就行。sql

我但願每一個來這裏的人,或者每一個在找資料的朋友,都能明確本身的目的,我也儘可能將文章的標題取的更加的明確。若是這是一篇標題爲《快速上手》的文章,那你可能就不要太抱但願於能在這篇文章裏找到有關scrapy架構和實現原理類的內容。若是是那樣,我可能會取標題爲《深刻理解scrapy》數據庫

好了廢話說了那麼多,咱們就上手把?json

安裝scrapy

一條命令解決全部問題vim

pip install scrapy

好吧,我認可若是用的是windows一條命令可能確實不夠,由於還要裝pywin32windows

https://sourceforge.net/projects/pywin32/files/pywin32/瀏覽器

如今sourceforge變的很慢,若是大家不能打開,我在網盤上也放一個64位的,最新220版本的:
連接: http://pan.baidu.com/s/1geUY6Dd 密碼: z2ep

而後就結束了!!結束了!!好很差!就這麼簡單!

豆瓣讀書9分書榜單爬取

咱們考慮下作一個什麼爬蟲呢?簡單點,咱們作一個豆瓣讀書9分書:
https://www.douban.com/doulist/1264675/

創建第一個scrapy工程

把scrapy命令的目錄加入環境變量,而後輸入一條命令

scrapy startproject doubanbook

 

 

而後你的目錄下就有一個文件夾名爲doubanbook目錄,按照提示,咱們cd進目錄,而後按提示輸入,這裏咱們爬蟲取名爲dbbook,網址就是上面的網址

 

 

打開pycharm,新建打開這個文件夾

關於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教程結束!

若是真這樣結束,我知道你會打我。。

編寫xpath提取標題名和做者名

這裏咱們就要得分,標題名和做者名
觀察網頁源代碼,用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的位置嗎?就是那裏,那裏就是咱們要對數據處理的地方。咱們寫好代碼,這裏注意:

  1. 不是用etree來提取了,改成scrapy.Selector了,這點改動相信難不倒聰明的你
  2. xpath若是要提取內容,須要在後面加上.extract(),略爲不適應,可是習慣還好。

 

 

咱們看看結果,很差看,對於注重美觀的咱們來講,簡直不能忍

 

 

加入兩條代碼:

title = title.replace(' ','').replace('\n','') author = author.replace(' ','').replace('\n','')

再看看結果,這纔是咱們想要的嘛

 

好了,剩下的事情就是如何把結果寫入文件或數據庫了,這裏我採用寫入文件,由於若是是寫入數據庫,我又得花時間講數據庫的一些基本知識和操做,仍是放在之後再說吧。

items.py

好了,咱們終於要講裏面別的.py文件了,關於這個items.py,你只要考慮它就是一個存儲數據的容器,能夠考慮成一個結構體,你全部須要提取的信息都在這裏面存着。

這裏咱們須要存儲3個變量,title,rate,author,因此我在裏面加入三個變量,就這麼簡單:

title = scrapy.Field()
    rate = scrapy.Field()
    author = scrapy.Field()

 

 

pipelines.py

通常來講,若是你要操做數據庫什麼的,須要在這裏處理items,這裏有個process_item的函數,你能夠把items寫入數據庫,可是今天咱們用不到數據庫,scrapy自帶了一個很好的功能就是Feed exports,它支持多種格式的自動輸出。因此咱們直接用這個就行了,pipelines維持不變

settings.py

Feed 輸出須要2個環境變量:

FEED_FORMAT :指示輸出格式,csv/xml/json/
FEED_URI : 指示輸出位置,能夠是本地,也能夠是FTP服務器

FEED_URI = u'file:///G://douban.csv'
FEED_FORMAT = 'CSV'

FEED_URI改爲本身的就好了

 

dbbook.py修改

其實也就加了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

相關文章
相關標籤/搜索