用python爬整本小说写入txt文件
没太完善,但是可以爬下整本小说。日后会写入数据库,注释不要太在意,都是调试的。入库估计这周之后,这次爬的是笔趣阁的第1150本书,大家只要可以改get_txt()里数字就行,查到自己要看哪本书一改就可以了!
# coding:utf-8
import requests
import threading
from bs4 import BeautifulSoup
import MySQLdb
import re
import os
import time
import sys
import mysql # 由于爬取的数据太多,我们要把他存入MySQL数据库中,这个库用于连接数据库
import mysql.connector
import logging # con = mysql.connector.connect(
# user="root",
# password='123456',
# host='localhost',
# port='3306',
# database='test11'
# )
# insertSql = "INSERT INTO spider('id','title','txt_section','section_name','section_name') VALUES (%s,%s,%s,%s,%s)"
# cursor = con.cursor()
req_header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cookie': '__cfduid=d577ccecf4016421b5e2375c5b446d74c1499765327; UM_distinctid=15d30fac6beb80-0bdcc291c89c17-9383666-13c680-15d30fac6bfa28; CNZZDATA1261736110=1277741675-1499763139-null%7C1499763139; tanwanhf_9821=1; Hm_lvt_5ee23c2731c7127c7ad800272fdd85ba=1499612614,1499672399,1499761334,1499765328; Hm_lpvt_5ee23c2731c7127c7ad800272fdd85ba=1499765328; tanwanpf_9817=1; bdshare_firstime=1499765328088',
'Host': 'www.qu.la',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://www.qu.la/book/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'
} req_url_base = 'http://www.qu.la/book/' # 小说主地址 # 小说下载函数
# txt_id:小说编号
# txt字典项介绍
# id:小说编号
# title:小说题目
# first_page:第一章页面
# txt_section:章节地址
# section_name:章节名称
# section_text:章节正文
# section_ct:章节页数
def get_txt(txt_id):
txt = {}
txt['title'] = ''
txt['id'] = str(txt_id)
try:
# print("请输入需要下载的小说编号:")
# txt['id']=input()
req_url = req_url_base + txt['id'] + '/' # 根据小说编号获取小说URL
print("小说编号:" + txt['id'])
res = requests.get(req_url, params=req_header) # 获取小说目录界面
soups = BeautifulSoup(res.text, "html.parser") # soup转化
# 获取小说题目
txt['title'] = soups.select('#wrapper .box_con #maininfo #info h1')[0].text
txt['author'] = soups.select('#wrapper .box_con #maininfo #info p')
# 获取小说最近更新时间
txt['update'] = txt['author'][2].text
# 获取最近更新章节名称
txt['lately'] = txt['author'][3].text
# 获取小说作者
txt['author'] = txt['author'][0].text
# 获取小说简介
txt['intro'] = soups.select('#wrapper .box_con #maininfo #intro')[0].text.strip()
print("编号:" + '{0:0>8} '.format(txt['id']) + "小说名:《" + txt['title'] + "》 开始下载。")
print("正在寻找第一章页面。。。")
# 获取小说所有章节信息
first_page = soups.select('#wrapper .box_con #list dl dd a')
# 获取小说总章页面数
section_ct = len(first_page)
# 获取小说第一章页面地址
first_page = first_page[0]['href'].split('/')[3]
print("小说章节页数:" + str(section_ct))
print("第一章地址寻找成功:" + first_page)
# 设置现在下载小说章节页面
txt_section = first_page
# 打开小说文件写入小说相关信息
fo = open('{0:0>8}-{1}.txt.download'.format(txt['id'], txt['title']), "ab+")
fo.write((txt['title'] + "\r\n").encode('UTF-8'))
fo.write((txt['author'] + "\r\n").encode('UTF-8'))
fo.write((txt['update'] + "\r\n").encode('UTF-8'))
fo.write((txt['lately'] + "\r\n").encode('UTF-8'))
fo.write(("*******简介*******\r\n").encode('UTF-8'))
fo.write(("\t" + txt['intro'] + "\r\n").encode('UTF-8'))
fo.write(("******************\r\n").encode('UTF-8'))
# 进入循环,写入每章内容
while (1):
try:
# 请求当前章节页面
r = requests.get(req_url + str(txt_section), params=req_header)
# soup转换
soup = BeautifulSoup(r.text, "html.parser")
# 获取章节名称
section_name = soup.select('#wrapper .content_read .box_con .bookname h1')[0]
section_text = soup.select('#wrapper .content_read .box_con #content')[0]
for ss in section_text.select("script"): # 删除无用项
ss.decompose()
# 获取章节文本
section_text = re.sub('\s+', '\r\n\t', section_text.text).strip('\r\n') #
# 获取下一章地址
txt_section = soup.select('#wrapper .content_read .box_con .bottem2 #A3')[0]['href']
# 判断是否最后一章,当为最后一章时,会跳转至目录地址,最后一章则跳出循环
if (txt_section == './'):
print("编号:" + '{0:0>8} '.format(txt['id']) + "小说名:《" + txt['title'] + "》 下载完成")
break
# 以二进制写入章节题目
fo.write(('\r' + section_name.text + '\r\n').encode('UTF-8'))
# 以二进制写入章节内容
fo.write((section_text).encode('UTF-8'))
print(txt['title'] + ' 章节:' + section_name.text + ' 已下载')
# print(section_text.text.encode('UTF-8'))
except:
print("编号:" + '{0:0>8} '.format(txt['id']) + "小说名:《" + txt['title'] + "》 章节下载失败,正在重新下载。")
fo.close()
os.rename('{0:0>8}-{1}.txt.download'.format(txt['id'], txt['title']),
'{0:0>8}-{1}.txt'.format(txt['id'], txt['title']))
# try:
#
# # cursor.execute("INSERT INTO wangzhi VALUES urlVal")
# cursor.execute(insertSql%(id,title,txt_section,section_name,section_name))
#
# con.commit() # except Exception as err:
#
# print(err)
# # con.rollback()
#
# con.close()
# cursor.close() except: # 出现错误会将错误信息写入dowload.log文件,同时答应出来
fo_err = open('dowload.log', "ab+")
try:
fo_err.write(('[' + time.strftime('%Y-%m-%d %X', time.localtime()) + "]:编号:" + '{0:0>8} '.format(
txt['id']) + "小说名:《" + txt['title'] + "》 下载失败。\r\n").encode('UTF-8'))
print('[' + time.strftime('%Y-%m-%d %X', time.localtime()) + "]:编号:" + '{0:0>8} '.format(
txt['id']) + "小说名:《" + txt['title'] + "》 下载失败。")
os.rename('{0:0>8}'.format(txt['id']) + '-' + txt['title'] + '.txt.download',
'{0:0>8}'.format(txt['id']) + '-' + txt['title'] + '.txt.error')
except:
fo_err.write(('[' + time.strftime('%Y-%m-%d %X', time.localtime()) + "]:编号:" + '{0:0>8} '.format(
txt['id']) + "下载失败。\r\n").encode('UTF-8'))
print('[' + time.strftime('%Y-%m-%d %X', time.localtime()) + "]:编号:" + '{0:0>8} '.format(
txt['id']) + "下载失败。")
finally: # 关闭文件
fo_err.close() # 此处为需要下载小说的编号,编号获取方法在上文中已经讲过。
get_txt(1150)
用python爬整本小说写入txt文件的更多相关文章
- Java读取CSV数据并写入txt文件
读取CSV数据并写入txt文件 package com.vfsd; import java.io.BufferedWriter; import java.io.File; import java.io ...
- JAVA读取TXT文件、新建TXT文件、写入TXT文件
1.创建TXT文件 按照正常的逻辑写就好 先定义一个文件给定一个路径——>判断这个路径上这个文件存不存在——>若不存在则建立,try/catch根据程序提示自动生成就好 2.读取TXT文件 ...
- 浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
以下是对php中fwrite写入txt文件的时候用 \r\n不能换行的问题进行了介绍,需要的朋友可以过来参考下今天遇到了一个问题就是用fwrite写入txt文件的时候用 rn不能换行试了很久都没找到办 ...
- Java读取txt文件和写入txt文件
package com.nickwong.code; import java.io.*; /** * Created by Nickwong on 31/07/2018. * 根据1-8楼的建议,优化 ...
- java追加写入txt文件
整理了下网上的资料,数据追加写入txt文件有三种方式,见下面代码: 方法一: public void method1() { FileWriter fw = null; try { //如果文件存在, ...
- Asp.net读取和写入txt文件方法(实例)!
Asp.NET读取和写入txt文件方法(实例)! [程序第一行的引入命名空间文件 - 参考] System; using System.Collections; using System.Config ...
- 生成大量插入语句,并将语句写入txt文件中
import java.io.*; /** * Created by czz on 2019/9/23. */ public class TTest { /** * 生成大量插入语句,并将语句写入tx ...
- Java——读取和写入txt文件
package com.java.test.a; import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...
- python 爬取网络小说 清洗 并下载至txt文件
什么是爬虫 网络爬虫,也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. 网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引.网络爬虫可以 ...
随机推荐
- js实现关键词高亮显示 正则匹配
html 和ajax 部分就不写了,只需将需要匹配的文字传进去就可以了 比如匹配后台传回的字符串data.content中的关键词:直接调用: data.content = highLightKeyw ...
- chromium源码阅读--HTTP Cache
最近积累了一些关于HTTP缓存的知识,因此结合Chromium的实现总结一下,主要从如下2个分面: 1.HTTP缓存的基础知识 2.Chromium关于HTTP缓存的实现分析 一.HTTP缓存的基础知 ...
- P1092 虫食算
题目传送:https://www.luogu.org/problem/show?pid=1092 #include <iostream> #include <cstring> ...
- spring boot + mybatis + hikaricp + swagger2 + jasypt
好久没写博客了记录下写过的东西,别到时候又忘了 文章前提:前面开发项目的时候数据池一直用的阿里的druid,这个数据池吧也不能说它不好,为什么现在想改成hikaricp数据池呢,完全是实用项目需要.d ...
- flask_login 整合 pyjwt + json 简易flask框架
现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...
- vmware 上ubuntu server连接外网
最近在自己的电脑上搞了个ubuntu server,自己做点小demo,当需要连接网络时问题来了,没法连接网络,网上有一些资料都是一笔带过,并不符合自己的情况,现在将我解决的过程记录下: 首先,在自己 ...
- TP3.2 图片上传及缩略图
基于TP自带的上传文件的类, Think/Upload.class.php 设置表单的enctype属性 下面是上传的具体方法 /** * 图片上传处理 * @param [String] $path ...
- Android 从零搭建简单MVP Demo
首先简单介绍一下MVP的构成及优缺点: MVP的全称为Model-View-Presenter, Model提供数据(网络请求.数据存储等): View负责页面显示: Presenter负责逻辑的处理 ...
- java的热部署和热加载
ps:热部署和热加载其实是两个类似但不同的概念,之前理解不深,so,这篇文章重构了下. 一.热部署与热加载 在应用运行的时升级软件,无需重新启动的方式有两种,热部署和热加载. 对于Java应用程序来说 ...
- Libcurl的编译_HTTP/HTTPSclient源代码演示样例
HTTP/HTTPSclient源代码演示样例 环境: zlib-1.2.8 openssl-1.0.1g curl-7.36 Author: Kagula LastUpdateDate: 2 ...