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的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
python批量替换多文件字符串问题详解
Apr 22 Python
python计算两个数的百分比方法
Jun 29 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
python列表使用实现名字管理系统
Jan 30 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
Jun 13 Python
解决Python中回文数和质数的问题
Nov 24 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
python如何实现DES加密
Sep 21 Python
10个示例带你掌握python中的元组
Nov 23 Python
python模拟点击在ios中实现的实例讲解
Nov 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
PHP编码规范-php coding standard
2007/03/16 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
详解js闭包
2014/09/02 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
理解javascript异步编程
2016/01/27 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
Python os模块常用方法和属性总结
2020/02/20 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
优秀的茶餐厅创业计划书
2014/01/03 职场文书
家长建议怎么写
2014/05/15 职场文书
减负增效提质方案
2014/05/23 职场文书
图书馆标语
2014/06/19 职场文书
单位工作证明格式模板
2014/10/04 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书