爬取奇书网书籍信息并存入自动生成的xls表中(完善版)
# -*- 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.*?/(.*?) ', 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表中(完善版)相关推荐
- 爬取奇书网书籍信息并存储在自动生成的slsx表中(正则初级)
# -*- coding: utf-8 -*- __author__ = '木之易' __date__ = '2018/8/9 9:34'import re from urllib import re ...
- Python 爬虫第三步 -- 多线程爬虫爬取当当网书籍信息
XPath 的安装以及使用 1 . XPath 的介绍 刚学过正则表达式,用的正顺手,现在就把正则表达式替换掉,使用 XPath,有人表示这太坑爹了,早知道刚上来就学习 XPath 多省事 啊.其实我 ...
- python爬虫-爬取当当网书籍信息存到Excel中
文章目录 一.任务 二.分析 (一).单页面的信息分析 源代码分析 目标信息定位与分析 代码设计 (二).所有目标页面链接分析 目标链接分析 代码设计 三.注意要点 四.完整代码 五.参考 一.任务 ...
- Python |(爬虫 )爬取当当网书籍信息存到Excel中
文献检索作业,小白也很无奈.还好有学霸同学的可以借鉴. 一.任务 获取当当网上至少300本书[均为某类书,如Linux相关的书籍,或C++相关的书籍]的信息,包括书名,网址,价格,作者,并存在exce ...
- python爬取京东python书籍信息
python爬取京东python书籍信息 直接上代码镇宅......................... 需要用到的库:requests lxml pymongo 需要安装这些库,并且配置好mong ...
- Python2 Python3 爬取赶集网租房信息,带源码分析
*之前偶然看了某个腾讯公开课的视频,写的爬取赶集网的租房信息,这几天突然想起来,于是自己分析了一下赶集网的信息,然后自己写了一遍,写完又用用Python3重写了一遍.之中也遇见了少许的坑.记一下.算是 ...
- python爬虫scrapy爬取新闻标题及链接_python爬虫框架scrapy爬取梅花网资讯信息
原标题:python爬虫框架scrapy爬取梅花网资讯信息 一.介绍 本例子用scrapy-splash爬取梅花网(http://www.meihua.info/a/list/today)的资讯信息, ...
- scrapy框架的简单使用——爬取当当网图书信息
** Scrapy爬取当当网图书信息实例 --以警察局办案为类比 ** 使用Scrapy进行信息爬取的过程看起来十分的复杂,但是他的操作方式与警局办案十分的相似,那么接下来我们就以故事的形式开始Scr ...
- 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息
提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...
最新文章
- configure - 配置源代码树
- Qt Creator快捷键
- vs.net2003在代理下的一个奇怪小问题
- php实战搭建博客,yii2项目实战-博客管理平台的搭建
- 全球最囧的爱情测试.....
- mysql禁用历史命令_如何禁止mysql记录历史命令
- Robochameleon——Quick Start Guide
- ElasticSearch核心基础之索引管理
- DPDK 绑定网卡之后的解绑
- 事务注解放到类上面 下面私有方法有效吗_【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)...
- redis mysql windows_Redis+Mysql模式和内存+硬盘模式的异同
- 图像处理之局部二值特征
- Swift iOS : plist
- Postman局部变量设置
- idea无法找到主启动类_IDEA打包jar-解决找不到或无法加载主类 main的问题
- 计算机 英语词汇 缩写,计算机相关的53个英语单词缩写
- <C++>初识多态,剖析virtual关键字
- Linux(Ubuntu)入门——2.Linux基础命令
- easyRL蘑菇书阅读笔记(一)
- Android -- 启动页面背景图片配置(splash)