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模块找不到的解决方法
Aug 22 Python
Python中的赋值、浅拷贝、深拷贝介绍
Mar 09 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
python 筛选数据集中列中value长度大于20的数据集方法
Jun 14 Python
Python unittest单元测试框架总结
Sep 08 Python
基于Python打造账号共享浏览器功能
May 30 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
wxPython多个窗口的基本结构
Nov 19 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python3实现飞机大战
Nov 29 Python
python自动化之如何利用allure生成测试报告
May 02 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 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_xmlhttp 乱码问题解决方法
2009/08/07 PHP
php连接数据库代码应用分析
2011/05/29 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
jquery实现从数组移除指定的值
2015/06/24 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
python事件驱动event实现详解
2018/11/21 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
项目开发计划书
2014/01/09 职场文书
亲子活动总结
2014/04/26 职场文书
六一儿童节标语
2014/10/08 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
财务统计员岗位职责
2015/04/14 职场文书
居住证明范文
2015/06/17 职场文书
教师见习总结范文
2015/06/23 职场文书
导游词之清晏园
2019/11/22 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电