python下载奇书网的小说

网址为,奇书网 以前下载小说是爬取所有的章节,提取文章,构成小说,那样太慢,一本小说几千章节,好久才能下载一本, 现在找到一个有TXT下载的地方,直接读写文章了.

图片.png

准备按照首页,那边的栏目,下载玄幻奇幻 武侠仙侠 女频言情 现代都市 历史军事 游戏竞技 科幻灵异 美文同人 剧本教程 名著杂志10个专题的小说 整个过程用到了不少东西

html=requests.get(url,headers=headers,verify=False).text
soup=BeautifulSoup(html,'lxml')
#按照标签查找
tag_a=soup.p
#获取属性
name = tag_p.name
title = tag_p.attrs.get('title')
title = tag_p.get('title')
title = tag_p['title']

find&&find_all查找

soup.find('a')
soup.find('a',title='hhh')
soup.find('a',id='')
soup.find('a',class_='')

去掉开头,结尾的字符,用strip()函数 分割字符串使用 split()函数,追加元素到list中使用append()函数,如果需要把另外一个list的元素一一追加到另外一个list需要使用extend函数

            html=get_html(url[i]).text
            #title=re.find(re0,html)[0]
            href=re.findall(re1,html)
            #print(href)
            infor=re.split(",",href[0])
            get_inf=[]
            #print(infor)
            for j in range(len(infor)):
                te=infor[j].strip("'").strip("'")
                get_inf.append(te)

    # 这里采用正则表达式,也可以使用 title=cont[i].get("title")
        text=re.findall(re0,str(cont[i]))
        title.extend(text)

注意,这里是坑,被坑了好一会 Python3的dictionary的keys(), values(), items()返回的都是迭代器,如果需要像Python2一样返回列表,只要传给list就行了:

   novel_path=list(novel_inf.keys())
   novel_url=list(novel_inf.values())

下载小说,准备使用map函数实现多线程,加快速度, 全局变量,在函数外,最开始地方定义,在函数中想改变其中,必须使用global,不然函数中会屏蔽其值 参考文献

相关code

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Jun 16 22:36:52 2018

@author: dflx
"""

import requests
import os
import re
from bs4 import BeautifulSoup
import time
from multiprocessing.dummy import Pool as ThreadPool


def get_html(url):
    try:
        headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.90 Safari/537.36 2345Explorer/9.3.2.17331',}
        response=requests.get(url,headers=headers,verify=False)
        print(response.status_code)
        response.raise_for_status
        response.encoding=response.apparent_encoding
        #print(response.text)
        return response
    except Exception as e:
        print("has exception:",e)


name=[]
def get_url(url):
    html=get_html(url).text
    re0=r'title="(.*?)">'
    soup=BeautifulSoup(html,"lxml")
    cont=soup.find_all('a')
    title=[]
    global name
    href=[]
    print("length=",len(cont))
    print(type(cont[0]))
    for i in range(2,12): #[2,12]
        print(cont[i])
        name.append(cont[i].string)
    # 这里采用正则表达式,也可以使用 title=cont[i].get("title")
        text=re.findall(re0,str(cont[i]))
        title.extend(text)
    # print(cont[i].get("href"))
        url="https://www.qisuu.la"+cont[i].get("href")
        href.append(url)

    print("title length=",len(title),type(title[0]),title[0])
    print("name length=",len(name),type(name[0]),name[0])
    print("href length",len(href),type(href[0]),href[0])
    return href

def mkdir(name,path):
    print(name)
    for i in name:
        file=path+i
        if not os.path.exists(file):
            os.makedirs(file)
    print("makdie successful")
    

    
def getChapterUrl(url,page):
    chapturl=[]
    href=get_url(url)
    for url in href:
        for num in range(1,page+1):
            chapt=url+"index_"+str(num)+".html"
            chapturl.append(chapt)
    print("down page length=",len(chapturl),chapturl[0])
    return chapturl
            

def getdownloadUrl(url,page):
    novel_href=[]
    chapturl=getChapterUrl(url,page)
    for ul in chapturl:
        html=get_html(ul).text
        soup=BeautifulSoup(html,"lxml")
        soup_div=soup.find_all("ul")
        tag_div=soup_div[5]
        #print(len(soup_div),type(soup_div[0]),soup_div[5])
        soup2=BeautifulSoup(str(tag_div),"lxml")
        tag_a=soup2.find_all('a')
        #print(tag_a)
        flag=1
        #print(tag_a[0])
        for i in range(len(tag_a)):
            url="https://www.qisuu.la"+tag_a[i].get("href")
            if flag%2!=0:
                novel_href.append(url)
            flag+=1
    print("the length novrl-href ",len(novel_href),novel_href[0])
    return novel_href

def downAllUrl(url,page):
    url=getdownloadUrl(url,page)
    print("----lenth=",len(url))
    print(name)
    novel_dict={}
    path="/home/dflx/下载/novel/"
    re0=r'<h1>(.*?)</h1>'
    re1=r'<script type="text/javascript">get_down_url\((.*?)\);</script>'
    for i in range(len(url)):
        try:
            html=get_html(url[i]).text
            #title=re.find(re0,html)[0]
            href=re.findall(re1,html)
            #print(href)
            infor=re.split(",",href[0])
            get_inf=[]
            #print(infor)
            for j in range(len(infor)):
                te=infor[j].strip("'").strip("'")
                get_inf.append(te)
            print(get_inf)
        
        #获取小说的名字
            soup=BeautifulSoup(html,"lxml")
            title=soup.find("h1").string
            print(title)

            index=i//(15*page)
            print(name[index])
            road=path+name[index]+"/"+get_inf[2]+".txt"
            print(type(road),road)
            print(type(get_inf[1]),get_inf[1])
            t1=time.time()
            #download(get_inf[1],pase,get_inf[2])
            novel_dict[road]=get_inf[1]
            t2=time.time()
            print("download spend "+str(t1-t2))
        except Exception as e:
            print("has excepton continue ",e)
            continue
    print(len(novel_dict))
    return novel_dict


 
novel_inf={}          
def threadDownload(url,page):
    global novel_inf
    novel_inf=downAllUrl(url,page)
    novel_path=list(novel_inf.keys())
    novel_url=list(novel_inf.values())
    pool=ThreadPool(2)
    #print(novel_path)
    print(type(novel_path))

    # thread download novel
    t1=time.time()
    result=pool.map(download,novel_path)
    t2=time.time()
    print("download spend "+str(t1-t2))
    pool.close()
    pool.join()
       


def download(ur):
    path=ur
    url=novel_inf[ur]
    html=get_html(url)
    text=html.content
    with open(path,'wb') as f:
        f.write(text)
    print("download "+ur+"success")
            
    



def main():
    url="https://dzs.qisuu.la/txt/22617.txt"
    url0="https://www.qisuu.la/"
    path="/home/dflx/下载/novel/"
    #getdownloadUrl(url0,1)
    #name=[]
    #get_url(url0)
    #mkdir(name,path)
    #downAllUrl(url0,3)
    threadDownload(url0,2)

小说专题

专题里面的小说情况

参考文献

BS4使用方法 Python-去除字符串中不想要的字符 Python 字典(Dictionary)操作详解 Python 字典(Dictionary) 一行 Python 实现并行化 -- 日常多线程操作的新思路 python中map()函数的用法讲解 Python map() 函数 Python3中如何实现dict.keys()的功能?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java 8新的时间日期库的20个使用示例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用J...

18620
来自专栏函数式编程语言及工具

Akka(2):Actor生命周期管理 - 监控和监视

  在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式。对比起我们习惯的行令式(imperative)编程模式,Actor...

39980
来自专栏醒者呆

基础大扫荡——背包,栈,队列,链表一口气全弄懂

提到数据结构,不得不说数据类型,有人将他们比作分子和原子的关系,我们都知道大自然最小的构成单位是原子,数据类型描述的是原子的内部,如质子、中子的情况,而数据结构...

440150
来自专栏华仔的技术笔记

编程规范之《招聘一个靠谱的iOS》

33570
来自专栏从流域到海域

《Java程序设计基础》 第4章手记

《Java程序设计基础》 第4章手记 本章主要内容 - 语句和复合语句 - 分支结构 - 循环结构 - 跳转语句 这四部...

21080
来自专栏腾讯Bugly的专栏

如何定位Obj-C野指针随机Crash(三):如何让Crash自报家门

本文主要介绍如何利用OC Runtime的特性,让OC野指针对象主动抛出自己的信息,秒杀某些全系统栈Crash。 ? 陈其锋,腾讯SNG即通产品部音视频技术中心...

95040
来自专栏Python学习心得

​Python爬虫--- 1.3 BS4库的解析器

原文链接https://www.fkomm.cn/article/2018/7/20/18.html

10000
来自专栏代码世界

计算机基础,Python基础--变量以及简单的循环

一、计算机基础 1.CPU   相当于人体的大脑,用于计算处理数据。 2.内存    用于存储数据,CPU从内存调用数据处理计算,运算速度很快。 PS:问:...

28870
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day14 Java对象的克隆

  今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充。   克隆...

22860
来自专栏斑斓

Scala的面向对象与函数编程

很难说FP和OO孰优孰劣,应该依场景合理选择使用。倘若从这个角度出发,Scala就体现出好处了,毕竟它同时支持了OO和FP两种设计范式。 从设计角度看,我认为O...

31950

扫码关注云+社区

领取腾讯云代金券