# -*- coding: utf-8 -*-
__author__ = '木之易'
__date__ = '2018/8/10 9:08'
import re
from random import choice
from urllib import requestimport xlwt"""爬取奇书网书籍信息终极版"""class NovelSpider(object):def __init__(self):self.url = 'https://www.qisuu.la/soft/sort01/'self.html = ''# 引入多网站的个请求头,运行程序时在其中随机选择一个self.ua_list = ['Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36']self.total = 0self.count = 0self.retry_count = 0# 创建工作簿对象,指定编码格式self.workbook = xlwt.Workbook(encoding='utf-8')# 添加一张数据表,用来储存爬取到的信息self.sheet = self.workbook.add_sheet('novel_data')self.create_excel()def create_excel(self):"""添加表头数据"""# 3.向表中添加数据# 3.1 行号 3.2 列号 3.3 写入的数据self.sheet.write(0, 0, '小说名称')self.sheet.write(0, 1, '点击次数')self.sheet.write(0, 2, '文本大小')self.sheet.write(0, 3, '书籍类型')self.sheet.write(0, 4, '更新日期')self.sheet.write(0, 5, '连载状态')self.sheet.write(0, 6, '书籍作者')self.sheet.write(0, 7, '运行环境')self.sheet.write(0, 8, '小说简介')self.sheet.write(0, 9, '下载地址')def get_html(self, url):# 1.创建request对象,设置随机请求头req = request.Request(url=url, headers={'User-Agent': choice(self.ua_list)})# 异常捕获try:# 每请求一次,请求次数+1self.retry_count += 1# 2.发起请求response = request.urlopen(req)# 3.接收数据self.html = response.read().decode('utf-8')except Exception as e:# 请求重试次数大于3,放弃该请求if self.retry_count > 3:print('请求失败,地址:{}'.format(url))return# 重新发送请求print('请求数据失败,正在尝试重新连接...')self.get_html(url)else:# 归0self.retry_count = 0def get_total(self):# 1.获取源代码self.get_html(self.url)# 2.准备正则pattern = re.compile(r'<div class="tspage.*?/(.*?)&nbsp;', re.S)# 3.搜索rs = re.search(pattern, self.html)if rs:self.total = int(rs.group(1))print(self.total)def parse_index(self):# 1.准备正则pattern = re.compile(r'<li.*?<div.*?class="s".*?<a href="(.*?)"', re.S)# 2.搜索数据results = re.findall(pattern, self.html)# 3.循环遍历每一个小链接for link in results:url = 'https://www.qisuu.la' + link# 4.获取详情页面的源代码self.get_html(url)# 5.解析详情页面数据self.parse_detail()def parse_detail(self):#1 准备正则pattern = re.compile(r"""<div class="detail_right.*?<h1>(.*?)</h1.*?<li.*?:(.*?)<.*?:(.*?)<.*?:(.*?)<.*?:(.*?)<.*?:(.*?)<.*?:(.*?)<.*?:(.*?)<.*?<div class="showInfo".*?<p.*?>(.*?)</p.*?get_down_url.*?,'(.*?)'""", re.S)results = re.findall(pattern, self.html)# 1.提取数据title = results[0][0]click_num = results[0][1]file_size = results[0][2]novel_type = results[0][3]datetime = results[0][4]status = results[0][5]author = results[0][6]run_sys = results[0][7]description = results[0][8].replace(' ',' ')download = results[0][9]# 保存数据self.save_data(title, click_num, file_size, novel_type, datetime, status, author, run_sys, description, download)# 封装写入excel表格的函数# def write_to_excel(self, idx, data):#     print(idx, data)#     self.sheet.write(self.count, idx, data)def save_data(self, *args):self.count += 1print('正在保存第{}本小说:{}'.format(self.count, args[0]))# 1.基础写法self.sheet.write(self.count, 0, args[0])self.sheet.write(self.count, 1, args[1])self.sheet.write(self.count, 2, args[2])self.sheet.write(self.count, 3, args[3])self.sheet.write(self.count, 4, args[4])self.sheet.write(self.count, 5, args[5])self.sheet.write(self.count, 6, args[6])self.sheet.write(self.count, 7, args[7])self.sheet.write(self.count, 8, args[8])self.sheet.write(self.count, 9, args[9])# 2.进阶写法# *args 将元组看做一个容器,进行枚举# for idx, data in enumerate(args):#     if idx == 8:#         data = data.replace(' ', ' ')##     self.write_to_excel(idx, data)# 3.终极写法# rs = map(lambda idx, data: self.sheet.write(self.count, idx, data), range(10), args)# for x in rs:#     passself.workbook.save('小说数据.xls')def parse_type(self):pattern = re.compile(r'<div class="nav">(.*?)</div>', re.S)res = re.search(pattern, self.html)if res:html = res.group(1)results = re.findall(re.compile(r'<a.*? href="(.*?)".*?>(.*?)</a>',re.S), html)# 返回所有分类地址# x是一个小元组return map(lambda x: ('https://www.qisuu.la'+x[0],x[1]), results[1:])def run(self):# 获取总页码self.get_total()# 获取所有分类地址types = self.parse_type()for t_info in types:# print(t_info)#print('正在爬取{}下的小说.....'.format(t_info[1]))for x in range(1, self.total + 1):print(''.center(50,'*'))print('正在获取%s下的第%s页数据,请稍后....' % (t_info[1], x))# 拼接完整的url地址url = t_info[0] + 'index_{}.html'.format(x)# 获取该页源代码self.get_html(url)# 解析源代码,提取数据self.parse_index()breakself.workbook.save('小说数据.xls')if __name__ == '__main__':novel = NovelSpider()novel.run()

爬取奇书网书籍信息并存入自动生成的xls表中(完善版)相关推荐

  1. 爬取奇书网书籍信息并存储在自动生成的slsx表中(正则初级)

    # -*- coding: utf-8 -*- __author__ = '木之易' __date__ = '2018/8/9 9:34'import re from urllib import re ...

  2. Python 爬虫第三步 -- 多线程爬虫爬取当当网书籍信息

    XPath 的安装以及使用 1 . XPath 的介绍 刚学过正则表达式,用的正顺手,现在就把正则表达式替换掉,使用 XPath,有人表示这太坑爹了,早知道刚上来就学习 XPath 多省事 啊.其实我 ...

  3. python爬虫-爬取当当网书籍信息存到Excel中

    文章目录 一.任务 二.分析 (一).单页面的信息分析 源代码分析 目标信息定位与分析 代码设计 (二).所有目标页面链接分析 目标链接分析 代码设计 三.注意要点 四.完整代码 五.参考 一.任务 ...

  4. Python |(爬虫 )爬取当当网书籍信息存到Excel中

    文献检索作业,小白也很无奈.还好有学霸同学的可以借鉴. 一.任务 获取当当网上至少300本书[均为某类书,如Linux相关的书籍,或C++相关的书籍]的信息,包括书名,网址,价格,作者,并存在exce ...

  5. python爬取京东python书籍信息

    python爬取京东python书籍信息 直接上代码镇宅......................... 需要用到的库:requests lxml pymongo 需要安装这些库,并且配置好mong ...

  6. Python2 Python3 爬取赶集网租房信息,带源码分析

    *之前偶然看了某个腾讯公开课的视频,写的爬取赶集网的租房信息,这几天突然想起来,于是自己分析了一下赶集网的信息,然后自己写了一遍,写完又用用Python3重写了一遍.之中也遇见了少许的坑.记一下.算是 ...

  7. python爬虫scrapy爬取新闻标题及链接_python爬虫框架scrapy爬取梅花网资讯信息

    原标题:python爬虫框架scrapy爬取梅花网资讯信息 一.介绍 本例子用scrapy-splash爬取梅花网(http://www.meihua.info/a/list/today)的资讯信息, ...

  8. scrapy框架的简单使用——爬取当当网图书信息

    ** Scrapy爬取当当网图书信息实例 --以警察局办案为类比 ** 使用Scrapy进行信息爬取的过程看起来十分的复杂,但是他的操作方式与警局办案十分的相似,那么接下来我们就以故事的形式开始Scr ...

  9. 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息

    提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...

最新文章

  1. configure - 配置源代码树
  2. Qt Creator快捷键
  3. vs.net2003在代理下的一个奇怪小问题
  4. php实战搭建博客,yii2项目实战-博客管理平台的搭建
  5. 全球最囧的爱情测试.....
  6. mysql禁用历史命令_如何禁止mysql记录历史命令
  7. Robochameleon——Quick Start Guide
  8. ElasticSearch核心基础之索引管理
  9. DPDK 绑定网卡之后的解绑
  10. 事务注解放到类上面 下面私有方法有效吗_【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)...
  11. redis mysql windows_Redis+Mysql模式和内存+硬盘模式的异同
  12. 图像处理之局部二值特征
  13. Swift iOS : plist
  14. Postman局部变量设置
  15. idea无法找到主启动类_IDEA打包jar-解决找不到或无法加载主类 main的问题
  16. 计算机 英语词汇 缩写,计算机相关的53个英语单词缩写
  17. <C++>初识多态,剖析virtual关键字
  18. Linux(Ubuntu)入门——2.Linux基础命令
  19. easyRL蘑菇书阅读笔记(一)
  20. Android -- 启动页面背景图片配置(splash)

热门文章

  1. 七夕活动主题html邮件,七夕节活动主题口号
  2. 真假yy羽拍线简单鉴别方法
  3. 自己善良才能感知美好
  4. 高品质的音乐蓝牙耳机有哪些推荐?音质好的蓝牙耳机排行榜
  5. 俞敏洪:成功从追女孩开始追一个女孩子背后的人生哲学
  6. 苹果M2 Max Geekbench 跑分曝光:12 核 / 3.5GHz,配 96GB 内存
  7. 企业数字化的这5项基本能力,再不修炼就晚了!
  8. 虚拟机如何构建dhcp服务器,vmware虚拟机怎么做DHCP服务器
  9. vue-cli创建uni-app引入uni-ui
  10. [笔记]搜索引擎-实验报告-实验一