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

简介: 用Python多线程抓取并验证代理(转) 2009年03月19日 星期四 13:56 因为工作的关系,我写过许多个抓取网站信息的程序。最简单的,只要用Python的urllib2.urlopen()函数就可以了;然后,有个网站喜欢封人,所以,得找一批代理,轮流抓它的信息;有的网站不允许程序抓取,所以,就得加入一些头信息;有的网站需要登录,这时就要用到Cookies;最后,为了提高效率,最好是使用多线程。

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

2009年03月19日 星期四 13:56

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

下面是我用Python写的一个抓代理的脚本,虽然现在已经不在教育网内部了,不过有时候还是需要用一下代理的:)


# -*- coding: cp936 -*-
import urllib2,re,thread,time

import socket
socket.setdefaulttimeout(10)
  
#-----------------------定义抓取代理的函数-------------------------------#

def getcnproxy(name):
    pagenum=0
    result=[]
    getallpages=0
    trycount=0
    while getallpages==0 and trycount<=6:
        pagenum=pagenum+1
        url='http://www.proxycn.com/html_proxy/http-'+str(pagenum)+'.html'
        try:
            html=urllib2.urlopen(url)
            ip=''
            for line in html:
                if '''onDblClick="clip''' in line:
                    proxy=line[line.find("clip('")+6:line.find("')")]
                    lock.acquire()
                    print name,proxy
                    lock.release()
                    result.append(proxy)
                if '下一页|尾页' in line:
                    getallpages=1
        except:
            trycount=trycount+1
            pagenum=pagenum-1
    proxylist[0]=result
    return result

def getproxycn(name):
    pagenum=0
    result=[]
    getallpages=0
    trycount=0
    while pagenum<=9 and trycount<=2:
        pagenum=pagenum+1
        url='http://www.cnproxy.com/proxy'+str(pagenum)+'.html'
        try:
            html=urllib2.urlopen(url)
            for line in html:
                if "HTTP" in line:
                    proxy=line[line.find('<td>')+4:line.find('&#820')]+line[line.find(':'):line.find('</td><td>')]
                    lock.acquire()
                    print name,proxy
                    lock.release()
                    result.append(proxy)
        except:
            trycount=trycount+1
            pagenum=pagenum-1
    proxylist[1]=result
    return result

  
#------------------------- --------------- 结束代理抓取函数定义 --------------------------------------------------#

#------------------------------------------ 验证代理的函数定义 ---------------------------------------------------#

def proxycheckone(proxy):
    url='http://www.facebook.com'
    proxy_url = 'http://'+proxy
    proxy_support = urllib2.ProxyHandler({'http': proxy_url})
    opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
    r=urllib2.Request(url)
    r.add_header("Accept-Language","zh-cn")    #加入头信息,这样可以避免403错误
    r.add_header("Content-Type","text/html; charset=gb2312")
    r.add_header("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)")
    trycount=1
    while trycount<=2:
        try:
            T0=time.time()
            f=opener.open(r)
            data=f.read()
            if 'Welcome to Facebook!' in data:
                T=time.time()-T0             
                break
            else:return []
        except:
            time.sleep(3)
            trycount=trycount+1
    if trycount>2:
        return []
    else:
        return proxy+'$'+str(trycount)+'#'+str(T)

def proxycheck(idnum):
    while 1:
        r.acquire()
        try:
            i=proxylist[0]
            del proxylist[0]
            r.release()
        except:
            r.release()
            x[idnum]=1
            break
        b=proxycheckone(i)
        if len(b)>0:
            a.acquire()
            y.append(b)
            a.release()

#---------------------------------------- 验证代理的函数定义结束 -------------------------------------------------#

#----------------------------- 抓取代理,抓取到的代理放在proxies.txt中,以\n分隔 --------------------------------#

#x='''
lock=thread.allocate_lock()
proxylist=[[],[]]
thread.start_new(getcnproxy,('cnproxy',))
thread.start_new(getproxycn,('proxycn',))
while [] in proxylist:
    time.sleep(30)
proxylist=proxylist[0]+proxylist[1]
w=open('proxies.txt','a')
w.write('\n'.join(proxylist))
w.close()
del proxylist
print 'get all proxies!\n\n'
#'''

#----------------------------- 抓取代理完毕,抓取到的代理放在proxies.txt中,以\n分隔 -------------------------------#

#--------------------------------------------------- 验证代理 -----------------------------------------------------#

w=open('proxies.txt')
proxylist=list(set((re.sub(r'(\t+[^\n]*\n|\n)',',',w.read())).split(',')))
while '' in proxylist:
    del proxylist[proxylist.index('')]
w.close()

lock=thread.allocate_lock()
r=thread.allocate_lock()
a=thread.allocate_lock()
y=[]
x=[0]*120

for idnum in range(0,120):
    thread.start_new(proxycheck,(idnum,))

while 0 in x:
    print len(proxylist),sum(x),"left",len(y)
    time.sleep(10)

w=open('proxies.txt','w')
w.write(re.sub('^\n','',re.sub(r'\n+','\n','\n'.join(y)+'\n')))
w.close()

#-------------------------------------------------- 验证代理完毕 --------------------------------------------------#

目录
相关文章
|
6天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
7天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
4天前
|
数据采集 Python
python爬虫抓取91处理网
本人是个爬虫小萌新,看了网上教程学着做爬虫爬取91处理网www.91chuli.com,如果有什么问题请大佬们反馈,谢谢。
20 4
|
5天前
|
数据采集 Java Python
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
在信息化时代,实时数据的获取对体育赛事爱好者、数据分析师和投注行业至关重要。本文介绍了如何使用Python的`ThreadPoolExecutor`结合代理IP和请求头设置,高效稳定地抓取五大足球联赛的实时比赛信息。通过多线程并发处理,解决了抓取效率低、请求限制等问题,提供了详细的代码示例和解析方法。
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
|
7天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
14天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
21天前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
22 3
|
24天前
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
45 3
|
17天前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
45 0
|
21天前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
36 1
C++ 多线程之初识多线程