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数据结构之图的应用示例
May 11 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python 切换root 执行命令的方法
Jan 19 Python
Python requests模块实例用法
Feb 11 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
python实现超市商品销售管理系统
Oct 25 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
在主流系统之上安装Pygame的方法
May 20 Python
python如何变换环境
Jul 21 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
call在Python中改进数列的实例讲解
Dec 09 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实现的折半查询算法示例
2017/10/09 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Django实现登录随机验证码的示例代码
2018/06/20 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
Python hashlib模块实例使用详解
2019/12/24 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Python中常见的数制转换有哪些
2020/05/27 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
大学生毕业自荐信
2013/10/10 职场文书
高中数学教学反思
2014/01/30 职场文书
《老王》教学反思
2014/02/23 职场文书
旅游安全协议书
2014/04/21 职场文书
庆六一活动总结
2014/08/29 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
花田少年史观后感
2015/06/16 职场文书
python爬虫--selenium模块
2021/03/31 Python
详解Laravel框架的依赖注入功能
2021/05/27 PHP