Scrapy 實例——爬取豆瓣圖書排名top250

1、安裝

pip install E:\python\lxml-4.2.6-cp36-cp36m-win_amd64.whl

pip install E:\python\Twisted-18.9.0-cp36-cp36m-win_amd64.whl

pip install scrapy

2、爬蟲實例

首先我們需要創建一個項目。

    scrapy startproject douban_book #

在命令行輸入scrapy startproject + [項目名],這樣會生成一個scrapy項目。我這個項目的名稱是douban_book。大家一看這個名字就知道,我待會要去爬取豆瓣網站圖書的內容。

我們來簡單看一下該項目的目錄結構

我們真正的爬蟲程序是寫在spiders/bookspider.py文件中的,bookspider.py是我自己創建的文件,其他的文件都是scrapy自己

自動初始化好的。

其中item.py是配置爬蟲具體返回的數據,待會我們在具體的例子中會看到如何定義自己需要返回的東西;

pipeline.py是配置具體的通道信息;

settings.py是設置信息,爬蟲大部分的配置信息都要在該文件中進行。

首先我們先編寫item.py文件,該文件設置爬蟲具體的返回數據。

    # -*- coding: utf-8 -*-
     
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    import scrapy
    class DoubanBookItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        name = scrapy.Field()
        price = scrapy.Field()
        publisher = scrapy.Field()
        ratings = scrapy.Field()
        edition_year = scrapy.Field()
        author = scrapy.Field()

這裏我們需要返回具體某本書的名字,作者,價格,評分等信息,scrapy已經爲我們定義好了一個item對象,我們只要使用

Scrapy.Field()這個域就可以定義我們想要返回的字典類型中的“k”值

接下來是最主要的bookspider.py文件了,

    import scrapy
    from douban_book.items import DoubanBookItem
    class BookSpider(scrapy.Spider):
        """docstring for BookSpider"""
        name = 'douban-book' #這個名字在後續執行爬蟲時用
        allowed_domain = ['douban.com']
        start_urls = ['https://book.douban.com/top250']
        def parse(self, response):
            yield scrapy.Request(response.url, callback = self.parse_page)
            for page in response.xpath('//div[@class="paginator"]/a'):
                link = page.xpath('@href').extract()[0]
                yield scrapy.Request(link, callback = self.parse_page)
       def parse_page(self, response):
            for item in response.xpath('//tr[@class="item"]'):
                book = DoubanBookItem()
                book['name'] = item.xpath('td[2]/div[1]/a/@title').extract()[0]
                book['ratings'] = item.xpath('td[2]/div[2]/span[@class="rating_nums"]/text()').extract()[0]
                # book['ratings'] = item.xpath('td[2]/div[2]/span[2]/text()').extract()[0]
                book_info = item.xpath('td[2]/p[1]/text()').extract()[0]
                book_info_contents = book_info.strip().split(' / ')
                book['author'] = book_info_contents[0]
                book['publisher'] = book_info_contents[1]
                book['edition_year'] = book_info_contents[2]
                book['price'] = book_info_contents[3]
                yield book

這個文件的內容是具體的爬蟲信息,先導入我們剛纔定義的DoubanBookItem類,下面就要用這個類來具體實例化一個對象以存放返回的信息。我們依然需要定義一個爬蟲類BookSpider,在這個類中定義了爬蟲的名字“douban-book”,之後定義了一個容許訪問的域,就是告訴爬蟲可以去爬這個域中的內容。然後定義了爬蟲開始的起始網頁。

接下來就是定義解析函數parse了,parse函數做了兩件事情,一個是發送當前網頁(第一頁)的請求,另一個是讀出所有從第2頁開始到最後一頁的網絡請求,然後向每一個網頁發出請求。在parse函數中不具體解析數據,解析數據的工作給了每個請求中的回調函數進行。這個回調函數就是下面定義的parse_page函數。

parse_page函數是我們真正的爬蟲數據函數,拿到response之後就對response的每個標籤進行解析,然後放在實例化後的book對象中。這裏有一個小小的問題,就是某一本書中作者,出版社,時間和價格是在一個string中,因此在拿到這個string後需要用split方法拆開,然後放入book的不同“k”中。最後就是返回book了。
 

程序完成後我們運行一下,返回到windows的命令行cmd,進入douban_book目錄下

然後運行scrapy crawl douban-book -o bookInfo.csv。此處將爬取內容寫入csv文件中,當然也可以寫入到txt文件中,或是json和MySQL中。我第一次運行這個命令後,返回了403狀態碼,意思就是網站拒絕了我的請求。這是由於有些網站是不容許進行爬蟲的,它發現你是爬蟲後會拒絕掉你的請求。解決辦法就是在settings.py文件中加入一句話

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

這句話的意思就是把我們的請求僞裝成一個瀏覽器以騙過網站的檢查,當然僞裝有很多辦法,這個只是其中的一種。

好了,加入上面那句代碼後我們再運行scrapy crawl douban-book -o bookInfo.csv後就會得到我們想要的東西了。這裏要說明一下,我是比較喜歡返回csv文件的,一來是因爲這個返回結果可以直接在sublime中查看,中文也可以正常顯示。

3、注意事項:

(1)需要有HTML的基礎知識,理解標籤、錨點等概念

(2)scrapy的選擇器常用xpath和css,可以通過練習使用這兩種選擇器收集數據

(3)Scrapy就像是做填空題,涉及到4個文件,

items.py決定爬取哪些項目,

bookspider.py 決定怎麼爬

settings.py決定由誰去處理爬取的內容

pipelines.py決定爬取後的內容怎麼處理

(4)如果想要調試HTML文檔選擇器的執行結果,可以在cmd中切換到目錄下用shell命令演示結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章