爬蟲入門(四)——Scrapy框架入門:使用Scrapy框架爬取全書網小說數據


為了入門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

就可以調用我們寫的爬蟲程序進行數據爬取啦!!!

最后貼個爬下來的數據的圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM