一个利用urllib2模块编写的下载器,虽然有了requests模块,但是毕竟标准库

 import urllib2,random

 class strong_down():
def __init__(self):
#ip_list和agent_list可以自己写到config文件中,然后读出来
      self.proxy_ip_list = ['122.224.227.202:3128',
'182.254.220.21:3128',
'123.7.115.141:9797',
'183.61.236.54:3128',
'124.88.67.31:843',
'120.24.73.165:3128']
self.user_agent_list = ["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"
]
self.proxy_ip_num = len(self.proxy_ip_list)
self.user_agent_num = len(self.user_agent_list) def proxy_down(self,url,time_out=5,num_retries=3):
proxy_ip = self.proxy_ip_list[random.randint(0,self.proxy_ip_num-1)]
user_agent = self.user_agent_list[random.randint(0,self.user_agent_num-1)]
proxy_handler = urllib2.ProxyHandler({'http':proxy_ip})
opener = urllib2.build_opener(proxy_handler)
request = urllib2.Request(url,headers={'User-Agent':user_agent})
#print request.headers
try:
response = opener.open(request,timeout=time_out)
html = response.read()
if html == None:print 'none'
return html
except urllib2.URLError, e:
if hasattr(e,"code"):
print '',e.code,e.reason
if hasattr(e,"reason"):
print '',e.reason
if num_retries>1:
return self.proxy_down(url,time_out,num_retries-1)
except Exception as e:
print 'error:',e
if num_retries>0:
print 'proxy try...'
return self.proxy_down(url,time_out,num_retries-1)
else:
print u'代理也没diao用'
return None def down(self,url,time_out=5,num_retries=3):
user_agent = self.user_agent_list[random.randint(0,self.user_agent_num-1)]
request = urllib2.Request(url,headers={'User-Agent':user_agent})
try:
response = urllib2.urlopen(request,timeout=time_out)
html = response.read()
return html
except urllib2.URLError, e:
if hasattr(e,"code"):
print '', e.code,e.reason,e.msg
if hasattr(e,"reason"):
print '', e.reason
if num_retries>0:
print 'try...'
return self.down(url,time_out,num_retries-1)
except Exception as e:
print 'error:',e
if num_retries>0:
print 'try...'
return self.down(url,time_out,num_retries-1) #代理
if num_retries <=0:
return self.proxy_down(url,time_out,num_retries=3)

Python2 基于urllib2 的HTTP请求类的更多相关文章

  1. 【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类

    该代码是两年前写的,现在看起来有点渣了,仅仅是提供一个思路,现在做一些Api开发的时候官方会有一些SDK,这些SDK其实原理都是通过socket来通讯的,其实我个人主张用curl更方便,当然前提是你的 ...

  2. 基于Volley,Gson封装支持JWT无状态安全验证和数据防篡改的GsonRequest网络请求类

    这段时间做新的Android项目的client和和REST API通讯框架架构设计.使用了非常多新技术,终于的方案也相当简洁优雅.client仅仅须要传Java对象,server端返回json字符串, ...

  3. 基于socket实现http请求

    异步非阻塞模块原理 # 基于socket实现http请求 import socket # 多路IO复用模块 import select socket_list= [] url_list = [&quo ...

  4. 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

    目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...

  5. 一个比较强大的HTTP请求类,支持文本参数和文件参数。

    一个 http 请求类 ,支持文件上传,从淘宝 top sdk 里面扣出来的,蛮好用的,做个记录而已. 调用代码: Dictionary<string, string> textParas ...

  6. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  7. .NetCore简单封装基于IHttpClientFactory的HttpClient请求

    IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...

  8. [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏

    前言  这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示    ...

  9. python urllib2 发起http请求post

    使用urllib2发起post请求 def GetCsspToken(): data = json.dumps({"userName":"wenbin", &q ...

随机推荐

  1. HTTP 报文中的 Header 字段进行身份验证

    [小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证 在一些 Web 系统中,身份验证是依靠硬件证书进行的:在电脑上插入 USB 证书,浏览器插件读 ...

  2. HTML表单元素

    HTML表单元素 表单元素同意的形式向用户(例:文本字段,下拉列表,单箱,检查盒等)输入元素信息 表单标签 文本域(Text Fields) 当用户要在表单中键入字母,数字等内容时,就会用到文本域 单 ...

  3. .NET MVC通过反射获取数据修

    .NET MVC通过反射获取数据修 折磨了我一个晚上的问题,奈何对物理的反射印象太深了,整天去想着物理的反射.折射怎么解.感谢少将哥哥给我的指点,经过一个晚上对反射的恶补,最终搞定了.纪念一下. 1. ...

  4. DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?

    DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)? 阅读目录: 问题根源是什么? <领域驱动设计-软件核心复杂性应对之道>分层概念 Repositor ...

  5. EntityFramework中支持BulkInsert扩展

    EntityFramework中支持BulkInsert扩展 本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 很显然,你应该不至于使用 Ent ...

  6. Webapi备忘-20140109

    r01的翻译系列:http://www.cnblogs.com/r01cn/category/428069.html 接收FROM数据 Webapi接收表单数据,如果有多个数据比如x=1&y= ...

  7. 浅谈DevExpress<六>:为chart创建动态数据源

    今天搞点稍微复杂些的东西,在列表中点击不同的行时,图表中显示和其数据关联的图,效果如下:

  8. 细节MARK

    在刷vijos1046的时候遇到了一些细节,MARK一下 1.哲学之前有告诫我说,输出long long的数的时候,最好用cout,不然容易出现编译器的问题,今天算是领教了 2.对于数组赋值问题 me ...

  9. jQuery的入门与简介

    jQuery的入门与简介<思维导图>   <初学者请各位高手指点指点> jQuery是继Prototype之后又一个优秀的JavaScript库,在JavaScript基础上我 ...

  10. VS2012 Unit Test

    VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...