最新公告
  • 欢迎您光临小酒资源吧,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 【Python】1000个线程爬取盗版小说网站,并按章节顺序排列在txt文件里

    【Python】1000个线程爬取盗版小说网站,并按章节顺序排列在txt文件里 最后编辑:2020-09-01
    增值服务: 自动发货 使用说明 安装指导 环境配置二次开发BUG修复

    Python利用创建1000个线程爬取盗版小说网站,并按章节顺序排列在txt文件

    文中和源码里的具体网址我都去掉了,本贴不提供成品,仅作学习交流!!!

    前言:
    上次我写了一篇教程:32个进程爬取小说并存在不同的txt里,有的人说文章在不同txt里不方便,自己也不会合并,那好,今天我们1000个线程(注意上次是进程这次是线程,老是有人搞混)爬取某个小说,并按照章节顺序存在txt里,这个txt我们用主流阅读软件打开都是会自动显示目录的,如下图!

    Ngcre1.jpg

    上次多进程爬的那个网站已经采取了反爬措施,不行了。所以这次我又找了一个新的盗版网站,反正他是盗版网站,我们也不怕,众所周知,pyhon里如果用多线程访问同一个资源是很容易出错的,并且多线程是无序的,也就是一般来讲,我们用多线程需要用线程锁来决定谁来访问,就算用了线程锁,他的无序也决定了我们无法保证内容是按章节顺序存在txt里的,所以为了解决上面两个问题,我们引入了线程池和PriorityQueue重要性队列,按照事件的重要性来判断先后顺序,这样我们同时请求几百条信息的时候赋值给他们自己的重要性数值,就可以决定谁先写入了,下图是1000个线程爬完1400章所需时间,我们可以看到只花了10秒,这个时间是指整个程序开始,一直到文件写入完毕,是非常快的,我也试了单线程,但是单线程实在太慢了,我没耐心等下去,我算了一下,单线程爬完最少需要2分多钟,我是指最少!
    NggkpF.png
    Ng5mvT.png


    正文

    1. 我们先导入所需要的包
    import requests, re
    from lxml import etree
    from queue import PriorityQueue
    from concurrent.futures import ThreadPoolExecutor, as_completed
    from time import time

    这里的重点就是3,4两行了,第三行就是我们的重要性排序的队列,没有他我们不可能在多线程里按顺序写入一个文件内容的,当然,写文件肯定是单线程,但是网页请求是1000个线程,强调一下我是指这个网页请求得来的那1000多个回应是无序的,所以我们单线程写文件时无法按顺序写入,而用到PriorityQueue就可以了,第4行是线程池,我们不能说每一次请求都重新创建一个线程吧,创建线程也是会消耗资源的,所以我们建立一个线程池,保证只有1000个线程来处理你的函数,前一个线程结束了就等待任务到来,而不是关闭再重启,这次你可能体会不到,但是如果别人有10000章的时候,你就能体会到不用线程池时,10000个线程直接把你电脑弄蓝屏的滋味了。

    2. 定义两个类(生产者和消费者)
    class Spider():
    url = \'http://************/txt/111650/index.html\'
    headers = {
    \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36\',
    }
    def get_page_urls(self):
    rsp = requests.get(self.url, headers=self.headers)
    html = etree.HTML(rsp.content)
    titles = html.xpath(\'//dd/a/text()\')[0]
    links = html.xpath(\'//dd/a/@href\')
    links = [\'http://**********/txt/111650/\'+i for i in links]
    return links
    class PageJob():
    headers = {
    \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36\',
    }
    def __init__(self, priority, url):
    self.priority = priority
    self.url = url
    self.GetContent()
    return
    def __lt__(self, other):
    return self.priority < other.priority
    def GetContent(self):
    rsp = requests.get(self.url, headers=self.headers)
    print(rsp.status_code)
    if rsp.status_code == 503:
    print(rsp.text)
    sleep(1)
    rsp = requests.get(self.url, headers=self.headers)
    html = etree.HTML(rsp.content)
    title = html.xpath(\'//h1/text()\')[0]
    content = html.xpath(\'//div[@id=\"content\"]/text()\')[:-3]
    while \'\\r\' in content:
    content.remove(\'\\r\')
    content = [re.sub(\'\\xa0\\xa0\\xa0\\xa0\', \'\', i) for i in content]
    content = [re.sub(\'\\r\', \'\\n\', i) for i in content]
    self.title = \'\\n\\n\'+title+\'\\n\\n\'
    self.content = content
    print(title, content)

    这两个类之中Spider用来爬取每一章的链接,相当于生产者,PageJob把生产者产出的每一章链接得到后就发起网页请求把每一章小说都下载下来,相当于消费者。这里我提一下第33-37行是在去除文章中的一些无关代码和加入一些调整格式的字符,其余的都是requests的最基本请求了,我就不提了,不懂的话就看下这份requests官方文档。

    3.定义函数
    def PutPageJob(para):
    q = para[0]
    i = para[1]
    links = para[2]
    q.put(PageJob(i, links[i]))

    这个函数其实没有增加实际作用,只是为了当我们在后面把函数放进线程时,能方便的传参数而已。

    4.定义函数入点,开始执行
    if __name__ == \'__main__\':
    start_time = time()
    spider = Spider()
    links = spider.get_page_urls()
    q = PriorityQueue()
    with ThreadPoolExecutor(max_workers=1000) as t:# 创建一个最大容纳数量为1000的线程池
    obj_list = []
    links = links[12:]
    for i in range(len(links)):
    para = (q, i, links)
    p = t.submit(PutPageJob, para)
    obj_list.append(p)
    for future in as_completed(obj_list):
    data = future.result()
    print(\'*\' * 50)
    while not q.empty():
    next_job = q.get()# 可根据优先级取序列
    with open(\'死亡作业.txt\', \'a\', encoding=\'utf-8\') as f:
    f.write(next_job.title)
    f.writelines(next_job.content)
    print(\'花费时间:\', time()-start_time)

    我们可以看到第十一行代码,我们用到了我们定义的那个函数,只有这样才能把参数传进去。第5-17行就是我们的重头戏,启用1000个线程的线程池,多线程并发执行我们的爬虫,并且把数据储存在了第5行我们实例化的PriorityQueue对象中,而且按照重要性排序,这里的重要性参数是i,i越小表示越先执行,因此我们写入时才可以先写入第1章这个样子。

    总结
    好啦,今天的教程就到这里!大家如果有其它的控制顺序的方法欢迎在评论区讨论!
    源码和这次爬取的txt文件下载地址我放在附件里咯!

    附录
    上次有人说没必要爬,有现成的txt可以下载,我想说的是,只有完结了的小说才有现成的txt,这些还在连载的小说是没有txt的,很多手机上的盗版小说app你可以点击下载或缓存某个小说,但是你会发现下载的很慢,每秒才几张,因为其实这根本就不是在下载小说,而是你点击下载后,app开启了一个单线程爬取那些书源网站,所以很慢。对比而来,这也正是本次1000线程爬虫的作用了。

    1000线程爬虫源码 效果展示.txt

    猜你在找

    1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!603313839@qq.com
    2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
    3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
    4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!

    小酒资源吧 » 【Python】1000个线程爬取盗版小说网站,并按章节顺序排列在txt文件里

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    免责声明/技术服务/售后服务等
    本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!603313839@qq.com
    • 2020-09-01Hi,初次和大家见面了,请多关照!

    售后服务:

    • 售后服务范围 1、商业模板使用范围内问题免费咨询
      2、源码安装、模板安装(一般 ¥50-300)服务答疑仅限SVIP用户
      3、单价超过500元的程序/模板免费一次安装,需提你供服务器信息。
      付费增值服务 1、提供dedecms模板、WordPress主题、discuz模板优化等服务请详询在线客服
      2、承接 WordPress、DedeCMS、Discuz 等系统建站、仿站、开发、火车头规则、定制等服务
      3、服务器环境配置(一般 ¥50-300)
      4、网站中毒处理(需额外付费,500元/次/质保三个月)
      售后服务时间 周一至周日(法定节假日除外) 9:00-22:00
      免责声明 本站所提供的模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: 603313839@qq.com),我们会及时删除,给您带来的不便,我们深表歉意!

    Hi, 如果你对这款程序/模板/下载/有疑问,可以跟我联系哦!

    联系作者
    • 3204会员总数(位)
    • 4505资源总数(个)
    • 3本周发布(个)
    • 0 今日发布(个)
    • 410稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
  • 2020 XiaoJiu8.cn - & WordPress Theme. All rights reserved 黔ICP备17003460号-5

  • XML地图 | 站长导航
         
    升级SVIP尊享更多特权立即升级