python获取带有返回值的多线程


Posted in Python onMay 02, 2022

一、带有返回值的多线程

1.1 实现代码

# -*- coding:utf-8 -*-
"""
作者:wyt
日期:2022年04月21日
"""
import threading
import requests
import time
urls = [
    f'https://www.cnblogs.com/#p{page}' # 待爬地址
    for page in range(1, 10)  # 爬取1-10页
]
def craw(url):
    r = requests.get(url)
    num = len(r.text)  # 爬取博客园当页的文字数
    return num  # 返回当页文字数
 
def sigle():  # 单线程
    res = []
    for i in urls:
        res.append(craw(i))
    return res
class MyThread(threading.Thread):  # 重写threading.Thread类,加入获取返回值的函数
    def __init__(self, url):
        threading.Thread.__init__(self)
        self.url = url                # 初始化传入的url
    def run(self):                    # 新加入的函数,该函数目的:
        self.result = craw(self.url)  # ①。调craw(arg)函数,并将初试化的url以参数传递——实现爬虫功能
                                      # ②。并获取craw(arg)函数的返回值存入本类的定义的值result中
    def get_result(self):  #新加入函数,该函数目的:返回run()函数得到的result
        return self.result
def multi_thread():
    print("start")
    threads = []           # 定义一个线程组
    for url in urls:
        threads.append(    # 线程组中加入赋值后的MyThread类
            MyThread(url)  # 将每一个url传到重写的MyThread类中
        )
    for thread in threads: # 每个线程组start
        thread.start()
    for thread in threads: # 每个线程组join
        thread.join()
    list = []
    for thread in threads:
        list.append(thread.get_result())  # 每个线程返回结果(result)加入列表中
    print("end")
    return list  # 返回多线程返回的结果组成的列表
if __name__ == '__main__':
    start_time = time.time()
    result_multi = multi_thread()
    print(result_multi)  # 输出返回值-列表
    # result_sig = sigle()
    # print(result_sig)
    end_time = time.time()
    print('用时:', end_time - start_time)

1.2 结果

单线程:

python获取带有返回值的多线程

多线程:

python获取带有返回值的多线程

加速效果明显。

二、实现过程

2.1 一个普通的爬虫函数

import threading
import requests
import time
urls = [
    f'https://www.cnblogs.com/#p{page}' # 待爬地址
    for page in range(1, 10)  # 爬取1-10页
]
def craw(url):
    r = requests.get(url)
    num = len(r.text)  # 爬取博客园当页的文字数
    print(num)
def sigle():  # 单线程
    res = []
    for i in urls:
        res.append(craw(i))
    return res
def multi_thread():
    print("start")
    threads = []           # 定义一个线程组
    for url in urls:
        threads.append(
            threading.Thread(target=craw,args=(url,))  # 注意args=(url,),元组
        )
    for thread in threads: # 每个线程组start
        thread.start()
    for thread in threads: # 每个线程组join
        thread.join()
    print("end")
if __name__ == '__main__':
    start_time = time.time()
    result_multi = multi_thread()
    # result_sig = sigle()
    # print(result_sig)
    end_time = time.time()
    print('用时:', end_time - start_time)

返回:

start
69915
69915
69915
69915
69915
69915
69915
69915
69915
end
用时: 0.316709041595459

2.2 一个简单的多线程传值实例

import time
from threading import Thread
def foo(number):
    time.sleep(1)
    return number
class MyThread(Thread):
    def __init__(self, number):
        Thread.__init__(self)
        self.number = number
    def run(self):
        self.result = foo(self.number)
    def get_result(self):
        return self.result
if __name__ == '__main__':
    thd1 = MyThread(3)
    thd2 = MyThread(5)
    thd1.start()
    thd2.start()
    thd1.join()
    thd2.join()
    print(thd1.get_result())
    print(thd2.get_result())

返回:

3
5

2.3 实现重点

多线程入口

threading.Thread(target=craw,args=(url,))  # 注意args=(url,),元组

多线程传参

需要重写一下threading.Thread类,加一个接收返回值的函数。 三、代码实战

使用这种带返回值的多线程技术重写了一下之前发布过的一个爬取子域名的代码,原始代码在这里:https://blog.csdn.net/qq_45859826/article/details/124030119

import threading
import requests
from bs4 import BeautifulSoup
from static.plugs.headers import get_ua
#https://cn.bing.com/search?q=site%3Abaidu.com&go=Search&qs=ds&first=20&FORM=PERE
def search_1(url):
    Subdomain = []
    html = requests.get(url, stream=True, headers=get_ua())
    soup = BeautifulSoup(html.content, 'html.parser')
    job_bt = soup.findAll('h2')
    for i in job_bt:
        link = i.a.get('href')
        # print(link)
        if link not in Subdomain:
            Subdomain.append(link)
    return Subdomain
class MyThread(threading.Thread):
    def __init__(self, url):
        threading.Thread.__init__(self)
        self.url = url
    def run(self):
        self.result = search_1(self.url)
    def get_result(self):
        return self.result
def Bing_multi_thread(site):
    print("start")
    threads = []
    for i in range(1, 30):
        url = "https://cn.bing.com/search?q=site%3A" + site + "&go=Search&qs=ds&first=" + str(
            (int(i) - 1) * 10) + "&FORM=PERE"
        threads.append(
            MyThread(url)
        )
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()
    res_list = []
    for thread in threads:
        res_list.extend(thread.get_result())
    res_list = list(set(res_list)) #列表去重
    number = 1
    for i in res_list:
        number += 1
    number_list = list(range(1, number + 1))
    dict_res = dict(zip(number_list, res_list))
    print("end")
    return dict_res
if __name__ == '__main__':
    print(Bing_multi_thread("qq.com"))

返回:

{
1:'https://transmart.qq.com/index',
2:'https://wpa.qq.com/msgrd?v=3&uin=448388692&site=qq&menu=yes',
3:'https://en.exmail.qq.com/',
4:'https://jiazhang.qq.com/wap/com/v1/dist/unbind_login_qq.shtml?source=h5_wx',
5:'http://imgcache.qq.com/',
6:'https://new.qq.com/rain/a/20220109A040B600',
7:'http://cp.music.qq.com/index.html',
8:'http://s.syzs.qq.com/',
9:'https://new.qq.com/rain/a/20220321A0CF1X00',
10:'https://join.qq.com/about.html',
11:'https://live.qq.com/10016675',
12:'http://uni.mp.qq.com/',
13:'https://new.qq.com/omn/TWF20220/TWF2022042400147500.html',
14:'https://wj.qq.com/?from=exur#!',
15:'https://wj.qq.com/answer_group.html',
16:'https://view.inews.qq.com/a/20220330A00HTS00',
17:'https://browser.qq.com/mac/en/index.html',
18:'https://windows.weixin.qq.com/?lang=en_US',
19:'https://cc.v.qq.com/upload',
20:'https://xiaowei.weixin.qq.com/skill',
21:'http://wpa.qq.com/msgrd?v=3&uin=286771835&site=qq&menu=yes',
22:'http://huifu.qq.com/',
23:'https://uni.weixiao.qq.com/',
24:'http://join.qq.com/',
25:'https://cqtx.qq.com/',
26:'http://id.qq.com/',
27:'http://m.qq.com/',
28:'https://jq.qq.com/?_wv=1027&k=pevCjRtJ',
29:'https://v.qq.com/x/page/z0678c3ys6i.html',
30:'https://live.qq.com/10018921',
31:'https://m.campus.qq.com/manage/manage.html',
32:'https://101.qq.com/',
33:'https://new.qq.com/rain/a/20211012A0A3L000',
34:'https://live.qq.com/10021593',
35:'https://pc.weixin.qq.com/?t=win_weixin&lang=en',
36:'https://sports.qq.com/lottery/09fucai/cqssc.htm'
}

非常非常非常能感受到速度快了超级多,用这种方式爆破子域名也比较爽。没有多线程,我的项目里可能缺少了好几个功能:因为之前写过的一些程序都因执行时间过长被我砍掉。这个功能还是很实用的。

四、学习

B站python-多线程教程:https://www.bilibili.com/video/BV1bK411A7tV

到此这篇关于python获取带有返回值的多线程的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python实现获取域名所用服务器的真实IP
Oct 25 Python
django定期执行任务(实例讲解)
Nov 03 Python
python3 property装饰器实现原理与用法示例
May 15 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
python实现双色球随机选号
Jan 01 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
python文件编写好后如何实践
Jul 07 Python
Python实现冒泡排序算法的完整实例
Nov 04 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Apr 21 Python
总结三种用 Python 作为小程序后端的方式
Python如何用re模块实现简易tokenizer
May 02 #Python
Python实现简单得递归下降Parser
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 #Python
使用Python开发冰球小游戏
详解Python中的for循环
Python采集壁纸并实现炫轮播
Apr 30 #Python
You might like
php实现在线通讯录功能(附源码)
2016/05/13 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
python自然语言编码转换模块codecs介绍
2015/04/08 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
python nmap实现端口扫描器教程
2020/05/28 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
中学生打架检讨书
2014/02/10 职场文书
小学生手册家长评语
2014/04/16 职场文书
触电现场处置方案
2014/05/14 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
批评与自我批评范文
2014/10/15 职场文书
会议新闻稿
2015/07/17 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android