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使用Flask框架获取用户IP地址的方法
Mar 21 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
python 2.7.14安装图文教程
Apr 08 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
Pandas的数据过滤实现
Jan 15 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 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
快速配置PHPMyAdmin方法
2008/06/05 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
详解使用python crontab设置linux定时任务
2016/12/08 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Python使用xpath实现图片爬取
2020/09/16 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
python os.rename实例用法详解
2020/12/06 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
数控专业个人求职信范例
2013/11/29 职场文书
高一学生期末评语
2014/04/25 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
旅游安全责任协议书
2016/03/22 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫