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将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
python中正则表达式 re.findall 用法
Oct 23 Python
python3爬虫怎样构建请求header
Dec 23 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
python实例化对象的具体方法
Jun 17 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
Python中常见的反爬机制及其破解方法总结
Jun 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
如何将数据从文本导入到mysql
2006/10/09 PHP
自动分页的不完整解决方案
2007/01/12 PHP
用PHP实现的随机广告显示代码
2007/06/14 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
Python生成器generator用法示例
2018/08/10 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
如何通过python计算圆周率PI
2020/11/11 Python
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
总经理任命书范本
2014/06/05 职场文书
2014年组织部工作总结
2014/11/14 职场文书
2014年路政工作总结
2014/12/10 职场文书
大学生实习推荐信
2015/03/27 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
浅析NIO系列之TCP
2021/06/15 Java/Android