python多线程下载器_用 python 实现一个多线程网页下载器

学习之

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import urllib, httplib

import thread

import time

from Queue import Queue, Empty, Full

HEADERS = {"Content-type": "application/x-www-form-urlencoded",

'Accept-Language':'zh-cn',

'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.0)',

"Accept": "text/plain"}

UNEXPECTED_ERROR = -1

POST = 'POST'

GET = 'GET'

def base_log(msg):

print msg

def base_fail_op(task, status, log):

log('fail op. task = %s, status = %d'%(str(task), status))

def get_remote_data(tasks, results, fail_op = base_fail_op, log = base_log):

while True:

task = tasks.get()

try:

tid = task['id']

hpt = task['conn_args'] # hpt <= host:port, timeout

except KeyError, e:

log(str(e))

continue

log('thread_%s doing task %d'%(thread.get_ident(), tid))

#log('hpt = ' + str(hpt))

conn = httplib.HTTPConnection(**hpt)

try:

params = task['params']

except KeyError, e:

params = {}

params = urllib.urlencode(params)

#log('params = ' + params)

try:

method = task['method']

except KeyError:

method = 'GET'

#log('method = ' + method)

try:

url = task['url']

except KeyError:

url = '/'

#log('url = ' + url)

headers = HEADERS

try:

tmp = task['headers']

except KeyError, e:

tmp = {}

headers.update(tmp)

#log('headers = ' + str(headers))

headers['Content-Length'] = len(params)

try:

if method == POST:

conn.request(method, url, params, headers)

else:

conn.request(method, url + params)

response = conn.getresponse()

except Exception, e:

log('request failed. method = %s, url = %s, params = %s headers = %s'%(

method, url, params, headers))

log(str(e))

fail_op(task, UNEXPECTED_ERROR, log)

continue

if response.status != httplib.OK:

fail_op(task, response.status, log)

continue

data = response.read()

results.put((tid, data), True)

class HttpPool(object):

def __init__(self, threads_count, fail_op, log):

self._tasks = Queue()

self._results = Queue()

for i in xrange(threads_count):

thread.start_new_thread(get_remote_data,(self._tasks, self._results, fail_op, log))

def add_task(self, tid, host, url, params, headers = {}, method = 'GET', timeout = None):

task = {

'id' : tid,

'conn_args' : {'host' : host} if timeout is None else {'host' : host, 'timeout' : timeout},

'headers' : headers,

'url' : url,

'params' : params,

'method' : method,

}

try:

self._tasks.put_nowait(task)

except Full:

return False

return True

def get_results(self):

results = []

while True:

try:

res = self._results.get_nowait()

except Empty:

break

results.append(res)

return results

def test_google(task_count, threads_count):

hp = HttpPool(threads_count, base_fail_op, base_log)

for i in xrange(task_count):

if hp.add_task(i,

'www.google.cn',

'/search?',

{'q' : 'lai'},

# method = 'POST'

):

print 'add task successed.'

while True:

results = hp.get_results()

if not results:

time.sleep(1.0 * random.random())

for i in results:

print i[0], len(i[1])

# print unicode(i[1], 'gb18030')

if __name__ == '__main__':

import sys, random

task_count, threads_count = int(sys.argv[1]), int(sys.argv[2])

test_google(task_count, threads_count)

有兴趣想尝试运行的朋友,可以把它保存为 xxxx.py,然后执行 python xxxx.py 10 4,其中 10 表示向 google.cn 请求 10 次查询,4 表示由 4 条线程来执行这些任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第87套)

第87套&#xff1a; 函数fun的功能是&#xff1a;统计长整数n的各个位上出现数字1、2、3的次数,并通过外部(全局)变量c1&#xff0c;c2&#xff0c;c3返回主函数。例如&#xff1a;当n123114350时&#xff0c;结果应该为: c13 c21 c32。 请在程序的下划线处填入正确的内容并把…

Linux命令之ifconfig

ifconfig [interface] ifconfig interface [aftype] options | address… ifconfig是用来查看和配置网络接口的工具。Ifconfig配置的信息在网络设备重启后&#xff0c;配置就会还原。需要永久保存&#xff0c;请进入配置文件配置。 address可以是inet&#xff08;TCP/IP&#x…

C#实现RTP数据包传输

闲暇时折腾IP网络视频监控系统&#xff0c;需要支持视频帧数据包在网络内的传输。未采用H.264或MPEG4等编码压缩方式&#xff0c;直接使用Bitmap图片。由于对帧的准确到达要求不好&#xff0c;所以采用UDP传输。如果发生网络丢包现象则直接将帧丢弃。为了记录数据包的传输顺序和…

linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、将整数和结构体数组写到文件

参考&#xff1a;linux文件编程&#xff08;3&#xff09;—— 文件编程的简单应用&#xff1a;myCp、修改配置文件 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-09 23:45:05 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115209404 …

51芯片4*4列阵按键c语言程序,单片机城中社稷.doc

单片机城中社稷基于单片机的乳粉包装称重控制设计摘 要本论文在分析了国内外称重技术发展的基础上&#xff0c;着重对一个用于工业控制且功能较齐全的自动称重系统进行设计。随着自动化和管理现代化的进展&#xff0c;自动在线称重&#xff0c;快速动态称重在整个称重系统中有了…

linux 修改文件名_Linux常用命令

Linux下一切皆文件查看型ls 查看当前文件夹内容 选项 -a 查看隐藏文件 -l 查看文件详细信息pwd 查看当前所在路径su 切换用户cat /etc/passwd 查看当前系统的用户cat 文件 查看文件内容选项 -n 加上编号 -E 每行末尾加上$ifconfig 查看网卡名&#xff0c;IP地址等网络信息route…

Redis学习日记-05:SORT命令

目录 前言命令&选项SORT&#xff08;默认根据元素由小到大&#xff09;&#xff1a;DESC&#xff08;逆序&#xff09;&#xff1a;ALPHA&#xff08;非数字元素排序&#xff09;&#xff1a;BY&#xff08;参考键&#xff09;&#xff1a;LIMIT(返回指定范围的结果)&#…

Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1

错误大致显示如下信息&#xff1a;04-14 07:39:18.325: E/AudioEffect(20584): set(): AudioFlinger could not create effect, status: -104-14 07:39:18.325: E/libOpenSLES(20584): Effect initCheck() returned -104-14 07:39:18.325: E/libOpenSLES(20584): Environmental…

c语言mfc弹出窗口函数,CMFCDesktopAlertWnd实现桌面弹出消息框

1.创建一个CMFCDesktopAlertWnd指针CMFCDesktopAlertWnd* pPopup new CMFCDesktopAlertWnd;2.设置参数pPopup->SetAnimationType((CMFCPopupMenu::ANIMATION_TYPE) 2);pPopup->SetAnimationSpeed(100);pPopup->SetTransparency((BYTE)128);pPopup->SetSmallCaptio…

linux文件编程(2)——系统文件描述符、动静态文件、块设备介绍

参考&#xff1a;linux文件编程&#xff08;2&#xff09;——文件操作原理简述之文件描述符、动静态文件、块设备 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-09 11:14:12 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115209312 目…

wxpython入门_wxpython笔记:Wxpython入门

#!/usr/bin/env python静态文本、可控文本、对话框、GetApp()importwx,timeID_EXIT200ID_ABOUT201class Frame(wx.Frame): #2 wx.Frame子类def __init__(self,parent None,id -1,title wxPython!):wx.Frame.__init__(self,parent,id,title,size(500,500))self.setupStatusBar…

C#常用加密方式

一、AES加密算法AES算法基于排列和置换运算。排列是对数据重新进行安排&#xff0c;置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。 AES是一个迭代的、对称密钥分组的密码&#xff0c;它可以使用128、192 和 256 位密钥&#xff0c;并且用 1…

C语言写文件到txt里有屯字,C语言10 文件.ppt

第十章 文件C文件概述文件类型指针文件的打开与关闭文件的读写文件的定位出错的检测赂恰滔氢戳骏市蔫盒少郴害篆汤看拴掳驮泅戈呕压琐憨波褪队敛紫爸戏仅C语言10 文件C语言10 文件10.1 C文件概述文件&#xff1a;存储在外部介质上数据的集合,是操作系统数据管理的单位文件分类按…

java中volatile的使用方式

2019独角兽企业重金招聘Python工程师标准>>> 转载地址&#xff1a; http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 转载于:https://my.oschina.net/wangfree/blog/122664

python socketio_flask-socketio实现WebSocket的方法

【flask-socektio】之前不知道在哪个场合下提到过如何从web后台向前台推送消息。听闻了反向ajax技术这种模式之后&#xff0c;大呼神奇&#xff0c;试了一下之后发现也确实可以用。不过&#xff0c;反向ajax的代价也很明显&#xff0c;只要客户端还和服务端要有信息交互&#x…

linux文件编程(1)—— open、write、read、lseek、阻塞问题(ps文件操作/文件描述符/重定向原理/缓冲区/标准错误)

参考&#xff1a;linux文件编程&#xff08;1&#xff09;—— 常用API之open、write、read、lseek 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-08 22:19:28 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115209134 【Linux】文件操…

最大流自用模板(例题:HDU1532)

三种模板&#xff1a;Edmonds_Karp&#xff0c;Dinic&#xff0c;SAP 例题&#xff1a; Drainage Ditches&#xff08;HDU1532&#xff09; Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22365 Accepted Sub…

安卓手机python数据可视化_python 数据可视化

# -*- coding:utf-8 -*-# 异常值处理import pandas as pdaimport numpy as npyimport matplotlibmatplotlib.use(Agg)import matplotlib.pyplot as pylimport iodef index(data):# 输出结果必须为字典outputoutput {}# data pda.read_excel("D:/taobao2.xls")data …

$_SERVER

PHP $_SERVER 变量 $_SERVER 是一个包含诸如头信息&#xff08;header&#xff09;、路径&#xff08;path&#xff09;和脚本位置&#xff08;script locations&#xff09;的数组。它是 PHP 中一个超级全局变量&#xff0c;我们可以在 PHP 程序的任何地方直接访问它。 $_SERV…

linux文件编程(4)—— 用ANSIC标准C库函数进行文件编程:fopen、fread、fwrite、fseek

参考&#xff1a;linux文件编程&#xff08;5&#xff09;—— 用ANSIC标准中的C库函数进行文件编程 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-11 11:58:25 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115209680 部分参照&#…