我尝试多处理一个URL抓取过程,因为否则需要花费大量时间来处理我想要处理的300k网址。不知怎的,我的代码在一段随机的时间后停止工作,我不知道为什么。你能帮助我吗?我已经对此做了一些研究,但找不到任何对我有帮助的东西。通常情况下,我可以处理大约20k链接但是它会冻结而没有错误,只是没有进一步处理链接和程序仍在运行。也许所有进程都有不良链接拥挤?有什么方法可以解决这个问题吗?
urls = list(datafull['SOURCEURL'])
#datafull['SOURCEURL'].apply(html_reader)
with futures.ThreadPoolExecutor(max_workers=50) as executor:
pages = executor.map(html_reader,urls)
我的html_reader脚本:
def html_reader(url):
try:
os.chdir('/Users/benni/PycharmProjects/Untitled Folder/HTML raw')
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
r = requests.get(url, headers=headers)
data = r.text
url = str(url).replace('/','').replace('http:','').replace('https:','')
name = 'htmlreader_'+url+'.html'
f = open(name,'a')
f.write(str(data))
f.close()
print(time.time(),' ',url)
return data
except Exception:
pass
非常感谢!
答案 0 :(得分:0)
我修改并清理了一些代码。你可以试试这个。在主要方法中,您需要输入否。机器上可用的核心减去1作为n_jobs 参数的值。 我使用joblib库进行多处理,因此您需要在计算机上安装它。
import requests as rq
import os
from joblib import Parallel, delayed
os.chdir('/Users/benni/PycharmProjects/Untitled Folder/HTML raw')
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
def write_data(htmlText):
with open("webdata.txt","w+") as fp:
fp.write(htmlText)
def get_html(url):
resp = rq.get(url,headers=headers)
if (resp.status_code==200):
write_data(resp.text)
else:
println("No Data received for : {0}".format(url))
if __name__ == "__main__":
urls = list(datafull['SOURCEURL'])
Parallel(n_jobs="no.of cores on your machine - 1")(delayed(get_html)(link) for link in urls)