Многопоточность: получение URL

Я попытался выполнить многопроцессорный процесс получения URL-адресов, поскольку в противном случае обработка 300 тыс. URL-адресов, которые я хочу обработать, заняла бы огромное количество времени. Каким-то образом мой код перестает работать через случайное время, и я не знаю, почему. Можете вы помочь мне? Я уже провел некоторое исследование по этому поводу, но не смог найти ничего, что мне очень помогло. Обычно я могу обработать около 20 тысяч ссылок, но затем он зависает без ошибки, просто нет дальнейшей обработки ссылок, и программа все еще работает. Может все процессы перегружены плохими ссылками? Любой способ понять это?

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

Большое спасибо!


person inneb    schedule 05.03.2018    source источник


Ответы (1)


Я изменил и немного подчистил ваш код. Вы могли бы попробовать этот. В основном методе вам нужно указать нет. ядер, доступных на вашем компьютере, минус 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)
person Yayati Sule    schedule 05.03.2018
comment
Я уже пробовал это. Однако он вообще не работает. Ничего не происходит. Любая идея, почему это не работает? Я использую MacOSX. - person inneb; 05.03.2018