改进后的多线程爬虫

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

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'(.*?)',mypage,re.S)###正则表达式
        info2=re.findall(r'(.*?)',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)

你可能感兴趣的:(python)