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. Power BI 关注博客更新

    原本当你访问你常用的数据库时候,该库的新增,修改,删除,通过PowerBI都很容易发现,但是在Web上面,通过PowerBI来发现Web修改就没那么容易了. 现在,我想通过PowerBI的报告来显示某 ...

  2. 常用的CMD & Linux命令

    [CMD命令] 1.分行输入环境变量 使用echo %PATH%输出环境变量的时候没有分行输出,看起来十分麻烦: 通过xargs命令可以实现分行输出,命令如下: echo %PATH% | xargs ...

  3. Intel的CPU漏洞:Spectre

    最近觉得越来越忙,写博客都没精力了.一定是太沉迷农药和刷即刻了…… 17年年底,18年年初,Intel被爆出了Meltdown(熔断)和Spectre(幽灵)漏洞.等Spectre攻击的POC出来以后 ...

  4. 每天一本电子书 - JavaScript for Kids: A Playful Introduction to Programming

    JavaScript for Kids: A Playful Introduction to Programming 作者: Nick Morgan  出版社: No Starch Press 副标题 ...

  5. Masonry学习札记

    Masnory学习札记 在之前的文章里有草草提到过Masonry自动布局,可这么重要第三方布局框架的怎么可以怎么随便带过呢!昨天在完成页面的时候刚好遇到了被Masorny功能惊叹的部分,所以趁热打铁写 ...

  6. Lucene分词详解

    分词和查询都是以词项为基本单位,词项是词条化的结果.在Lucene中分词主要依靠Analyzer类解析实现.Analyzer类是一个抽象类,分词的具体规则是由子类实现的,所以对于不同的语言规则,要有不 ...

  7. tensorflow模型ckpt转pb以及其遇到的问题

    使用tensorflow训练模型,ckpt作为tensorflow训练生成的模型,可以在tensorflow内部使用.但是如果想要永久保存,最好将其导出成pb的形式. tensorflow已经准备好c ...

  8. 实验六 CC2530平台上P2P通信的TinyOS编程

    实验六 CC2530平台上P2P通信的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的掌握射频通信TinyOS编程方法 学生通过本实验应理解TinyOS中 ...

  9. day11.1函数进阶 列表集合 字典中的函数变量,函数作为形参

    函数进阶 1.函数作为变量 a=123 name="gao" nums=[1,2,3] data=nums#指向同一个内存地址 #查看内存地址篇章 def func(): prin ...

  10. 约瑟夫斯问题-java版数组解法和链表解法

    10个人围成一圈,从1到10编号,从1开始数,数到3或3的倍数的位置,则该位置的人出局,求最后剩下哪一个号? 数组解法: 数组存放数组:a[10]存在1到10编号人 数组遍历到尾部又从头遍历:遍历数组 ...