Heim  >  Fragen und Antworten  >  Hauptteil

Python-Multithread-Crawling-Dateien, wie man eine Zeitüberschreitung für die erneute Verbindung festlegt.

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

黄舟黄舟2711 Tage vor774

Antworte allen(1)Ich werde antworten

  • ringa_lee

    ringa_lee2017-05-18 11:04:31

    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'
        

    Antwort
    0
  • StornierenAntwort