Fail merangkak berbilang benang Python, cara menetapkan tamat masa untuk menyambung semula.
黄舟
黄舟 2017-05-18 11:02:31
0
1
841

Apabila menggunakan python untuk merangkak data, dayakan merangkak berbilang benang dalam satu proses Lagipun, saya tidak mempunyai berbilang proses kerana keadaan intensif IO.


Kod adalah seperti berikut

    def get_downloads_url_list(self,pageNum):
        FilePath='C:/RMDZY/h'+str(pageNum)
        os.chdir(FilePath)
        with open(FilePath+'/m3u8.txt', 'r') as f:
            m3u8_txt = f.read()
        download_ts_list = re.findall(r'ppvod' + r'\d{7}' + r'.ts', m3u8_txt)
        download_url_list = [url + str(pageNum) + '/1000kb/hls/' + download_ts_list[i] for i in
                             range(len(download_ts_list))]
        max_length=len(download_url_list)
        dat_list=['ts'+str(i)+'.ts' for i in range(max_length)]
        dat_str='+'.join(dat_list)
        ts_command='copy /b '+dat_str+' new.ts'
        with open('ts.bat','w') as f:
            f.write(ts_command)
        return download_url_list

    def download_by_m3u8(self,i,pageNum):
        download_list=self.get_downloads_url_list(pageNum)
        ts_file = requests.get(download_list[i], verify=False)
        with open('ts'+str(i)+'.ts','ab') as f:
            f.write(ts_file.content)![图片描述][1]

    def download_threading(self,pageNum):
        download_list=self.get_downloads_url_list(pageNum)
        thread_list=[]
        for i in range(len(download_list)):
            thread = threading.Thread(target=self.download_by_m3u8, args=[i,pageNum])
            thread_list.append(thread)
            thread.start()
        for thread in thread_list:
            thread.join()

Tetapi selagi permintaan benang tidak mengembalikan nilai, benang akan terus menunggu dan tidak akan menulis, jadi akan ada masalah bahawa proses utama tidak disekat.
Seperti yang ditunjukkan dalam gambar


Bagaimana untuk menanganinya, sebagai contoh, tetapkan tamat masa untuk permintaan.dapatkan, tetapi apa yang perlu dilakukan selepas ia melebihi Selepas saya menetapkan tamat masa, nampaknya benang itu telah dibunuh secara langsung, dan saya boleh terus memuat turun sasaran seterusnya , tetapi yang ini tidak dimuat turun Saya seperti Rekod ini, bolehkah anda menangkap pengecualian ini dan menyambung semula? Perkara utama adalah menulis, saya tidak begitu mahir. Sangat tidak dikenali

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(1)
左手右手慢动作
num = 3 # 重试次数
while num > 0:
    try:
        result = requests.get(..., timeout=3) 
    except requests.exceptions.ReadTimeout:
        print 'Timeout, try again'
        num -= 1
    else:
        # 成功获取
        print 'ok'
        print result
        break
else:
    # 3次都失败
    print 'Try 3 times, But all failed'
    
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan