python实现多线程网页下载器

本文为大家分享了python实现的一个多线程网页下载器,供大家参考,具体内容如下

这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据。把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好。

keywords:python,http,multi-threads,thread,threading,httplib,urllib,urllib2,Queue,http pool,httppool

废话少说,上源码:

# -*- 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 条线程来执行这些任务。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Python编写一个优美的下载器
  • python实现音乐下载器
  • Python实现多线程HTTP下载器示例
  • Python制作CSDN免积分下载器
  • python使用urllib模块开发的多线程豆瓣小站mp3下载器
(0)

相关推荐

  • Python实现多线程HTTP下载器示例

    本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为: 1.解析url: 2.连接web服务器: 3.构造http请求包: 4.下载文件. 接下来通过代码进行说明. 解析url 通过用户输入url进行解析.如果解析的路径为空,则赋值为'/':如果端口号为空,则赋值为"80":下载文件的文件名可根据用户的意愿进行更改(输入'y'表示更改,输入

  • python使用urllib模块开发的多线程豆瓣小站mp3下载器

    复制代码 代码如下: #! /usr/bin/python2.7# -- coding:utf-8 -- import os, urllib,urllib2, thread,threadingimport re #匹配音乐urlreg=re.compile('{"name":"(.+?)".+?"rawUrl":"(.+?)",.+?}', re.I) class downloader(threading.Thread):  

  • python实现音乐下载器

    本文实例为大家分享了python音乐下载器的具体代码,供大家参考,具体内容如下 import requests import urllib import json from tkinter import * import tkinter.messagebox from tkinter.filedialog import askdirectory class QQMusic(): def __init__(self): self.interface = Tk() self.interface.ti

  • Python制作CSDN免积分下载器

    CSDN免积分下载 你懂的. 1.输入资源地址如:http://download.csdn.net/download/gengqkun/4127808 2.输入验证码 3.点击下载,会弹出浏览器下载. 注:成功率在70-80% ,界面很丑,请将就着用. 复制代码 代码如下: #-*-coding:utf-8-*- #python3.3.5 import urllib.parse,urllib.request,http.cookiejar,io,webbrowser import tkinter

  • Python编写一个优美的下载器

    本文实例为大家分享了Python编写下载器的具体代码,供大家参考,具体内容如下 #!/bin/python3 # author: lidawei # create: 2016-07-11 # version: 1.0 # 功能说明: # 从指定的URL将文件取回本地 ##################################################### import http.client import os import threading import time impo

  • python实现多线程网页下载器

    本文为大家分享了python实现的一个多线程网页下载器,供大家参考,具体内容如下 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. keywords:python,http,multi-threads,thread,threading,httplib,urllib,urllib2,Queue,http pool,httppool 废话少说,上源码: # -*- coding:utf-8 -*- im

  • 基python实现多线程网页爬虫

    一般来说,使用线程有两种模式, 一种是创建线程要执行的函数, 把这个函数传递进Thread对象里,让它来执行. 另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的class里. 实现多线程网页爬虫,采用了多线程和锁机制,实现了广度优先算法的网页爬虫. 先给大家简单介绍下我的实现思路: 对于一个网络爬虫,如果要按广度遍历的方式下载,它是这样的: 1.从给定的入口网址把第一个网页下载下来 2.从第一个网页中提取出所有新的网页地址,放入下载列表中 3.按下载列表中的地

  • 用python制作个音乐下载器

    前言 某个夜深人静的夜晚,我打开了自己的文件夹,发现了自己写了许多似乎很无聊的代码.于是乎,一个想法油然而生:"生活已经很无聊了,不如再无聊一点叭". 说干就干,那就开一个专题,我们称之为kimol君的无聊小发明. 妙-啊~~~ 直奔主题!本文主题是用python做一个音乐下载器(MusicLover),直接上图: 想必看到这里,各位看官的脑海中已经脑补出各种JS解密,参数分析等等让初学者很头疼的东东了. 然而,我并不打算这么干~(小声嘀咕:"没想到吧") 本文很友

  • 用python制作个视频下载器

    前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码.我拍腿正坐,一个想法油然而生:"生活已然很无聊,不如再无聊些叭". 于是,我决定开一个专题,便称之为kimol君的无聊小发明. 妙-啊~~~ 众所周知,视频是一个学习新姿势知识的良好媒介.那么,如何利用爬虫更加方便快捷地下载视频呢?本文将从数据包分析到代码实现来进行一个相对完整的讲解. 一.爬虫分析 本次选取的目标视频网站为某度旗下的好看视频: https://haok

  • python 制作网站小说下载器

    基本开发环境 · Python 3.6 · Pycharm 相关模块使用 目标网页分析 输入想看的小说内容,点击搜索 这里会返回很多结果,我只选择第一个 网页数据是静态数据,但是要搜索,是post请求,需要提价data参数,如下图所示: 然后通过解析网站数据,获取第一个小说i的详情页url即可 静态网页的获取,难度是不大的. def search():     search_url = 'http://www.xbiquge.la/modules/article/waps.php'     da

  • Android编程开发实现多线程断点续传下载器实例

    本文实例讲述了Android编程开发实现多线程断点续传下载器.分享给大家供大家参考,具体如下: 使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点续传功能,下次启动时从记录位置继续下载,可避免重复部分的下载.这里采用数据库来记录下载的进度. 效果图:   断点续传 1.断点续传需要在下载过程中记录每条线程的下载进度 2.每次下载开始之前先读取数据库

  • Python实现一个论文下载器的过程

    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是"美滋滋". 然而,当师姐告诉我:"xx,可以帮我下载几篇文献嘛?".乐心助人的我自当是满口答应了,心想:"这种小事就交给我叭~" 于是乎,我收到了一个excel文档,66篇论文的列表安静地趟在里面(此刻心中碎碎念:"这尼玛,是几篇嘛...&q

  • 用python制作个论文下载器(图形化界面)

    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是"美滋滋". 在上一篇文章中介绍了分析过程以及相应的函数代码.根据小伙伴们的反映发现了一些问题,毕竟命令框的形式用起来难免没那么"丝滑".为了让大家更方便地使用,可以"纵享丝滑",kimol君决定写一个图形界面(GUI): PS.由于近期实属忙到晕厥,这

  • Python实现免费音乐下载器

    目录 前言 ​正文 1)思路 2)环境 3)代码演示 4)效果展示 前言 嘿!一直在学习从没停下,最近的话一直没咋更新,因为小编也在忙着学编程~ 哈哈哈,今天刚好有时间嘛 那就给学习爬虫的小伙伴儿更新一期简单的爬虫案例实战给大家啦! ​ 于是最后我还是选择了一种最简单,最方便的一种方法: python爬虫. ​正文 1)思路 进入某音乐主页输入任意歌手,比如李XX为列. 音乐从哪里来?---网站的服务器里 怎么从网址里得到音乐?---向网站发起网络请求 最后用tkinter做成一个界面下载框即可

随机推荐