改进后的多线程爬虫

本文在没使用框架的情况下,写的简单的多线程例子,合适初学者

package

#coding:utf-8
import re                  ###正则表达式
import threading           ###多线程
import urllib2             ###urllib2
import time                ###时间用来计算花费的时间
import sys                 ###来加载ascii 防止Error的出现
import pandas              ###简单的库
reload(sys)
sys.setdefaultencoding('utf-8')

多线程的类

class Mythread(threading.Thread):
    def __init__(self,func,args):
        threading.Thread.__init__(self)     ##初始化线程
        self.func=func                      ##得到传进来的函数
        self.args=args                      ##得到传进来的参数 这里是url
    def run(self):
        apply(self.func,self.args)          ##执行将参数放进函数里面

解析网页的类

class txinfo(object):
    def __init__(self,url):  ###初始化类  里面初始化该类需要的内容
        self.url=url
        global datas
        global datas2        ###global是全局变量
        datas=[]
        datas2=[]   
        self.start()         ###在初始化中启动这个类
    def start(self):         ###具体启动的细节
        mypage=self.getpage()   
        self.get_info(mypage)
    def getpage(self):       ###解析网页
        url=self.url
        try:
            req=urllib2.Request(url,headers={'User-Agent':'Browser'})
            mypage=urllib2.urlopen(req).read()
        except urllib2.HTTPError as e:
            if hasattr(e, 'code'):
                print "e.code :%s" % e.code
            if hasattr(e, 'reason'):
                print "e.reason: %s" % e.reason
        return mypage
    def get_info(self,mypage):  ###具体获得内容
        info=re.findall(r'<a href=".*?" target="_blank" title=".*?" _stat="videos-vert:title">(.*?)</a>',mypage,re.S)###正则表达式
        info2=re.findall(r'<a href=".*?" target="_blank" title=".*?" _stat="videos-vert:title">(.*?)</a>',mypage,re.S)
        datas.extend(info)      ###传给全局变量
        datas2.extend(info2)

main主函数

if __name__=='__main__':
    urlList=[]                  ###url列表
    for i in range(0,10):       ###将url添加进列表当中
        urlList.append('http://v.qq.com/x/list/movie?cate=10001&area=-1&offset='+str(i*30))
    time_start=time.time()      ###计时开始时间
    threadList=[Mythread(txinfo,(url,))for url in urlList]  ###把线程添加到线程list中
    for t in threadList:        ###每个线程开始
        t.setDaemon(True)
        t.start()
    for a,t in enumerate(threadList): ###每个线程加入
        t.join()            
        time.sleep(0.1)               ###每隔0.1秒加入一个
        print "now is the :%s of thread join the threading"%a
    time_end=time.time()              ###计时结束时间  
    df=pd.DataFrame(datas,columns=['data'])     ###将两个DataFrame进行合并
    df2=pd.DataFrame(datas2,columns=['data2'])
    df=df.join(df2)
    df.to_csv('a.csv',header=None,index=None)   ###写到csv中
    print "the thread way take %s s"%(time_end-time_start)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值