这是一个简单的分布式爬虫,网站其实并不复杂,文章主要为了写一下分布式的布局。

首先使用命令 scrapy genspider -t crawl “爬虫名”  网址,创建一个爬虫。然后添加代码

from scrapy_redis.spiders import RedisCrawlSpider

引入RedisCrawlSpider,并让爬虫继承于此。删除start_urls,并在rules中添加所需要的url的正则表达的:

class NovelSpiderSpider(RedisCrawlSpider):name = 'novel_spider'redis_key = 'novel_spider:start_urls'list_page_lin=LinkExtractor(allow=(r'https://www.23us.so/list/.*?html'))novel_page=LinkExtractor(allow=(r'https://www.23us.so/xiaoshuo/\d+.html'))chapter_page=LinkExtractor(allow=(r'https://www.23us.so/files/article/html/\d+/\d+/index.html'))contents_page=LinkExtractor(allow=(r'https://www.23us.so/files/article/html/\d+/\d+/\d+.html'))# print(novel_page)rules = (Rule(list_page_lin,follow=True),Rule(novel_page,callback='parse_intro',follow=True),Rule(chapter_page,follow=True,),Rule(contents_page,callback='parse_item',follow=True))

follow=True或者follow=False,表示是否对网页进行深度抓取,因为scrapy_redis中本身存在去重的机制,所以我选择的都是True。然后在callback的回调解析中解析你所需要的内容,我分了两个库存储,一个存放内容介绍,一个存放具体的章节和内容。

def parse_item(self, response):print("===============================")# print(response.url)item = XiaoshuoItem()item['rr']="21"# item['url']=response.urlitem['n_name'] = response.xpath('//*[@id="amain"]/dl/dt/a[3]/text()').extract_first()item['c_name'] = response.xpath('//*[@id="amain"]/dl/dd[1]/h1/text()').extract_first()print(response.xpath('//*[@id="amain"]/dl/dd[1]/h1/text()').extract_first())ret = ''contents = response.xpath('//dd[@id="contents"]/text()').extract()for i in contents:ret += iitem['c_contents'] = retyield item

存储的时候由于是分连个库存储的,需要区分内容,所以我加了一个隐藏的字段“rr”,在pipeline中判断本字段的内容或者格式来区分存储的库,其实使用if isinstance(item,XiaoshuoItem),这样判断也可以,但是数据多的时候可能会出现问题,所以我使用了隐藏字段,字段之作判断,并不保存。

数据的存储,我把书本简介存到了MongoDB中,把书的内容存到了mysql中,当然其实所有内容存到redis中会更加快点,但是我还是选择了mysql,没啥,就是习惯了。我在存mysql的时候,每个小说创建了一个表,表名称就是小说名

class DingdianxiaoshuoPipeline(object):def __init__(self):self.conn=pymysql.connect(host=MYSQL_HOST,port=MYSQL_PORT,user=MYSQL_USER,passwd=MYSQL_PASSWORD,db=MYSQL_DB,)self.cursor=self.conn.cursor()def process_item(self, item, spider):# table_name = item['n_name']if type(item['rr'])==str:creat_table='CREATE TABLE IF NOT EXISTS {} (novel_chapter varchar(256),chapter_contents varchar(10000))'.format(item['n_name'])self.cursor.execute(creat_table)data=[(item['c_name'],item['c_contents']),]sql="INSERT INTO {} (novel_chapter,chapter_contents) VALUES (%s,%s)".format(item['n_name'])self.cursor.executemany(sql,data)self.conn.commit()return itemelse:return item

整体的框架大约就是这样,我运行了一下午,并未见报错。但是为了保险起见,我还是加入了动态代理池和随机User-Agent表示对网站创作者的尊重,由于数量太大,并没有抓取完成。

分布式爬取顶点小说全站内容相关推荐

  1. scrapy-redis分布式爬虫全站爬取顶点小说网

    scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dupefilter - URL去重 ...

  2. Python的scrapy之爬取顶点小说网的所有小说

    闲来无事用Python的scrapy框架练练手,爬取顶点小说网的所有小说的详细信息. 看一下网页的构造: tr标签里面的 td 使我们所要爬取的信息 下面是我们要爬取的二级页面 小说的简介信息: 下面 ...

  3. Python网络爬虫(九):爬取顶点小说网站全部小说,并存入MongoDB

    前言:本篇博客将爬取顶点小说网站全部小说.涉及到的问题有:Scrapy架构.断点续传问题.Mongodb数据库相关操作. 背景: Python版本:Anaconda3 运行平台:Windows IDE ...

  4. python3.6爬虫案例:爬取顶点小说(爱看小说同学的福利)

    一.写在前面 这次本来打算爬百思不得姐视频的,谁料赶上此网站调整,视频专栏下线了,网站中也没有视频可爬.所幸先来说说如何爬取顶点小说吧. 顶点小说(https://www.x23us.com)里面的内 ...

  5. python爬取顶点小说简单版

    python爬取顶点小说简单版 爬取网络资源首先要下载requests库 因为这里面也有数据提取和分析所以也要有etree库,re库 下载库的代码是:pip install 库名 如:pip inst ...

  6. Scrapy爬取顶点小说网

    Scrapy爬取小说 爬取目标:顶点小说网 1.Scrapy的安装 pip install scrapy 2.Scrapy的介绍 创建项目 scrapy startproject xxx xxx项目名 ...

  7. Python-使用正则表达式爬取斗破苍穹小说文字内容(使用Requests库实现)

    **Python-爬取斗破苍穹小说文字内容(使用Requests库实现) ** 本次爬取的小说网站为:斗破小说网点击直达网站首页,本人爬取的网站里面的天斗破苍穹,你也可以根据文中提供的代码爬取其他的小 ...

  8. 用Python爬取顶点小说网站中的《庆余年》思路参考——记一次不成功的抓取

    目的:用python爬虫抓取顶点小说网站中的<庆余年>小说内容个,并保存为txt格式文件. 环境:Win10系统,Anaconda3 + PyCharm, python3.6版本 思路:( ...

  9. python多线程爬虫 爬取多个网页_python多线程爬虫爬取顶点小说内容(BeautifulSoup+urllib)...

    思路 之前写过python爬取起点中文网小说,多线程则是先把爬取的章节链接存到一个列表里,然后写一个函数get_text每次调用这个函数就传一个章节链接,那么就需要调用n次该函数来获取n章的内容,所以 ...

最新文章

  1. Android SurfaceView 黑背景的处理方法
  2. greendao3出现 Error:Execution failed for task ':app:greendao'
  3. python3 telnetlib实现telnet客户端
  4. wps右键新建里面没有word和excel_WPS竟然出过这么多实用工具?每个都免费无广告,简直相见恨晚...
  5. JSP中base href=%=basePath%作用
  6. mysql解释的type_mysql explain 的type解释
  7. 微信红包问题:找出某个出现次数超过红包总数一半的红包的金额(面试题)
  8. hadoop环境安装及简单Map-Reduce示例
  9. atitit.资源释放机制--attilax总结
  10. 如何有效提升软件测试质量?
  11. 对称矩阵可以分解为对称矩阵的乘积 对称矩阵开根
  12. shineblink MPU6050六轴传感器测量物体姿态角
  13. Unity Shader案例之——阴阳师画符效果
  14. js验证开始时间和结束时间 结束时间不能比开始时间早
  15. 数据时代的我们,应该拥有的大数据思维
  16. 结对编程-李晓彤+凌嘉文
  17. 陆琪:年薪十万凭什么不能开…
  18. d va爬黑板animate_对不起,我把APP也给爬了
  19. 如何查看当前IP地址
  20. MTK-MT65-MT67系列对比

热门文章

  1. C#中CoreWebView2 members cannot be accessed after the WebView2 control is disposed错误的解决方法
  2. Linux下的时间详解【转】
  3. shell脚本实现机选双色球
  4. 读书笔记——【决胜B端:产品经理升级之路】
  5. 苹果13用什么充电宝好?苹果13专用充电宝分享
  6. 人工智能真的智能吗?
  7. 飞桨领航团AI达人创造营4-在Jetson Nano上基于python部署Paddle Inference(硬件部署)
  8. 【听】情人,罗曼蒂克消亡史
  9. 仿9158 VC++视频聊天室源码
  10. MySQL 常用内置函数与所有内置函数