Python 多线程web抓取-如何使其更快?

Python 多线程web抓取-如何使其更快?,python,Python,我有一个包含10个元素的列表,每个元素都将包含在url中,因此10个url应该被读取并获得相同的数据。我从这里的一位专家那里得到了帮助,所以我尝试了多线程。但它仍然需要太长的时间,我如何才能提高,并使它大约10-15秒 ticker=['GE','F','BAC','CCL','DAL','OXY','WFC','BA','T','MRO'] 这个名单也来自一个网站 我花太多时间的问题是下面的代码。 有没有可能我能快点?我没有希望了,非常感谢你的帮助 result = [] def fetch

我有一个包含10个元素的列表,每个元素都将包含在url中,因此10个url应该被读取并获得相同的数据。我从这里的一位专家那里得到了帮助,所以我尝试了多线程。但它仍然需要太长的时间,我如何才能提高,并使它大约10-15秒

ticker=['GE','F','BAC','CCL','DAL','OXY','WFC','BA','T','MRO']

这个名单也来自一个网站

我花太多时间的问题是下面的代码。 有没有可能我能快点?我没有希望了,非常感谢你的帮助

result = []

def fetch(tick):
    url = ("https://finance.yahoo.com/quote/"+tick+"?p="+tick+"&.tsrc=fin-srch-v1")
    yahoo = requests.get(url)
    access2 = BeautifulSoup(yahoo.text,'html.parser')
    rows = access2.select('#quote-summary > div > table > tbody > tr > td > span')
    result.extend(rows)


def executor():
    threads = []
    for tick in ticker:
        t = threading.Thread(target=fetch, args=(tick,))  # Create a new thread
        t.start()  # Execute the target of the thread - fetch
        threads.append(t)

    for t in threads:
        t.join()  # Wait for the child thread to complete

    return result
您可以使用gevent

下面是一个很好的例子:


这里有多长?你对上一个问题的评论意味着现在需要45秒。如果这是针对所有10个URL(不是每个),取决于您的internet和CPU速度,在45秒内处理10个URL可能已经足够好了。@Martheen,是的,我的也需要45秒,但显然其他人,包括我的教授,声称应该在10-15秒之内,他们管理他们的代码在10-15秒之内。。当你运行它的时候,我真的很绝望,CPU/网络接口是不是已经用完了?也许可以尝试在云虚拟机上运行它,谷歌、Azure和AWS都有免费试用版。我真的看不到进一步的改进,除非他们使用不同的库,否则您当前的代码看起来和它得到的一样好。@Martheen,谢谢。这可能太宽泛/模糊了。你试过什么,做过什么研究吗?听起来你需要一个指南或教程,关于这个主题已经有很多资源了。请看,.Sir,上面写着ModuleNotFoundError:没有名为“simplejson”的模块……我用
import json
尝试了它,没有出现错误,但仍然和以前一样长。。
import gevent.monkey
gevent.monkey.patch_socket()

import gevent
import urllib2
import simplejson as json

def fetch(tick):
    url = ("https://finance.yahoo.com/quote/"+tick+"?p="+tick+"&.tsrc=fin-srch-v1")
    yahoo = requests.get(url)
    access2 = BeautifulSoup(yahoo.text,'html.parser')
    rows = access2.select('#quote-summary > div > table > tbody > tr > td > span')
    result.extend(rows)



def asynchronous():
    threads = []
    for tick in ticker:
        threads.append(gevent.spawn(fetch, tick))
    gevent.joinall(threads)


asynchronous()