简书短篇小说专栏爬取

简书短篇小说专栏爬取


- 通过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 scrapy
import re
import urllib.request
from scrapy.http import Request
from jianshu.items import JianshuItem

class 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命令行会输出文章标题:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值