没太完善,但是可以爬下整本小说。日后会写入数据库,注释不要太在意,都是调试的。入库估计这周之后,这次爬的是笔趣阁的第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文件的更多相关文章

  1. Java读取CSV数据并写入txt文件

    读取CSV数据并写入txt文件 package com.vfsd; import java.io.BufferedWriter; import java.io.File; import java.io ...

  2. JAVA读取TXT文件、新建TXT文件、写入TXT文件

    1.创建TXT文件 按照正常的逻辑写就好 先定义一个文件给定一个路径——>判断这个路径上这个文件存不存在——>若不存在则建立,try/catch根据程序提示自动生成就好 2.读取TXT文件 ...

  3. 浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题

    以下是对php中fwrite写入txt文件的时候用 \r\n不能换行的问题进行了介绍,需要的朋友可以过来参考下今天遇到了一个问题就是用fwrite写入txt文件的时候用 rn不能换行试了很久都没找到办 ...

  4. Java读取txt文件和写入txt文件

    package com.nickwong.code; import java.io.*; /** * Created by Nickwong on 31/07/2018. * 根据1-8楼的建议,优化 ...

  5. java追加写入txt文件

    整理了下网上的资料,数据追加写入txt文件有三种方式,见下面代码: 方法一: public void method1() { FileWriter fw = null; try { //如果文件存在, ...

  6. Asp.net读取和写入txt文件方法(实例)!

    Asp.NET读取和写入txt文件方法(实例)! [程序第一行的引入命名空间文件 - 参考] System; using System.Collections; using System.Config ...

  7. 生成大量插入语句,并将语句写入txt文件中

    import java.io.*; /** * Created by czz on 2019/9/23. */ public class TTest { /** * 生成大量插入语句,并将语句写入tx ...

  8. Java——读取和写入txt文件

    package com.java.test.a; import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...

  9. python 爬取网络小说 清洗 并下载至txt文件

    什么是爬虫 网络爬虫,也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. 网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引.网络爬虫可以 ...

随机推荐

  1. canvas入门之时钟的实现

    canvas 入门之作: 三步实现一个时钟: 直接上效果:   step 1  : 背景制作首先制作从1-12的数字: var canvas = document.getElementById('ca ...

  2. sublime text 3.0新版本注册码

    -– BEGIN LICENSE -– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...

  3. CountDownLatch的实现原理

    CountDownLatch是java并发包中辅助并发的工具类,目的是让并发运行的代码在某一个执行点阻塞,直到所有条件都满足,这里的条件就是调用countDown()方法,有点类似计数器的功能. 用法 ...

  4. 原生Js实现拖拽(适用于pc和移动端)

    效果: HTML和CSS部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  5. 一个在 .NET 一线战斗了十年的 C# 程序员的内心独白

    这是我的一个内心独白,内容有点长,希望你能耐心地看完. 估计看到标题,大部分人都会说:哇!大牛!膜拜--之类的.至于是不是大牛,那我不知道,毕竟我依然有很多地方不懂,特别是现在已经流行的 Redis ...

  6. WPF水珠效果按钮组

    效果图 相关知识 这部分基本就是废话,网上都能找到,我只不过是整理了以下.建议先不看,用到的时候可以回来看看 贝塞尔曲线 先来看两组图,有助于理解什么是贝塞尔曲线(图片取自维基百科,参考链接1) 二次 ...

  7. 关于hash和ico的一些关联

    最近測试提出一个bug.说某几个页面中的ico不显示,于是针对此问题排查原因. 首先,确保页面中的link已引入favicon.ico. 经查看,发现是js中的location.hash导致了ico不 ...

  8. LeetCode90:Subsets II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...

  9. Django的url使用方法

    利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 from django.con ...

  10. RecyclerView.Adapter优化了吗?

    昨天写了一篇「还在用ListView?」讲的内容是RecyclerView的使用技巧以及一些经常使用的开源库.有朋友反馈"我已经在用recyclerview了",那么怎样让它更好用 ...