利用scrapy框架爬取百度閱讀書籍資訊
阿新 • • 發佈:2018-12-15
專案需求:爬取百度閱讀的榜單圖書的資訊,如:書名、評分、作者、出版方、標籤、價格,生成一個csv檔案。
專案的大致流程:建立spider工程專案,建立spider爬蟲,定義相關欄位,分析頁面資訊......
由於scpapy框架,之間存在相互聯絡,針對此專案不同的檔案需要進行相關的專案,一下通過程式碼簡單介紹。
先看spider程式碼:
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractor import LinkExtractor from ..items import BookItem class Top200Spider(scrapy.Spider): name = 'top200' allowed_domains = ['yuedu.baidu.com'] start_urls = ['https://yuedu.baidu.com/rank/hotsale?pn=0'] #解析書籍資料列表 def parse(self, response): #提取每一本書籍頁面的連結 le = LinkExtractor(restrict_css='a.al.title-link') for link in le.extract_links(response): yield scrapy.Request(link.url,callback=self.parse_book) #提取下一頁列表的連結 url = response.css('div.pager a.next::attr(href)').extract_first() #判斷是否存在下一頁 if url: url = response.urljoin(url) yield scrapy.Request(url,callback=self.parse) def parse_book(self,response): sel = response.css('div.content-block') item = BookItem() #書名 item['name'] = sel.css('h1.book-title::attr(title)').extract_first() #評分 item['rating'] = sel.css('div.doc-info-score span.doc-info-score-value::text').extract_first() #作者 item['authors'] = sel.css('ul.doc-info-org li.doc-info-author a::text').extract_first() #版權方 item['publisher'] = sel.css('ul li').xpath('.//span[contains(string(.),"版權方")]/../a/text()').extract_first() #標籤 item['tags'] = sel.css('div.content a::attr(title)').extract() #價格 item['price'] = sel.css('div.price-info span.numeric::text').extract() yield item
注意點:Item類需要匯入,在Items檔案中進行欄位的定義,見程式碼:
import scrapy class BookItem(scrapy.Item): # define the fields for your item here like: name = scrapy.Field() rating = scrapy.Field() authors = scrapy.Field() publisher = scrapy.Field() tags = scrapy.Field() price = scrapy.Field()
注意:在爬取網站前,先到shell中進行測試,看通過選擇器能不能獲取欄位資訊。還需要在setting檔案中進行相關的設定,因為好多網站設有反爬蟲技術,所以我們可以先訪問robots.txt 檔案,檢視允許爬取的內容。在setting中設定,見程式碼:
USER_AGENT = 'Baiduspider' # 更改robots檔案能夠訪問的請求頭
最後,執行爬蟲:生成books.csv檔案。
scrapy crawl top200 -o books.csv