Python-Multithread-Crawling-Dateien, wie man eine Zeitüberschreitung für die erneute Verbindung festlegt.
黄舟
黄舟 2017-05-18 11:02:31
0
1
810

Wenn Sie Python zum Crawlen von Daten verwenden, aktivieren Sie das Multithread-Crawling in einem einzigen Prozess. Schließlich habe ich aufgrund der IO-intensiven Bedingungen nicht mehrere Prozesse.


Der Code lautet wie folgt

    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()

Aber solange die Anforderungen eines Threads keinen Wert zurückgeben, wartet der Thread weiter und schreibt nicht, sodass das Problem besteht, dass der Hauptprozess nicht blockiert wird.
Wie im Bild gezeigt


Wie gehe ich damit um? Legen Sie beispielsweise eine Zeitüberschreitung für „requests.get“ fest, aber was tun, nachdem die Zeitüberschreitung überschritten wurde? Es scheint, dass der Thread direkt beendet wurde und ich mit dem Herunterladen des nächsten Ziels fortfahren kann , aber dieser wird nicht heruntergeladen. Mir gefällt dieser Datensatz. Können Sie diese Ausnahme abfangen und die Verbindung wiederherstellen? Die Hauptsache ist das Schreiben, ich bin nicht sehr gut darin. So ungewohnt

黄舟
黄舟

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

Antworte allen(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'
    
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!