為了入門scrapy框架,昨天寫了一個爬取靜態小說網站的小程序
下面我們嘗試爬取全書網中網游動漫類小說的書籍信息。
一、准備階段
明確一下爬蟲頁面分析的思路:
對於書籍列表頁:我們需要知道打開單本書籍的地址、以及獲取點開下一頁書籍列表頁的鏈接
對於書籍信息頁面,我們需要找到提取:(書名、作者、書本簡介、書本連載狀態)這四點信息
爬蟲流程:書籍列表頁中點開一本書→提取每一本書的書籍信息;當一頁書籍列表頁的書籍全部被采集以后,按照獲取的下一頁鏈接打開新的商戶及列表頁→點開一本書的信息→提取每一本書的信息……
二、頁面分析
首先,我們先對爬取數據要打開的第一頁頁面進行分析。
除了使用開發者工具以外,我們還可以使用scrapy shell <url>命令,可以進行前期的爬取實驗,從而提高開發的效率。
首先打開cmd(前提必須是安裝好了scrapy~,這里就不說怎么按照scrapy了)
輸入scrapy shell +<要分析的網址>
可以得到一個這樣的結果
運行完這條命令以后,scrapy shell 會用url參數構造一個request對象,並且提交給scrapy引擎,頁面下載完以后程序進入一個pyhon shell中,我們可以調用view函數使用瀏覽器顯示response所包含的頁面
*進行頁面分析的時候view函數解析的頁更加可靠。
彈出頁面如下:
通過觀察源代碼,可以發現所有書籍link信息前綴為"http://www.quanshuwang.com/book_"
此時我們可以嘗試在scrapy shell中提取這些信息
這里使用LinkExtractor提取這些鏈接
在scrapy shell 輸入信息與展示信息如下:
隨后我們尋找下一頁標簽的鏈接,查看源代碼可以發現在一個class 為next的a標簽中
在scrapy shell中嘗試提取,發現可以成功提取到目的link
接下來分析單頁書籍信息
處理思路和分析書籍頁面信息一樣,獲取網頁
在shell中通過fetch函數下載書籍信息頁面,然后再通過view函數在瀏覽器中查看該頁面
通過查看網頁源代碼,發現所有數據包含在class為detail的div模塊中。
接下來使用response.css或者response.xpath對數據進行提取
在scrapy shell中嘗試如下:(這里只舉一個例子,其他的可以自己類似嘗試)
逐一確定其他目的提取元素的方式以后,可以開始進行正式的編碼實現
三、編碼實現
首先,我們在cmd中進到目的python目錄中,創建一個scrapy項目
代碼如下:
而后進入到創建的新scrapy項目目錄下,新建spider文件
運行以后,scrapy genspider命令創建了文件fiction/spiders/fictions.py,並且創建了相應的spider類
總體文件項如圖:(其中,fictions.csv是后面進行爬蟲的時候生成的)
接下來我們可以對“框架”按照我們前面的需求進行改寫
①首先改寫Item項目
在fiction/items.py中修改代碼如下
1 # -*- coding: utf-8 -*- 2 3 # Define here the models for your scraped items 4 # 5 # See documentation in: 6 # https://doc.scrapy.org/en/latest/topics/items.html 7 8 import scrapy 9 10 11 class FictionItem(scrapy.Item): 12 # define the fields for your item here like: 13 # name = scrapy.Field() 14 15 bookname = scrapy.Field() 16 statement = scrapy.Field() 17 author = scrapy.Field() 18 simple_content = scrapy.Field() 19 20 21 pass
②實現頁面解析函數
修改fiction/spiders/fictions.py代碼如下(具體分析前面已經討論,注釋見詳細代碼)
1 # -*- coding: utf-8 -*- 2 import scrapy 3 from scrapy.linkextractors import LinkExtractor 4 from ..items import FictionItem 5 6 7 class FictionsSpider(scrapy.Spider): 8 name = 'fictions' 9 allowed_domains = ['quanshuwang.com'] 10 start_urls = ['http://www.quanshuwang.com/list/8_1.html'] 11 12 # 書籍列表的頁面解析函數 13 def parse(self,response): 14 # 提取書籍列表頁面每一本書的鏈接 15 pattern = 'http://www.quanshuwang.com/book_' 16 le = LinkExtractor(restrict_xpaths='//*[@class="seeWell cf"]',allow=pattern) 17 for link in le.extract_links(response): 18 yield scrapy.Request(link.url,callback=self.parse_book) 19 20 # 提取下一頁鏈接 21 le = LinkExtractor(restrict_xpaths='//*[@id="pagelink"]/a[@class="next"]') 22 links = le.extract_links(response) 23 if links: 24 next_url = links[0].url 25 yield scrapy.Request(next_url,callback=self.parse) 26 27 pass 28 29 30 # 書籍界面的解析函數 31 def parse_book(self, response): 32 book=FictionItem() 33 sel = response.css('div.detail') 34 book['bookname']=sel.xpath('./div[1]/h1/text()').extract_first() 35 book['statement']=sel.xpath('//*[@id="container"]/div[2]/section/div/div[4]/div[1]/dl[1]/dd/text()').extract_first() 36 book['author']=sel.xpath('//*[@id="container"]/div[2]/section/div/div[4]/div[1]/dl[2]/dd/text()').extract_first() 37 book['simple_content']=sel.xpath('string(//*[@id="waa"])').extract() 38 39 yield book
③設置參數防止存儲數據亂碼
在setting.py中加上這個代碼
1 FEED_EXPORT_ENCODING = 'utf-8'
④命令行中調用(要進入到/fiction/fiction中(與setting.py同級目錄)才能調用)
在cmd輸入代碼如下
scrapy crawl books -o fiction.csv
就可以調用我們寫的爬蟲程序進行數據爬取啦!!!
最后貼個爬下來的數據的圖