Python实现的爬取小说爬虫功能示例


Posted in Python onMarch 30, 2019

本文实例讲述了Python实现的爬取小说爬虫功能。分享给大家供大家参考,具体如下:

想把顶点小说网上的一篇持续更新的小说下下来,就写了一个简单的爬虫,可以爬取爬取各个章节的内容,保存到txt文档中,支持持续更新保存。需要配置一些信息,设置文档保存路径,书名等。写着玩,可能不大规范。

# coding=utf-8
import requests
from lxml import etree
from urllib.parse import urljoin
import re
import os
# 获取页面,并返回解析整理好的文本
def get_page(url):
  response = requests.get(url, headers=header)
  set_encoding(response)
  text = parse_page(response.text)
  return text
# 解析页面,将当前页面中的文字筛选出来
def parse_page(html):
  title = re.findall('<div class="bookname">\s+<h1>(.+?)</h1>', html)[0]
  content = re.findall('div id="content">(.*?)</div>', html, re.S)[0]
  content = content.replace('<br />', '').replace(' ', ' ').replace('\r\n\r\n', '\r\n')
  content = title + '\r\n' + content + '\r\n\r\n'
  return content
# 将文本追加到file_path对应的txt中
def save_page(path, text):
  with open(path, 'a', encoding='utf-8') as f:
    f.write(text)
# 设置对response得到文本的解析编码为'gbk'
def set_encoding(response):
  response.encoding = 'gbk'
# 从配置文件中获取当前保存的链接总数
def get_current_chapters_count(path):
  # (1)第一次读配置文件可能没有创建,所以要支持没有文件创建文件的功能(2)如果文件存在,则不能清空,参考https://3water.com/article/158740.htm
  with open(path, 'a+') as f:
    f.seek(0)
    res = f.read()
    if res == '':
      return 0
    else:
      return int(res)
# 将保存的链接总数保存到配置文件中
def set_current_chapters_count(path, count):
  with open(path, 'w') as f:
    f.write(str(count))
# 需要配置的字典
config_dic = dict(start_url='http://www.booktxt.net/2_2220/', # 待下载小说的章节首页 
         latest_item=9, # 列出的所有章节链接中,前面几个链接为最新章节,一般为9个,爬取时避免与最后部分重复,所以前面9个链接不爬取
         bookname='赘婿', # 待下载的小说名 
         folder_path='D:\\') #保存位置
domain = 'http://www.booktxt.net' # 顶点网域名
if __name__ == '__main__':
  chapter_url_list = []
  response = requests.get(config_dic['start_url'], headers=header)
  set_encoding(response)
  html = etree.HTML(response.text)
  chapters = html.xpath('//dd')
  print('所有链接' + str(len(chapters)))
  chapters = chapters[config_dic['latest_item']:] # 前9章为最新章节,后面还会重复,这里去掉
  print('不重复有效章节链接' + str(len(chapters)))
  folder_path = config_dic['folder_path'] + config_dic['bookname']
  if not os.path.exists(folder_path):
    os.mkdir(folder_path)
  file_path = folder_path + '\\' + config_dic['bookname'] + '.txt'
  config_file_path = folder_path + '\\' + 'config.txt'
  print('小说存储路径为:' + file_path)
  print('配置文件存储路径为:' + config_file_path)
  saved_count = get_current_chapters_count(config_file_path) # 获取目前保存的小说中已经包含的章节数
  print('当前' + file_path + '中已经保存的章节总数' + str(saved_count))
  if saved_count < len(chapters): # 说明有更新
    set_current_chapters_count(config_file_path, len(chapters))
    print('共更新 ' + str(len(chapters) - saved_count) + ' 章')
    for c in chapters[saved_count:]: # 从上次保存的位置开始继续保存
      url = c.xpath('a/@href')[0]
      url = urljoin(domain, url)
      txt = c.xpath('a/text()')[0]
      chapter_url_list.append(url)
      print(url)
      print(txt)
      save_page(file_path, get_page(url))
  else:
    print('小说还没有更新哦')

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之重回函数
Oct 10 Python
python使用Queue在多个子进程间交换数据的方法
Apr 18 Python
在Python中操作文件之read()方法的使用教程
May 24 Python
Python实现二维有序数组查找的方法
Apr 27 Python
Python 爬虫图片简单实现
Jun 01 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 #Python
Python函数装饰器常见使用方法实例详解
Mar 30 #Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 #Python
Python函数的参数常见分类与用法实例详解
Mar 30 #Python
Python实现定时执行任务的三种方式简单示例
Mar 30 #Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 #Python
详解python读取和输出到txt
Mar 29 #Python
You might like
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
vue实现选中效果
2020/10/07 Javascript
Python中zip()函数用法实例教程
2014/07/31 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
数组越界问题
2015/10/21 面试题
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
营销团队口号
2014/06/06 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
关于学习的决心书
2015/02/05 职场文书
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android