查看: 40216|回复: 31

[Python] 入门级Python网络爬虫(转)

[复制链接]
  • TA的每日心情

    2015-6-7 09:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-3-12 17:45:26 | 显示全部楼层 |阅读模式
    本帖最后由 xiaoye 于 2015-9-30 11:04 编辑

    Python爬虫多线程抓取代理服务器

    [日期:2013-07-13]        来源:Linux社区  作者:Linux        [字体:大 中 小]


    Python作为一门功能强大的脚本语言来说,经常被用来写爬虫程序,下面是Python爬虫多线程抓取代理服务器

    首先通过谷歌把包含代理服务器地址的网页查出来,我选择从 http://www.88181.com/ 这个网站上去抓, 在它上面了爬了800个代理(选择的8个页面)
    #!/usr/bin/env python
    [Python] 纯文本查看 复制代码
    #coding:utf-8
    
    import urllib2
    import re
    import threading
    import time
    
    rawProxyList = []
    checkedProxyList = []
    
    #抓取代理网站
    portdicts ={'v':"3",'m':"4",'a':"2",'l':"9",'q':"0",'b':"5",'i':"7",'w':"6",'r':"8",'c':"1"}
    targets = []
    for i in xrange(1,9):
            target = r"http://www.88181.com/proxy%d.html" % i
            targets.append(target)
    #print targets
    
    #正则
    p = re.compile(r'''<tr><td>(.+?)<SCRIPT type=text/javascript>document.write\(":"\+(.+?)\)</SCRIPT></td><td>(.+?)</td><td>.+?</td><td>(.+?)</td></tr>''')
    
    #获取代理的类
    class ProxyGet(threading.Thread):
        def __init__(self,target):
            threading.Thread.__init__(self)
            self.target = target
    
        def getProxy(self):
            print "目标网站: " + self.target
            req = urllib2.urlopen(self.target)
            result = req.read()
            #print chardet.detect(result)
            matchs = p.findall(result)
            for row in matchs:
                ip=row[0]
                port =row[1]
                port = map(lambda x:portdicts[x],port.split('+'))
                port = ''.join(port)
                agent = row[2]
                addr = row[3].decode("cp936").encode("utf-8")
                proxy = [ip,port,addr]
                #print proxy
                rawProxyList.append(proxy)
    
        def run(self):
            self.getProxy()
    
    #检验代理的类
    class ProxyCheck(threading.Thread):
        def __init__(self,proxyList):
            threading.Thread.__init__(self)
            self.proxyList = proxyList
            self.timeout = 5
            self.testUrl = "http://www.baidu.com/"
            self.testStr = "030173"
    
        def checkProxy(self):
            cookies = urllib2.HTTPCookieProcessor()
            for proxy in self.proxyList:
                proxyHandler = urllib2.ProxyHandler({"http" : r'http://%s:%s' %(proxy[0],proxy[1])})
                #print r'http://%s:%s' %(proxy[0],proxy[1])
                opener = urllib2.build_opener(cookies,proxyHandler)
                opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0')]
                #urllib2.install_opener(opener)
                t1 = time.time()
    
                try:
                    #req = urllib2.urlopen("http://www.baidu.com", timeout=self.timeout)
                    req = opener.open(self.testUrl, timeout=self.timeout)
                    #print "urlopen is ok...."
                    result = req.read()
                    #print "read html...."
                    timeused = time.time() - t1
                    pos = result.find(self.testStr)
                    #print "pos is %s" %pos
    
                    if pos > 1:
                        checkedProxyList.append((proxy[0],proxy[1],proxy[2],timeused))
                        #print "ok ip: %s %s %s %s" %(proxy[0],proxy[1],proxy[2],timeused)
                    else:
                        continue
                except Exception,e:
                    #print e.message
                    continue
    
        def run(self):
            self.checkProxy()
    
    if __name__ == "__main__":
        getThreads = []
        checkThreads = []
    
    #对每个目标网站开启一个线程负责抓取代理
    for i in range(len(targets)):
        t = ProxyGet(targets[i])
        getThreads.append(t)
    
    for i in range(len(getThreads)):
        getThreads[i].start()
    
    for i in range(len(getThreads)):
        getThreads[i].join()
    
    print '.'*10+"总共抓取了%s个代理" %len(rawProxyList) +'.'*10
    
    #开启20个线程负责校验,将抓取到的代理分成20份,每个线程校验一份
    for i in range(20):
        t = ProxyCheck(rawProxyList[((len(rawProxyList)+19)/20) * i:((len(rawProxyList)+19)/20) * (i+1)])
        checkThreads.append(t)
    
    for i in range(len(checkThreads)):
        checkThreads[i].start()
    
    for i in range(len(checkThreads)):
        checkThreads[i].join()
    
    print '.'*10+"总共有%s个代理通过校验" %len(checkedProxyList) +'.'*10
    
    #持久化
    f= open("proxy_list.txt",'w+')
    for proxy in sorted(checkedProxyList,cmp=lambda x,y:cmp(x[3],y[3])):
        print "checked proxy is: %s:%s\t%s\t%s" %(proxy[0],proxy[1],proxy[2],proxy[3])
        f.write("%s:%s\t%s\t%s\n"%(proxy[0],proxy[1],proxy[2],proxy[3]))
    f.close()

    部分log: 目标网站: http://www.88181.com/proxy1.html
    目标网站: http://www.88181.com/proxy2.html
    目标网站: http://www.88181.com/proxy3.html
    目标网站: http://www.88181.com/proxy4.html
    目标网站: http://www.88181.com/proxy5.html
    目标网站: http://www.88181.com/proxy6.html
    目标网站: http://www.88181.com/proxy7.html
    目标网站: http://www.88181.com/proxy8.html
    ..........总共抓取了800个代理..........
    ..........总共有478个代理通过校验.........
    173.213.113.111:8089    United States  0.341555833817
    173.213.113.111:3128    United States  0.347477912903
    210.101.131.232:8080    韩国 首尔      0.418715000153
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-6-1 20:30
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2015-3-13 09:55:13 | 显示全部楼层
    不错不错,拿走了! http://asp-muma.com/ 免杀asp木马,免杀php大马,jsp大马,aspx大马下载。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-27 22:55:02 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-28 07:53:31 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-29 06:13:58 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-6-21 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-6-29 20:36:12 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-30 14:58:31 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-7-1 05:48:45 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-10-24 10:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2015-7-1 08:48:57 | 显示全部楼层
    支持中国红客联盟(ihonker.org)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-7-1 12:25:51 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-12-4 16:40 , Processed in 0.034272 second(s), 12 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部