爬虫实践---一次下完所有小说:排行榜小说批量下载
一、目标
排行榜的地址: http://www.qu.la/paihangbang/
找到各类排行旁的的每一部小说的名字,和在该网站的链接。
二、观察网页的结构
很容易就能发现,每一个分类都是包裹在:
之中,
这种条理清晰的网站,大大方便了爬虫的编写。
在当前页面找到所有小说的连接,并保存在列表即可。
三、列表去重的小技巧:
就算是不同类别的小说,也是会重复出现在排行榜的。
这样无形之间就会浪费很多资源,尤其是在面对爬大量网页的时候。
这里只要一行代码就能解决:
这里调用了一个list的构造函数set:这样就能保证列表里没有重复的元素了。
四、代码实现
模块化,函数式编程是一个非常好的习惯,坚持把每一个独立的功能都写成函数,这样会使代码简单又可复用。
1.网页抓取头:
2.获取排行榜小说及其链接:
爬取每一类型小说排行榜,
按顺序写入文件,
文件内容为 小说名字+小说链接
将内容保存到列表
并且返回一个装满url链接的列表
3.获取单本小说的所有章节链接:
获取该小说每个章节的url地址,并创建小说文件
4.获取单页文章的内容并保存到本地
这里有个小技巧:
从网上爬下来的文件很多时候都是带着<br>之类的格式化标签,
可以通过一个简单的方法把它过滤掉:
html = get_html(url).replace('<br/>', 'n')
这里单单过滤了一种标签,并将其替换成‘n’用于文章的换行,
6.主函数
7.输出结果
5.缺点:
本次爬虫写的这么顺利,更多的是因为爬的网站是没有反爬虫技术,以及文章分类清晰,结构优美。
但是,按照这篇文的思路去爬取小说,
大概计算了一下:
一篇文章需要:0.5s
一本小说(1000张左右):8.5分钟
全部排行榜(60本): 8.5小时!
那么,这种 单线程 的爬虫,速度如何能提高呢?
自己写个多线程模块?
其实还有更好的方式: Scrapy框架
后面可将这里的代码重构一边遍,
速度会几十倍甚至几百倍的提高了!
这其实也是多线程的威力!
作者:Josiah 来源:http://www.cnblogs.com/Josiah-Lin/p/7241678.html
- Django 1.10中文文档-第一个应用Part4-表单和通用视图
- Python标准库笔记(2) — re模块
- Python爬虫—破解JS加密的Cookie
- Go语言中json转成map结构
- rpc-dubbo简单入门
- Django 1.10中文文档-第一个应用Part3-视图和模板
- Go语言对JSON进行编码和解码
- [Go 语言社区]服务器自测JS 工程
- Django 1.10中文文档-第一个应用Part2-模型和管理站点
- 亿以内所有素数(Go语言版)
- Django 1.10中文文档-第一个应用Part1-请求与响应
- 三步学会用spring开发OSGI——(第二步:工程篇)
- Golang语言 控制结构
- Python标准库笔记(1) — string模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 迈出加入 Apache IoTDB 社区的第一步!(订阅邮件、调试代码)
- kali下一些代理工具的简单描述
- 树莓派基础实验26:旋转编码器实验
- java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)
- JAVA创建对象有哪几种方式
- Apache IoTDB 系列教程-7:时序数据文件格式 TsFile
- XSS原理及代码分析
- 树莓派基础实验27:温湿度传感器DHT11 实验
- org.apache.jasper.JasperException: Unable to compile class for JSP
- 树莓派基础实验28:红外避障传感器实验
- Java Filter过滤器(拦截路径的配置+拦截方式的配置+生命周期+多个过滤器的先后执行顺序)
- Java Redis系列1 关系型数据库与非关系型数据库的优缺点及概念
- 树莓派基础实验29:I2C LCD1602实验
- Java Redis系列2 (redis的安装与使用+redis持久化的实现))
- Apache IoTDB 系列教程-1:数据模型