scrapy學習筆記(二):連續抓取與數據保存

抓取論壇、貼吧這種多分頁的信息時,沒接觸scrapy以前,是前肯定有多少頁,使用for循環抓取。這方法略顯笨重,使用scrapy則能夠直接組合下一頁的連接,而後傳給request持續進行抓取,一直到沒有下一頁連接爲止。css

仍是以官方教程的網站爲例子,先分析下元素:mongodb

下一頁元素

能夠看到下一頁的標籤:數據庫

<a href="/page/2/">Next <span aria-hidden="true">→</span></a>

其中的href屬性值/page/2與www.quotes.toscrape.com組合起來就是下一頁的網址,同理第二頁next的href屬性值組合起來就是第三頁,所以只要咱們判斷出是否有下一頁的關鍵字,就能夠進行持續抓取。數組

上代碼:scrapy

import scrapy

class myspider(scrapy.Spider):

# 設置爬蟲名稱
name = "get_quotes"

# 設置起始網址
start_urls = ['http://quotes.toscrape.com']

def parse(self, response):

    #使用 css 選擇要素進行抓取,若是喜歡用BeautifulSoup之類的也能夠
    #先定位一整塊的quote,在這個網頁塊下進行做者、名言,標籤的抓取
    for quote in response.css('.quote'):
        yield {
            'author' : quote.css('small.author::text').extract_first(),
            'tags' : quote.css('div.tags a.tag::text').extract(),
            'content' : quote.css('span.text::text').extract_first()
        }

    # 使用xpath獲取next按鈕的href屬性值
    next_href = response.xpath('//li[@class="next"]/a/@href').extract_first()
    # 判斷next_page的值是否存在
    if next_href is not None:

        # 若是下一頁屬性值存在,則經過urljoin函數組合下一頁的url:
        # www.quotes.toscrape.com/page/2
        next_page = response.urljoin(next_href)

        #回調parse處理下一頁的url
        yield scrapy.Request(next_page,callback=self.parse)

下面是處理結果:
抓取結果編輯器

能夠看到一直抓取了10頁,此網站也只有10頁
網頁頁數ide

整個網站的名人名言就所有抓取到了,是否是很方便函數

如今只是把抓取獲得的只是打印到屏幕上,並無存儲起來,接下來咱們使用Mongodb進行存儲,mongodb的優勢可自行google,這裏就不說了。從官網下載,參考官方安裝教程進行配置安裝。網站

要使用Mongodb須要pymongo,直接pip install pymongo
先演示下直接存儲,當作Mongodb存儲例子,實際不推薦這麼使用:google

import scrapy

# 導入pymongo
import pymongo

class myspider(scrapy.Spider):

# 設置爬蟲名稱
name = "get_quotes"

# 設置起始網址
start_urls = ['http://quotes.toscrape.com']

# 配置client,默認地址localhost,端口27017
client = pymongo.MongoClient('localhost',27017)
# 建立一個數據庫,名稱store_quote
db_name = client['store_quotes']
# 建立一個表
quotes_list = db_name['quotes']

def parse(self, response):

    #使用 css 選擇要素進行抓取,若是喜歡用BeautifulSoup之類的也能夠
    #先定位一整塊的quote,在這個網頁塊下進行做者、名言,標籤的抓取
    for quote in response.css('.quote'):
        # 將頁面抓取的數據存入mongodb,使用insert
        yield self.quotes_list.insert({
            'author' : quote.css('small.author::text').extract_first(),
            'tags' : quote.css('div.tags a.tag::text').extract(),
            'content' : quote.css('span.text::text').extract_first()
        })

    # 使用xpath獲取next按鈕的href屬性值
    next_href = response.xpath('//li[@class="next"]/a/@href').extract_first()
    # 判斷next_page的值是否存在
    if next_href is not None:

        # 若是下一頁屬性值存在,則經過urljoin函數組合下一頁的url:
        # www.quotes.toscrape.com/page/2
        next_page = response.urljoin(next_href)

        #回調parse處理下一頁的url
        yield scrapy.Request(next_page,callback=self.parse)

若是使用的是pycharm編輯器,有一個mongodb插件,能夠方便的查看數據庫,Mongo plugin,在plugin裏面添加

clipboard.png

添加以後,重啓pycharm,能夠在setting -> other setting裏面看到Mongo Servers,點擊Mongo servers配置mongodb:

clipboard.png
Label隨意填寫,server url已經有默認,test一下,鏈接成功確認便可,完成以後,可在pycharm左側看到插件mongo explorer,點擊展開可看到數據庫。

OK運行一下咱們的代碼,

scrapy crawl get_quotes

而後刷新下數據庫,可看到數據已經保存到mongodb中了

clipboard.png

查看數據庫內容:

clipboard.png

很清晰,每一項都有保存

相關文章
相關標籤/搜索