from urllib.request import quote
import urllib.request
from bs4 import BeautifulSoup
import re
import multiprocessing
import os
import time
 
def start():
    for txt in range(0, 999):
        start = int(input("请输入开始章节(从1开始):"))-1
        if start < 0 or start > len(chapter_link)-1:
            print("开始章节错误,请重新输入")
        else:
            break
    return start
def end():
    for txt in range(0, 999):
        end = int(input("请输入最后章节(最大为总章节数):"))-1
        if end < 0 or end > len(chapter_link)-1:
            print("结束章节错误,请重新输入")
        else:
            break
    return end
def all():
    filter_chapter_link = r'<a href="(.+?)">.+?</a>'
    book_txt = str(soup.find_all(name="a", attrs={"href": re.compile(r"/\w+/\w+.html")}))
    chapter_link_1 = re.findall(filter_chapter_link, book_txt) # 链接
    chapter_link_2 = "http://www.x23us.us" + " http://www.x23us.us".join(chapter_link_1)
    chapter_link = chapter_link_2.split(' ')
    name=soup.h1.string
    return chapter_link,name
def chapter():
    links=[]
    i=0
    for link_chapter in range(start,end+1):
        links.append(chapter_link[start+i])
        i=i+1
    return links
def mkdir(path):
    floder=os.path.exists(path)
    if not floder:
        os.makedirs(path)
        print("创建成功")
    else:
        print("文件已存在")
def remadir():
    img_path2 = "E:/txt/" + name
    if not os.path.exists(img_path2):
        os.rename(img_path, img_path2)
        print("已全部下载完成!")
    else:
        downloadtime = time.strftime("%Y%m%d%I%M%S", time.localtime())
        os.rename(img_path, img_path2 + downloadtime)
        print("已全部下载完成!\n"+"文件名:" +name + " 已存在,重命名为:" + name+ downloadtime + "\n" + "请勿重复操作")
 
def download(url):
    req = urllib.request.Request(url) # 请求链接
    req.add_header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'} # 添加数据头
    page = urllib.request.urlopen(req).read()
    html = page.decode('gbk')
    soup = BeautifulSoup(html, "html.parser")
    book_txt = soup.find_all(name="div", attrs={"id": "content"})
    txt = soup.find_all(name="h1")
    name=re.sub(r'<h1>|</h1>|\|/|<|>|:|\?|\*|"|\|', '',str(txt[0]))
    filter_order = r'http://www.x23us.us/.+?/(.+?).html'
    order = re.findall(filter_order, url)[0]
    book = name+"\n"+(
        re.sub(r'<div id="content" name="content">|</div>|<br/>\n<br/>| |\n', '', str(book_txt[0]))).strip()+"\n\n" # 对过滤和编辑
    f = open("E:/txt/txt/" + order+".txt", "a") # a代表追加模式,不覆盖
    f.write(book.encode('gbk', 'ignore').decode('gbk'))
    f.close()
    print(name+"下载完成")
 
def change():
    txtname = os.listdir("E:/txt/"+name+"/")
    i = 0
    txts = []
    for txt in range(0, len(txtname)):
        a = "E:/txt/"+name+"/"+txtname[i]
        f1 = open(a, "r")
        lines = f1.readlines()
        o= "\n" + "".join(lines)
        txts.append(o)
        f1.close()
        os.remove(a)
        i = i + 1
    txts1 = "".join(txts)
    g = open("E:/txt/"+name+"/"+name+".txt", "a")
    g.write(txts1)
    g.close()
if __name__ == '__main__':
    for txt in range(0, 999):
        a = quote(input("请输入书名(精确):").encode('GBK')) # 接受一个值,编码为GBK,再转换为url编码 (顶点的编码为GBK,UTF-8和GBK的url编码不一样)
        if len(a) > 1:
            url = "http://www.x23us.us/modules/article/search.php?searchkey=" + a # 搜索的链接
            req = urllib.request.Request(url) # 请求链接
            req.add_header = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'} # 添加数据头
            page = urllib.request.urlopen(req).read() # 打开链接,并读取
            html = page.decode('gbk') # 顶点编码为gbk,把显示的内容转换为gbk编码
            soup = BeautifulSoup(html, "html.parser")
            b = len(soup.find_all(name="div", attrs={"class": "layout"}))
            if b == 0:
                print("搜索成功")
                break
            else:
                print("无结果,请重新输入!")
        else:
            print("请输入至少2个字符长度!")
    chapter_link=all()[0]
    name=all()[1]
    print("一共有" + str(len(chapter_link)) + "章")
    start=start()
    end=end()
    img_path = "E:/txt/txt/"
    mkdir(img_path)
    links = chapter()
    pool = multiprocessing.Pool(processes=10)
    pool.map(download, links)
    pool.close()
    pool.join()
    remadir()
    change()
    time.sleep(5)

python网页爬虫开发之七-多线程爬虫示例01的更多相关文章

  1. python 全栈开发,Day137(爬虫系列之第4章-scrapy框架)

    一.scrapy框架简介 1. 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前S ...

  2. 【Python爬虫实战】多线程爬虫---糗事百科段子爬取

    多线程爬虫:即程序中的某些程序段并行执行,合理地设置多线程,可以让爬虫效率更高糗事百科段子普通爬虫和多线程爬虫分析该网址链接得出:https://www.qiushibaike.com/8hr/pag ...

  3. python 全栈开发,Day135(爬虫系列之第2章-BS和Xpath模块)

    一.BeautifulSoup 1. 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: ''' Beautiful Soup提供一些简单 ...

  4. python 全栈开发,Day134(爬虫系列之第1章-requests模块)

    一.爬虫系列之第1章-requests模块 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的 ...

  5. python 全栈开发,Day136(爬虫系列之第3章-Selenium模块)

    一.Selenium 简介 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全 ...

  6. Python爬虫开发:反爬虫措施以及爬虫编写注意事项

  7. Python 之糗事百科多线程爬虫案例

    import requests from lxml import etree import json import threading import queue # 采集html类 class Get ...

  8. python运维开发(十七)----jQuery续(示例)web框架django

    内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...

  9. Java 多线程爬虫及分布式爬虫架构探索

    这是 Java 爬虫系列博文的第五篇,在上一篇 Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器 中,我们简单的聊反爬虫策略和反反爬虫方法,主要针对的是 IP 被封及其对应办法.前面几篇文章我们把 ...

随机推荐

  1. 2018上C语言程序设计(高级)作业- 第3次作业成绩

    作业地址 https://edu.cnblogs.com/campus/hljkj/CS2017-01/homework/1779 评分准则 第一次作业各项成绩包括三项: 完成PTA所有题目:13分 ...

  2. React生命周期简单详细理解

    前言 学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助. Ract生命周期 React 生命周期分为三种状态 1. 初始化 2.更新 3.销毁 初始化 1.g ...

  3. vue 项目搭建步骤

    环境搭建步骤: 打开git ,运行 npm install --global vue-cli 这是安装vue的命令行 vue init webpack vue-demo 这是vue基于webpack的 ...

  4. adb+monkey压力测试入门

    一.ADB安装步骤及ADB环境配置 1.ADB安装步骤 1)adb工具安装地址:http://www.wmzhe.com/soft-39913.html 2)下载安装包后,解压,将adb安装在根目录下 ...

  5. css animate

    AniX https://a-jie.github.io/AniX/

  6. anaconda 的安装

    进官网下载anaconda, 根据需要下载对应python版本Anaconda软件. https://www.anaconda.com/download/#windows 下载完双击 Anaconda ...

  7. Python学习笔记,day5

    Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...

  8. 利用Python中的for循环和while循环,打印各种方向的九九乘法表。

    哈喽大家好,今天,可乐来给大家分享一下Python中用for循环和while循环打印九九乘法表的操作.由于本人也是刚刚接触Python不长时间,代码也是自己编写的,所以有什么不足之处还请大家多多指教. ...

  9. C++ 实验3 类和对象

    Part 2 #ifndef GRAPH_H #define GRAPH_H class Graph { public: Graph(char ch, int n); void draw(); pri ...

  10. git 安装部署教程

    转转改改修修,能用:   查看用户名和邮箱 $ git config user.name $ git config user.email   修改用户名和邮箱 $ git config user.na ...