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中的with...as用法介绍
May 28 Python
Python入门教程之运算符与控制流
Aug 17 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
Python3使用SMTP发送带附件邮件
Jun 16 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
Python 使用list和tuple+条件判断详解
Jul 30 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
Python使用进程Process模块管理资源
Mar 05 Python
Python sorted排序方法如何实现
Mar 31 Python
用python对excel进行操作(读,写,修改)
Dec 25 Python
pytorch 中forward 的用法与解释说明
Feb 26 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操作xml入门之xml标签的属性分析
2015/01/23 PHP
php微信开发接入
2016/08/27 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
Django  ORM 练习题及答案
2019/07/19 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
用python制作个音乐下载器
2021/01/30 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
关于安全演讲稿
2014/05/09 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
五四演讲稿范文
2014/09/03 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android