python多线程抓取代理服务器

文章转载自:https://blog.linuxeye.com/410.html

代理服务器:http://www.proxy.com.ru

  1 #coding: utf-8
  2
  3 import urllib2
  4 import re
  5 import time
  6 import threading
  7 import MySQLdb
  8
  9 rawProxyList = []
 10 checkedProxyList = []
 11
 12 #抓取代理网站
 13 targets = []
 14 for i in xrange(1, 23):
 15     target = r"http://www.proxy.com.ru/list_%d.html" % i
 16     targets.append(target)
 17     #print target + "\n"
 18
 19 #抓取代理服务器正则
 20 p = re.compile(r‘‘‘<tr><b><td>(\d+)</td><td>(.+?)</td><td>(\d+)</td><td>(.+?)</td><td>(.+?)</td></b></tr>‘‘‘)
 21
 22 #获取代理的类
 23
 24 class ProxyGet(threading.Thread):
 25     def __init__(self, target):
 26         threading.Thread.__init__(self)
 27         self.target = target
 28
 29
 30     def getProxy(self):
 31         req = urllib2.Request(self.target)
 32         respnse = urllib2.urlopen(req)
 33         result = respnse.read()
 34         matches = p.findall(result)
 35         #print matches
 36         for row in matches:
 37             ip = row[1]
 38             port = row[2]
 39             addr = row[4].decode("cp936").encode("utf-8")
 40             proxy = [ip, port, addr]
 41             #print proxy
 42             rawProxyList.append(proxy)
 43
 44
 45     def run(self):
 46         self.getProxy()
 47
 48 #核对代理是否有效的类
 49 class ProxyCheck(threading.Thread):
 50     def __init__(self,proxyList):
 51         threading.Thread.__init__(self)
 52         self.proxyList = proxyList
 53         self.timeout = 5
 54         self.testUrl = "http://www.baidu.com/"
 55         self.testStr = "030173"
 56
 57     def checkProxy(self):
 58         cookies = urllib2.HTTPCookieProcessor()
 59         for proxy in self.proxyList:
 60             proxyHandler = urllib2.ProxyHandler({"http": r‘http://%s:%s‘ %(proxy[0], proxy[1])})
 61             #print r‘http://%s:%s‘ %(proxy[0],proxy[1])
 62             opener = urllib2.build_opener(cookies, proxyHandler)
 63             opener.addheaders = [(‘User-agent‘, ‘Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0‘)]
 64             #urllib2.install_opener(opener)
 65             t1 = time.time()
 66
 67             try:
 68                 #req = urllib2.urlopen("http://www.baidu.com", timeout=self.timeout)
 69                 req = opener.open(self.testUrl, timeout=self.timeout)
 70                 #print "urlopen is ok...."
 71                 result = req.read()
 72                 #print "read html...."
 73                 timeused = time.time() - t1
 74                 pos = result.find(self.testStr)
 75                 #print "pos is %s" %pos
 76
 77                 if pos >= 1:
 78                     checkedProxyList.append((proxy[0], proxy[1], proxy[2], timeused))
 79                     print "ok ip: %s %s %s %s" %(proxy[0],proxy[1],proxy[2],timeused)
 80                 else:
 81                      continue
 82             except Exception, e:
 83                 #print e.message
 84                 continue
 85
 86     def run(self):
 87         self.checkProxy()
 88
 89
 90 if __name__ == "__main__":
 91     getThreads = []
 92     checkThreads = []
 93
 94 #对每个目标网站开启一个线程负责抓取代理
 95 for i in range(len(targets)):
 96     t = ProxyGet(targets[i])
 97     getThreads.append(t)
 98
 99 for i in range(len(getThreads)):
100     getThreads[i].start()
101
102 for i in range(len(getThreads)):
103     getThreads[i].join()
104
105 print ‘.‘*10 + "总共抓取了%s个代理" % len(rawProxyList) + ‘.‘*10
106
107 #开启20个线程负责校验,将抓取到的代理分成20份,每个线程校验一份
108 for i in range(20):
109     t = ProxyCheck(rawProxyList[((len(rawProxyList)+19)/20) * i:((len(rawProxyList)+19)/20) * (i+1)])
110     checkThreads.append(t)
111
112 for i in range(len(checkThreads)):
113     checkThreads[i].start()
114
115 for i in range(len(checkThreads)):
116     checkThreads[i].join()
117
118 print ‘.‘*10 + "总共抓取了%s个代理" % len(checkedProxyList) + ‘.‘*10
119
120 #插入数据库,四个字段ip, port, speed, addr
121 def db_insert(insert_list):
122     try:
123         conn = MySQLdb.connect(host="127.0.0.1", user="root", passwd="meimei1118", db="ctdata", charset=‘utf8‘)
124         cursor = conn.cursor()
125         cursor.execute(‘delete from proxy‘)
126         cursor.execute(‘alter table proxy AUTO_INCREMENT=1‘)
127         cursor.executemany("INSERT INTO proxy(ip,port,speed,address) VALUES(%s, %s, %s,%s)", insert_list)
128         conn.commit()
129         cursor.close()
130         conn.close()
131
132     except MySQLdb.Error, e:
133         print "Mysql Error %d: %s" %(e.args[0], e.args[1])
134
135 #代理排序持久化
136 proxy_ok = []
137 for proxy in sorted(checkedProxyList, cmp=lambda x, y: cmp(x[3], y[3])):
138     if proxy[3] < 8:
139         #print "checked proxy is: %s:%s\t%s\t%s" %(proxy[0],proxy[1],proxy[2],proxy[3])
140         proxy_ok.append((proxy[0], proxy[1], proxy[3], proxy[2]))
141
142 db_insert(proxy_ok)
时间: 2024-12-16 19:16:42

python多线程抓取代理服务器的相关文章

用Python多线程抓取并验证代理

因为工作的关系,我写过许多个抓取网站信息的程序. 最简单的,只要用Python的urllib2.urlopen()函数就可以了: 然后,有个网站喜欢封人,所以,得找一批代理,轮流抓它的信息: 有的网站不允许程序抓取,所以,就得加入一些头信息: 有的网站需要登录,这时就要用到Cookies: 最后,为了提高效率,最好是使用多线程.(PS,有个地方要注意,urlopen这个函数,设定了一个全局对象opener,所以如果你使用了多个线程, 每个线程使用一个代理,那么,不能使用urlopen这个函数,而

数据挖掘_多线程抓取

在这一篇文章中,我们主要来介绍多线程抓取数据. 多线程是以并发的方式执行的,在这里要注意,Python的多线程程序只能运行在一个单核上以并发的方式运行,即便是多核的机器,所以说,使用多线程抓取可以极大地提高抓取效率 下面我们以requests为例介绍多线程抓取,然后在通过与单线程程序比较,体会多线程的效率的提高 这一次,我就不用我的网站做测试了,因为网站的内容此时还并不是太多,不能体现多线程的优势 我们通过当当网来测试我们的多线程实例,通过对搜索结果的同一抓取实现功能的演示,搜索模式地址如下 h

python 爬虫抓取心得

quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quote('要编码的字符串') query = urllib.quote(singername) url = 'http://music.baidu.com/search?key='+query response = urllib.urlopen(url) text = response.read()

PHP利用Curl实现多线程抓取网页和下载文件

PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery类来采集数据库,在此之外也可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件. 至于具体实现过程,请参考下面几个例子: 1.实现抓取多个URL并将内容写入指定的文件 $urls = array( '路径地址', '路径地址', '路径地址

Python爬虫抓取网页图片

本文通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地. 下面就看看如何使用python来实现这样一个功能. # -*- coding: utf-8 -*- import urllib import re import time import os #显示下载进度 def schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ''' per = 100.0 * a * b / c if per > 100 : per =

一个极其简洁的Python网页抓取程序

paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境 #---混合编程的类型 1.代码inline 方式 2.使用库/api  解析方式. #----配置resin 支持php resin4默认自动支持php.. 也能手动配置了.web.xml加php的servlet解析..参考Quercus让你的PHP开心在Servlet容器奔跑 #----配置 php.ini路线 运行t.php,,看见 Configuration File (php.ini) Path =>

python爬虫抓取站长之家IP库,仅供练习用!

python爬虫抓取站长之家IP库,单线程的,仅供练习,IP库数据有43亿条,如果按此种方法抓取至少得数年,所以谨以此作为练手,新手代码很糙,请大家见谅. #!/usr/bin/python #coding=UTF-8 import urllib2 import re import os import csv import codecs user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = { 'User-

python 爬虫抓取心得分享

/** author: insun title:python 爬虫抓取心得分享 blog:http://yxmhero1989.blog.163.com/blog/static/112157956201311821444664/ **/    0x1.urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quote('要编码的字符串') query = urllib.quote(singername) url = 'h

python 处理抓取网页乱码

python 处理抓取网页乱码问题一招鲜 相信用python的人一定在抓取网页时,被编码问题弄晕过一阵 前几天写了一个测试网页的小脚本,并查找是否包含指定的信息. 在html = urllib2.open(url).read()  时,打印到控制台始终出现乱码. 一般的解决办法就是html.decode('utf-8').encode('gb2312'),不过这个即使用了,也没能解决我的问题 这里有两个问题,第一个你要知道网页的编码格式是utf-8     第二你得确定你的系统是gb2312的,