Python爬蟲實戰之使用Scrapy爬起點網的完本小說

一.概述

本篇的目的是用scrapy來爬取起點小說網的完本小說,使用的環境ubuntu,至於scrapy的安裝就自行百度了。

二.創建項目

scrapy startproject name 通過終端進入到你創建項目的目錄下輸入上面的命令就可以完成項目的創建.name是項目名字.

三.item的編寫

我這裡定義的item中的title用來存書名,desc用來存書的內容.、

import scrapynnnclass TutorialItem(scrapy.Item):n # define the fields for your item here like:n # name = scrapy.Field()n title = scrapy.Field()n desc = scrapy.Field()n passn

四.pipelines的編寫

在pipelines可以編寫存儲數據的形式,我這裡就是使用txt形式的文件來存儲每一本書

import jsonnimport codecsnn#以txt的形式存儲nclass TutorialPipeline(object):n #def __init__(self):nn def process_item(self, item, spider):n //根據書名來創建文件,item.get(title)就可以獲取到書名n self.file = codecs.open(item.get(title)+.txt, w, encoding=utf-8)n self.file.write(item.get("desc")+ "n")n return itemnn def spider_closed(self, spider):n self.file.close()n

五.Setting的編寫

只要將下面代碼中的tutorial替換成自己項目的名字就可以

BOT_NAME = tutorialn#USER_AGENTnUSER_AGENT = Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5n# start MySQL database configure settingnn# end of MySQL database configure settingnnSPIDER_MODULES = [tutorial.spiders]nNEWSPIDER_MODULE = tutorial.spidersnn# Crawl responsibly by identifying yourself (and your website) on the user-agentn#USER_AGENT = tutorial (+http://www.yourdomain.com)nITEM_PIPELINES = {n tutorial.pipelines.TutorialPipeline: 300,nn}n

六.spider的編寫

# -*- coding: utf-8 -*-nimport scrapynfrom scrapy.spider import BaseSpidernfrom scrapy.selector import HtmlXPathSelectornfrom tutorial.items import TutorialItemnfrom scrapy.http import Requestnnnclass DmozSpider(scrapy.Spider):n name = "dmoz"n allowed_domains = ["dmoz.org"]n //我這裡是下載起點體育類的完本小說,所以通過for來創建每一個頁面的url,因為每一個只是page不同而已,而page是根據全部的本數/頁數而來n start_urls = [n "http://fin.qidian.com/?size=-1&sign=-1&tag=-1&chanId=8&subCateId=-1&orderId=&update=-1&page="+str(page)+"&month=-1&stylex=1&vip=-1" for page in range(1,292/20)n ]nn def parse(self, response):n hxs = HtmlXPathSelector(response)n //獲取每一個書的urln book =hxs.select(//div[@class="book-mid-info"]/h4/a//@href).extract()nn for bookurl in book:n //根據獲取到的書本url跳轉到每本書的頁面n yield Request("http:"+bookurl, self.parseBook, dont_filter=True)nnn def parseBook(self,response):n hxs = HtmlXPathSelector(response)n //獲取免費閱讀的urln charterurl = hxs.select(//div[@class="book-info "]//a[@class="red-btn J-getJumpUrl "]/@href).extract()n //每一本書都創建一個itemn item = TutorialItem()n for url in charterurl:n 通過免費閱讀的url進入書的第一章n yield Request("http:"+url,meta={item: item},callback=self.parseCharter, dont_filter=True)nnn def parseCharter(self ,response):n hxs = HtmlXPathSelector(response)n //獲取書名n names = hxs.select(//div[@class="info fl"]/a[1]/text()).extract()n //獲取上面傳遞過來的itemn item = response.meta[item]n for name in names:n //將書名存入到item的title欄位中n names = item.get(title)n if None==names:n item[title] = namen//獲取章節名n biaoti = hxs.select(//h3[@class="j_chapterName"]/text()).extract()n content = n for biaot in biaoti:n content=content+biaot+"n"n //獲取每一章的內容n s = hxs.select(//div[@class="read-content j_readContent"]//p/text()).extract()n for srt in s:n //將章節和內容拼接起來存入到item的desc中n content = content + srtn desc = item.get(desc)n if None==desc:n item[desc] =contentn else:n item[desc]=desc+contentn if content==:n yield itemnnn #獲取下一章的內容n chapters = hxs.select(//div[@class="chapter-control dib-wrap"]/a[@id="j_chapterNext"]//@href).extract()n for chapter in chapters:n #print "https:" + chaptern yield Request("http:" + chapter, meta={item: item},callback=self.parseCharter, dont_filter=True)n

七.總結

通過上面的代碼雖然可以獲取所有書的內容,但是起點是有vip限制的,也就是說必須用起點的vip帳號登錄才能查看完本的小說,因此這有點遺憾,我沒有起點小說網的會員.

——————

你想更深入了解學習Python知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:

【超全整理】《Python自動化全能開發從入門到精通》筆記全放送

為了方便大家學習,我建立了一個Python交流群,目前群內已經有450個小夥伴,學習寂寞的小夥伴不妨一起來玩~群號:475035830

__________

本文作者:totcw

轉載來源:blog.csdn.net/totcw/art


推薦閱讀:

第四章:動態網頁抓取 (解析真實地址 + selenium)
汽車之家字體反爬破解實踐
爬取張佳瑋138萬知乎關注者:數據可視化
python爬蟲之圖片下載APP1.0
從python爬蟲,到更愛這個世界

TAG:Python入门 | Python教程 | python爬虫 |