Многопроцессорная обработка Python для цикла for (запросы и BeautifulSoup) - PullRequest
0 голосов
/ 27 июня 2018

У меня есть список из множества ссылок, и я хочу использовать многопроцессорность для ускорения процесса, вот упрощенная версия, мне нужно, чтобы она была упорядочена следующим образом:

click

Я много чего перепробовал, процесс, пул и т. Д. У меня всегда были ошибки, мне нужно сделать это с 4 или 8 потоками и упорядочить их так. Спасибо за всю помощь. Вот код:

from bs4 import BeautifulSoup
import requests
import time

links = ["http://www.tennisexplorer.com/match-detail/?id=1672704", "http://www.tennisexplorer.com/match-detail/?id=1699387", "http://www.tennisexplorer.com/match-detail/?id=1698990" "http://www.tennisexplorer.com/match-detail/?id=1696623", "http://www.tennisexplorer.com/match-detail/?id=1688719", "http://www.tennisexplorer.com/match-detail/?id=1686305"]

data = []

def essa(match, omega):
    aaa = BeautifulSoup(requests.get(match).text, "lxml")
    center = aaa.find("div", id="center")
    p1_l = center.find_all("th", class_="plName")[0].find("a").get("href")
    p2_l = center.find_all("th", class_="plName")[1].find("a").get("href")
    return p1_l + " - " + p2_l + " - " + str(omega)

i = 1

start_time = time.clock()

for link in links:
    data.append(essa(link, i))
    i += 1

for d in data:
    print(d)

print(time.clock() - start_time, "seconds")

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Насколько я понимаю, у вас есть список ссылок и одновременное выполнение запросов для ускорения процесса. Вот пример кода для многопоточности. Я надеюсь, что это поможет вам. Прочитайте документацию по сопутствующим фьючерсам.

import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']

# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()

# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))
0 голосов
/ 27 июня 2018

Создать несколько потоков функции и соединить их вместе:

from threading import Thread

def essa(match, omega):
    aaa = BeautifulSoup(requests.get(match).text, "lxml")
    center = aaa.find("div", id="center")
    p1_l = center.find_all("th", class_="plName")[0].find("a").get("href")
    p2_l = center.find_all("th", class_="plName")[1].find("a").get("href")
    print p1_l + " - " + p2_l + " - " + str(omega)


if __name__ == '__main__':
    threadlist = []
    for index, url in enumerate(links):
        t= Thread(target=essa,args=(url, index))
        t.start()
        threadlist.append(t)
    for b in threadlist:
        b.join()

Вы не будете заставлять их печатать по порядку по той простой причине, что некоторые ответы http занимают больше времени, чем другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...