繁体   English   中英

在python中扩展URL的最快方法是什么

[英]What's the fastest way to expand url in python

我有一个签入列表,其中包含约600000个签入,并且每个签入中都有一个url,我需要将它们扩展回原始的长签。 我这样做

now = time.time()
files_without_url = 0
for i, checkin in enumerate(NYC_checkins):
    try:
        foursquare_url = urllib2.urlopen(re.search("(?P<url>https?://[^\s]+)", checkin[5]).group("url")).url
    except:
        files_without_url += 1

    if i%1000 == 0:
        print("from %d to %d: %2.5f seconds" %(i-1000, i, time.time()-now))
        now = time.time()

但是,这花费的时间太长:从0到1000签入,需要3241秒 这正常吗? 用Python扩展url的最有效方法是什么?

修改:有些Urls来自Bitly,而另一些则不是,我不确定它们来自何处。 在这种情况下,我只想使用urllib2模块。

供您参考,这是checkin[5]的示例:

I'm at The Diner (2453 18th Street NW, Columbia Rd., Washington) w/ 4 others. http...... (this is the short url)

我以为我会在有关使用multiprocessing来加快此任务的速度方面发表更多评论。

让我们从一个简单的函数开始,该函数将获取一个URL并尽可能地解析它(跟随重定向,直到获得200响应代码):

import requests

def resolve_url(url):
    try:
        r = requests.get(url)
    except requests.exceptions.RequestException:
        return (url, None)

    if r.status_code != 200:
        longurl = None
    else:
        longurl = r.url

    return (url, longurl)

这将返回一个(shorturl, longurl)元组,或者在失败的情况下返回(shorturl, None)

现在,我们创建一个工人池:

import multiprocessing

pool = multiprocessing.Pool(10)

然后要求我们的池解析URL列表:

resolved_urls = []
for shorturl, longurl in pool.map(resolve_url, urls):
    resolved_urls.append((shorturl, longurl))

使用上面的代码...

  • 拥有10名工作人员,我可以在900秒内解析500个URL。
  • 如果将工作人员的数量增加到100,则可以在30秒内解析500个URL。
  • 如果将工作人员的数量增加到200,则可以在25秒内解析500个URL。

希望这足以使您入门。

(注意:您可以使用threading模块而不是multiprocessing来编写类似的解决方案。通常,我通常只抢先进行multiprocessing ,但是在这种情况下,两者都可以工作,并且线程的使用效率甚至更高。)

对于网络I / O,线程是最合适的。 但是您可以先尝试以下方法。

pat = re.compile("(?P<url>https?://[^\s]+)") # always compile it
missing_urls = 0
bad_urls = 0
def check(checkin):
    match = pat.search(checkin[5])
    if not match:
        global missing_urls
        missing_urls += 1
    else:
        url = match.group("url")
        try:
            urllib2.urlopen(url) # don't lookup .url if you don't need it later
        except URLError: # or just Exception
            global bad_urls
            bad_urls += 1
for i, checkin in enumerate(NYC_checkins):
    check(checkin)
print(bad_urls, missing_urls)

如果您没有任何改善,现在我们有了一个不错的check功能,请创建一个线程池并进行处理。 加速得到保证。 使用过程进行网络I / O毫无意义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM