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中的__init__ 、__new__、__call__小结
Apr 25 Python
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
Python实现TCP通信的示例代码
Sep 09 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
numpy.array 操作使用简单总结
Nov 08 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 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
Zend Framework动作控制器用法示例
2016/12/09 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
javascript中eval函数用法分析
2015/04/25 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python WSGI的深入理解
2018/08/01 Python
python得到单词模式的示例
2018/10/15 Python
python中对_init_的理解及实例解析
2019/10/11 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
python 实现超级玛丽游戏
2020/11/25 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
行政助理求职自荐信
2013/10/26 职场文书
三下乡活动方案
2014/01/31 职场文书
环保宣传标语
2014/06/12 职场文书
男方婚礼答谢词
2015/01/20 职场文书
学生通报表扬范文
2015/05/04 职场文书
高中生物教学反思
2016/02/20 职场文书
导游词之千岛湖
2019/09/23 职场文书
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript