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面向对象_详谈类的继承与方法的重载
Jun 07 Python
python记录程序运行时间的三种方法
Jul 14 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
django启动uwsgi报错的解决方法
Apr 08 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
linux安装python修改默认python版本方法
Mar 31 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
Python extract及contains方法代码实例
Sep 11 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
jupyter notebook指定启动目录的方法
Mar 02 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在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
js数组去重的hash方法
2016/12/22 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
Python中对列表排序实例
2015/01/04 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
业务员的岗位职责
2014/03/15 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
离职信范文
2015/06/23 职场文书
酒店厨房管理制度
2015/08/06 职场文书
小学数学新课改心得体会
2016/01/22 职场文书