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 相关文章推荐
Windows 64位下python3安装nltk模块
Sep 19 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
python超时重新请求解决方案
Oct 21 Python
Django REST framework 单元测试实例解析
Nov 07 Python
Django项目uwsgi+Nginx保姆级部署教程实现
Apr 19 Python
Python绘制动态水球图过程详解
Jun 03 Python
浅谈Django前端后端值传递问题
Jul 15 Python
浅析python中的del用法
Sep 02 Python
Python实现简单的猜单词
Jun 15 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
python脚本框架webpy模板赋值实现
Nov 20 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
Python3实现生成随机密码的方法
2014/08/23 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
pandas.cut具体使用总结
2019/06/24 Python
用python做游戏的细节详解
2019/06/25 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
python获取整个网页源码的方法
2020/08/03 Python
详解python with 上下文管理器
2020/09/02 Python
Django自带的用户验证系统实现
2020/12/18 Python
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
肯尼迪就职演说稿
2013/12/31 职场文书
优秀教师主要事迹
2014/02/01 职场文书
2014年清明节寄语
2014/04/03 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript