多线程:URL提取

时间:2018-03-05 12:51:25

标签: python multithreading concurrent.futures

我尝试多处理一个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

非常感谢!

1 个答案:

答案 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)