Heim > Fragen und Antworten > Hauptteil
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
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'