简书短篇小说专栏爬取

来源:互联网 发布:淘宝直通车协议 编辑:程序博客网 时间:2024/03/29 18:59

简书短篇小说专栏爬取


- 通过scrapy框架实现

- 浏览器伪装实现

- 文件以html格式保存到本地文件夹


1.准备工作

(1)通过cmd创建项目:scrapy startproject jianshu
(2)创建爬虫文件:cd jianshu
scrapy genspider novel jianshu.com

2.开始编写

(1)用pycharm打开项目,可以看到这样的文件结构:
这里写图片描述

(2)分析网站。打开简书的短篇小说专栏|短篇小说,可以看到很多的文章:

这里写图片描述

(3)点开一篇文章,可以看到:

这里写图片描述
……小说内容

在这里,我们需要抓取的是小说链接(link)和标题(title)。

(4)在pycharm中打开items.py,编写如下代码:

class JianshuItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    #获取的文章链接    link = scrapy.Field()    #获取的文章标题    title = scrapy.Field()

(5)打开novel.py文件,编写如下代码:

# -*- coding: utf-8 -*-import scrapyimport reimport urllib.requestfrom scrapy.http import Requestfrom jianshu.items import JianshuItemclass NovelSpider(scrapy.Spider):    name = 'novel'    allowed_domains = ['jianshu.com']    #start_urls = ['http://jianshu.com/']    #浏览器伪装头文件构造    header = {"User-Agent":"ozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}    #存放所有文章来链接    allurl = []    #链接构造,实现翻页(通过简单的抓包分析可得出),爬取200页    for page in range(0,200):        thisurl = "http://www.jianshu.com/c/dqfRwQ?order_by=commented_at&page="+str(page)        allurl.append(thisurl)    #设置爬取的初始链接,并通过生成器yield转向回调函数parse()进行处理    def start_requests(self):        for k in range(0,len(self.allurl)):            cu_url = self.allurl[k]            yield Request(cu_url,headers=self.header,callback=self.parse)    #此函数对爬取返回的数据进行相关处理    def parse(self, response):        data = response.body.decode("utf-8")        item = JianshuItem()        #利用xpath表达式提取文章标题        alltitle = response.xpath("//a[@class='title']/text()").extract()        #利用正则表达式提取文章链接(分析网页即可写出相应的表达式)        pat = '<a class="title" target="_blank" href="(.*?)">'        rst = re.compile(pat).findall(data)        #接下来是对链接(rst)和标题(alltitle)进行去重处理,提高爬取效率。alllink和alltitle1存放的是去重后的内容        alllink = []        for link in range(0,len(rst)):            if rst[link] not in alllink:                alllink.append(rst[link])        alltitle1 = []        for link in range(0, len(alltitle)):            if alltitle[link] not in alllink:                alltitle1.append(alltitle[link])        #将爬取的文章下载到本地        for i in range(0,len(alllink)):            #添加异常处理,增强爬虫的生命力            try:                thislink = "http://www.jianshu.com//"+alllink[i]                print(alltitle1[i]+"\n")#利用urllib.request中的urlretrieve方法下载文件,并赋予对应的标题         urllib.request.urlretrieve(thislink,"F:\\Python\\Web Spider\\Crawl Data\\简书短篇小说专栏爬取\\"+re.sub("\|","--",alltitle1[i])+".html")            except Exception as err:                print("出现异常:"+str(err))

(6)运行程序:scrapy crawl novel或scrapy crawl novel –nolog(忽略调试信息)

如果出现robots.txt协议不允许,打开settings.py文件。按Ctrl+F键,然后输入robots,将ROBOTSTXT_OBEY = True改为ROBOTSTXT_OBEY = False即可

如出现不能运行的情况,请根据错误提示信息进行修改,千万要耐心

(7)如无特殊情况,你会在你的文件夹中看到数据,并且cmd命令行会输出文章标题:
这里写图片描述