这次的爬虫相对于上一版来说,增加了对小说内容的爬取,并且利用了Redis数据库。
环境: win10 py3.6 pycharm scrapy1.6

main.py

from scrapy import cmdline
cmdline.execute('scrapy crawl dmoz'.split())

setting.py

# -*- coding: utf-8 -*-
# 系统自动生成的配置
BOT_NAME = 'Spider'
SPIDER_MODULES = ['Spider.spiders']
NEWSPIDER_MODULE = 'Spider.spiders'# redis数据库的一些基本配置(这里的redis没有配置任何密码,在本地使用)
# 这些内容为自己添加的内容 不用redis数据库时不需要配置
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
REDIS_URL = None
REDIS_HOST = '127.0.0.1'
REDIS_POST = 6379# scrapy爬虫中使用的请求头
USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'# 是否遵守robots协议
ROBOTSTXT_OBEY = False# 连接Mongode数据库的配置
# 以下的内容为自己添加的内容,不需要使用Mongode数据库的时候,不需要写
MONGODE_HOST = '127.0.0.1'
MONGODE_PORT = 27017
MONGODE_DBNAME = 'Test'
MONGODE_DOCNAME = 'Book3'# 配置最大并发请求的数目
#CONCURRENT_REQUESTS = 32# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# 下载器在下载同一网站下一个页面需要等待的时间,该选项可用来限制爬虫的爬取速度
#DOWNLOAD_DELAY = 3# 对单个网站并发请求的最大值
#CONCURRENT_REQUESTS_PER_DOMAIN = 16# 对单个IP进行并发请求的最大值。
#CONCURRENT_REQUESTS_PER_IP = 16# 需要使用Cookies的时候开启   不适用的时候,禁用可以提高爬取速度
COOKIES_ENABLED = False# 内建的telnet控制台
#TELNETCONSOLE_ENABLED = False# Scrapy HTTP Request使用的默认header。由 DefaultHeadersMiddleware 产生。
#DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}# 是否启用scrapy的中间件
#SPIDER_MIDDLEWARES = {
#    'Spider.middlewares.SpiderSpiderMiddleware': 543,
#}# Enable or disable downloader middlewares
# 保存项目中启用的下载中间件及其顺序的字典
#DOWNLOADER_MIDDLEWARES = {
#    'Spider.middlewares.SpiderDownloaderMiddleware': 543,
#}# Enable or disable extensions
# 是否需要拓展
# See https://doc.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}# Configure item pipelines
# 保存项目,启用pipelines及其顺序的地点
ITEM_PIPELINES = {'Spider.pipelines.SpiderPipeline': 300,
}#启用和配置AutoThrottle扩展(默认情况下禁用)
# See https://doc.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True# 初始下载延迟
#AUTOTHROTTLE_START_DELAY = 5# 在高延迟的情况下设置的最大下载延迟
#AUTOTHROTTLE_MAX_DELAY = 60# 请求的平均数量并行发送到每个远程服务器上
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0# 启用显示所收到的每个响应的调节统计信息
#AUTOTHROTTLE_DEBUG = False# 是否启用和配置HTTP缓存 (默认不启用)
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

pipelines.py

from Spider.items import SpiderItem
from scrapy.conf import settings   # 配置项的使用
import pymongo                     # 导入python控制数据库mongode的包class SpiderPipeline(object):def __init__(self):# 类的初始化 这里连接的mongode数据库是没有上任何密码的host = settings['MONGODE_HOST']port = settings['MONGODE_PORT']dbName = settings['MONGODE_DBNAME']client = pymongo.MongoClient(host=host, port=port)tdb = client[dbName]self.post = tdb[settings['MONGODE_DOCNAME']]# 将返回的类似字典类型的items插入到数据库中def process_item(self, item, spider):bookInfo = dict(item)self.post.insert(bookInfo)return item

items.py

# -*- coding: utf-8 -*-
import scrapyclass SpiderItem(scrapy.Item):# 书名bookName = scrapy.Field()# 书标题bookTitle = scrapy.Field()# 章节数chapterNum = scrapy.Field()# 章节的名字chapterName = scrapy.Field()# 章节urlchapterURL = scrapy.Field()# 小说正文text = scrapy.Field()

Noverspider.py(核心代码)

from scrapy_redis.spiders import RedisSpider
from scrapy.selector import Selector
from Spider.items import SpiderItem
from scrapy.http import Requestclass Noverspider(RedisSpider):name = 'dmoz'redis_key = 'Noverspider:start_urls'# 需要爬取的url列表start_urls = ['http://www.daomubiji.com/']def parse_son(self, response):# 类的初始化 这里下载的是除书内容外的所有内容item = SpiderItem()# 选择器的初始化selector = Selector(response)# 获取书的名字bookName = selector.xpath('//div[@class="container"]/h1/text()').extract()# 先抓大后抓小 这里是抓的章节的大Chapter = selector.xpath('//div[@class="excerpts"]')content = Chapter.xpath('.//article/a/text()').extract()# 用每一个url作为下一个for循环的条件url = Chapter.xpath('.//article/a/@href').extract()# 循环提取盗墓笔记中需要的内容for i in range(len(url)):# 这里的try except是由于部分书籍的规则不尽相同,这里是添加了异常判断try:item['bookName'] = bookName[0].split(':')[0]item['bookTitle'] = bookName[0].split(':')[1]except Exception as e:item['bookName'] = bookName[0]# url的获取item['chapterURL'] = url[i]try:item['chapterNum'] = content[i].split(' ')[1]item['chapterName'] = content[i].split(' ')[2]except Exception as e:item['chapterNum'] = content[i].split(' ')[1]# yield可以理解为只要扔出请求它就会有专门的下载器进行下载  参数如下  第一个url信息  第二个回调函数将要执行的地址# self.parseContent()表示的是函数的执行  self.parseContent表示的是函数的地址yield Request(url[i], callback=self.parseContent, meta={'item':item})def parseContent(self, response):# 类的初始化item = response.meta['item']selector = Selector(response)text = selector.xpath('//article[@class="article-content"]/p/text()').extract()text_new = ((''.join(text).replace('\u3000',''))).strip()item['text'] = text_newyield item# 程序入口def parse(self, response):selector = Selector(response)# 获取每一本书得链接地址,让程序通过主网页就可以爬取到他的子网页urls = selector.xpath('//article/p/a/@href').extract()for each in urls:yield Request(each, callback=self.parse_son)

成果展示:

参考博客: https://www.jianshu.com/p/219ccf8e4efb

Scrapy爬取盗墓笔记 0.2版(mongedb redis)相关推荐

  1. Scrapy 爬取盗墓笔记小说

    Scrapy 爬取盗墓笔记小说 应用 Scrapy框架 爬取盗墓笔记小说数据,存入MongoDB 数据库. # settings 配置mongodb MONGODB_HOST = '127.0.0.1 ...

  2. python爬取公众号历史文章_python3 scrapy爬取微信公众号及历史信息V1.0

    妹子图.png 环境:python3  scrapy 目的 写这篇文章主要是做一下纪念,毕竟是搞了快两天的东西了,今天加大了量,使用scrapy爬取100多个微信公众号,然后出现IP被封的情况下,当然 ...

  3. scrapy 解析css,Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段...

    上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息 通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写 ...

  4. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  5. python爬虫-爬取盗墓笔记

     本来今天要继续更新 scrapy爬取美女图片 系列文章,可是发现使用免费的代理ip都非常不稳定,有时候连接上,有时候连接不上,所以我想找到稳定的代理ip,下次再更新  scrapy爬取美女图片之 ...

  6. 利用scrapy爬取京东移动端的图片素材和商品信息

    有一个练习项目需要一些带分类信息的商品测试图片,从现有的电商网站爬取是个不错的选择.刚好最近又在练习scrapy的使用,这一篇记录一下用scrapy爬取京东的图片素材并保存商品信息的思路. 文中代码共 ...

  7. 【爬虫】Scrapy爬取腾讯社招信息

    目标任务:爬取腾讯社招信息,需要爬取的内容为:职位名称,职位的详情链接,职位类别,招聘人数,工作地点,发布时间. 一.预备基础 1.Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站 ...

  8. Python scrapy爬取京东,百度百科出现乱码,解决方案

    Python scrapy爬取京东 百度百科出现乱码 解决方案 十分想念顺店杂可... 抓取百度百科,出现乱码 把页面源码下载下来之后,发现全是乱码,浏览器打开 但是浏览器链接打开就没有乱码 以下是浏 ...

  9. Scrapy爬取姓名大全,看看那个名字最受父母青睐

    点击上方"AI搞事情"关注我们 最近在做的项目需要用到名字的数据,可哪儿有这么多名字给我用呢?经一通搜索,不仅找到一个神奇的网站姓名大全,还有人开源了爬虫的代码.让我一番修改,得到 ...

最新文章

  1. 问题用户小米科技CEO雷军:千万别把用户当上帝
  2. git stash的用法
  3. 【pytorch速成】Pytorch图像分类从模型自定义到测试
  4. 这些年书读太少,没有读进去
  5. 自定义对话框 提示:Unable to add window token null is not for an application
  6. Leetcode--42.接雨水
  7. Python高级——闭包与装饰器
  8. null最后如何排序的_LeetCode 148——排序链表
  9. excel文件成绩处理python代码_Python处理Excel文件实例代码
  10. Centos7 安装zmap
  11. html微信怎么转发,微信朋友圈怎么转发别人的文章(链接、视频、图片、文字)
  12. 路由器硬改+刷OpenWrt+挂载摄像头+U盘
  13. docker出现问题:You cannot remove a running container 解决方案
  14. java 多定时任务_多机部署之定时任务完整方案
  15. python怎么画圆螺旋线_使用Turtle画正螺旋线的方法
  16. 全球及中国面膜行业消费格局与十四五趋势分析报告2022年
  17. openstack-Agile Controller-DCN插件安装
  18. 解决升级Chrome浏览器之后出现跨域错误:Access to xxx has been blocked by CORS policy: XXXX
  19. 微信公众号开发获取openID以及用户详细信息,超详细步骤,亲测开发
  20. C盘爆满的解决方案?很可能是因为这个Group2文件夹

热门文章

  1. 教程 | 如何用cd-hit去除冗余序列?
  2. 吐血整理的Google Guava
  3. 电子邮箱申请注册,哪个品牌更值得推荐?
  4. 任务二:分别定义Teacher(教师)类和Cadre(干部)类
  5. 个人第一个在线看电影电视网站
  6. scipy,weibull_min中文翻译(也就是一般的weibull分布,可以通过改变参数设置为三参数或者两参数。)
  7. C语言嵌入式Linux高级编程
  8. 华山医院释放信息化“洪荒之力” 为400万患者提供智慧医疗
  9. EZ-Cube简易款下载器烧写使用方法
  10. ROS-Control专题:写一个实时关节控制器( realtime joint controller)