Python中利用Threadpool.map()多线程抓数据

趁着手头暂时没有活,跟着python教程学习了一下,同时试用了一下map的多线程。

发现map的并行返回的结果是一个list,而且和iteratelist的顺序一致。:)

环境为python3.3+Pydev

import urllib.request as request
import collections
from multiprocessing import pool
from multiprocessing.dummy import Pool as ThreadPool
import urllib.request
import threading
import time


def __get__citycode(province_no):
    #====从上述url中读取城市信息
    url_prv =  'http://m.weather.com.cn/data5/city.xml' #province数据
    url_cty  = "http://m.weather.com.cn/data3/city%s.xml"#city数据
    content = request.urlopen(url_prv).read()

   #============================================================================
   #  #由于byte和string在python3中的差异性,需要加上b,
   #以解决'str' does not support the buffer interface问题
   #  province = content.split(b",")
   #  #利用容器,迅速获得列表的每一个元素,之后解码
   #  content2 = collections.Counter(province)
   #  for d in content2:
   #      d = d.decode("utf-8")
   #      print (d)
   #
   # # print (province)
   #============================================================================
    content = content.decode("utf-8")
    province = content.split(",")[province_no]
    partial_result= ''
    #print(provinces)
    p_code = province.split("|")[0]#取得省份编码
    url_cty_new = url_cty % p_code
    print (url_cty_new)
    content2 = request.urlopen(url_cty_new,None,5).read()#timeout设置为5秒
    content2 = content2.decode("utf-8")
    cites = content2.split(",")
    for c in cites:
        c_code = c.split("|")[0]#取得城市编码
        url_town = url_cty % c_code
        content3 = request.urlopen(url_town,None,5).read()#timeout设置为5秒
        content3 = content3.decode("utf-8")
        towns = content3.split(",")
        for t in towns:
            t_code = '101'+t.split("|")[0] #取得城镇编码,101为中国编码抬头
            #===============================================================
            # t_code = t.split("|")[0] #取得城镇编码
            #===============================================================
            #print(t_code)
            t_name = t.split("|")[1]#取得城市名称
            #===============================================================
            # url_4 = url_cty % t_code
            # content4 = request.urlopen(url_4).read()
            # content4 = content4.decode("utf-8")
            # print(content4)
            # code = content4.split("|")[1]
            # line = " '%s': '%s',\n" % (t_name, code)
            # result +=line
            # print (t_name+':'+code)
            #===============================================================
            line = " '%s': '%s',\n" % (t_name, t_code)
            partial_result +=line
            #print (t_name+':'+t_code)
    time.sleep(1)#休息一下
    return partial_result
if __name__ == '__main__':
    result = 'city = {\n'
    prv = []
    for i in range(34):
        prv.append(i)
    pool = ThreadPool(4)
    sum_result = pool.map(__get__citycode,prv)
    pool.close()
    pool.join()
    for i in range(prv.__len__()):
        result += sum_result[i]
    result +="}"
    #print (result)

    
    
    url_save = r"C:\Users\user\Desktop\python练习\tt.txt"
    f = open(url_save,"w")
    f.write(result)
    print("Finish")
    f.close()


你可能感兴趣的:(python,map多线程)