用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()

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

目录
相关文章
|
10天前
|
数据采集 Web App开发 数据挖掘
使用Python和BeautifulSoup轻松抓取表格数据
使用Python和BeautifulSoup,结合代理IP,可以从网页抓取表格数据,如中国气象局的天气信息。通过requests库发送HTTP请求,BeautifulSoup解析HTML提取表格。安装必要库后,设置代理IP,发送请求,解析HTML找到表格,提取数据并存储。通过Pandas进行数据分析,如计算平均气温。这种方法让数据抓取和分析变得更加便捷。
使用Python和BeautifulSoup轻松抓取表格数据
|
11天前
|
数据采集 Web App开发 数据处理
一步步教你用Python Selenium抓取动态网页任意行数据
使用Python Selenium爬取动态网页,结合代理IP提升抓取效率。安装Selenium,配置代理(如亿牛云),设置User-Agent和Cookies以模拟用户行为。示例代码展示如何使用XPath提取表格数据,处理异常,并通过隐式等待确保页面加载完成。代理、模拟浏览器行为和正确配置增强爬虫性能和成功率。
一步步教你用Python Selenium抓取动态网页任意行数据
|
10天前
|
安全 Java Python
GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。
【6月更文挑战第20天】GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。线程池通过预创建线程池来管理资源,减少线程创建销毁开销,提高效率。示例展示了如何使用Python实现一个简单的线程池,用于执行多个耗时任务。
20 6
|
6天前
|
算法 API 调度
|
12天前
|
数据采集 自然语言处理 调度
【干货】python多进程和多线程谁更快
【干货】python多进程和多线程谁更快
13 2
|
19小时前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
9 0
|
2天前
|
数据采集 XML 存储
【Python实战】Python多线程批量采集图片
【Python实战】Python多线程批量采集图片
|
4天前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
|
6天前
|
开发者 Python
在Python中获取当前线程的名字
在Python中获取当前线程的名字 原
7 0
|
8天前
|
机器学习/深度学习 人工智能 前端开发
Python中的模块化编程
【6月更文挑战第17天】Python模块化编程与软件架构设计的关键在于拆分任务到独立模块,提高代码的可维护性、可重用性和可扩展性。例如,学生管理系统可分解为录入、查询和删除模块。MVC和MVVM架构模式有助于组织代码,而微服务和函数式编程将在未来发展中扮演重要角色。通过示例代码,读者能学习如何实现这些概念,提升项目开发效率和质量。
155 57