简书短篇小说专栏爬取
- 通过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命令行会输出文章标题: