Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是python中扩展url的最快方法_Python_Url_Expand - Fatal编程技术网

什么';这是python中扩展url的最快方法

什么';这是python中扩展url的最快方法,python,url,expand,Python,Url,Expand,我有一个签入列表,其中包含大约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]).

我有一个签入列表,其中包含大约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()

线程在网络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)
pat=re.compile((?Phttps?:/[^\s]+))#始终编译它
缺少\u URL=0
错误的URL=0
def检查(签入):
match=pat.search(签入[5])
如果不匹配:
全局缺少URL
缺少\u URL+=1
其他:
url=match.group(“url”)
尝试:
urllib2.urlopen(url)#如果以后不需要,不要查找.url
除了URLError:#或只是例外
全局错误URL
错误的URL+=1
对于i,签入枚举(纽约大学签入):
签入
打印(错误的\u URL、丢失的\u URL)

如果没有改进,那么现在我们有了一个很好的
check
函数,创建一个线程池并为其提供数据。加速是有保证的。使用进程进行网络I/O是毫无意义的

我想我会进一步阐述我关于使用
多处理
来加速这项任务的评论

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

这将返回一个
(shorturl,longurl)
元组,或者 发生故障时返回
(短URL,无)

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

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
希望这足以让你开始


(注意:您可以使用
线程化
模块编写类似的解决方案,而不是
多处理
。我通常只是先获取
多处理
,但在这种情况下,两者都可以工作,线程化甚至可能稍微更有效。)

你所说的“扩展url”是什么意思?你能举一个例子说明
签入[5]
的值吗?处理1000个签入需要一个小时的时间?这似乎太过分了。您可以使用多处理模块(multiprocessing module)对代码进行并行化,但似乎还有其他事情在进行@彼得伍德“扩展”可能==“将短url解析为原始url”顺便问一下,预期会出现什么样的异常?所有的
签入[5]
都有正确的模式?@CPanda可能有一些签入[5]没有URL,我不确定,所以我添加了这个例外,非常感谢您的明确回答。很抱歉,我犯了一个错误:有些URL不是来自Bitly,因此请求可能无法用于某些签入..我只想使用urllib2模块我认为很明显,如何使用
urllib2
而不是请求来完成同样的事情。这对于任何URL都很好;我在Twitter URL上测试了它,因为我手头没有一堆bit.ly链接。谢谢,事实上我理解它。但是为什么您要在pool.map(解析url,url)中对shorturl和longurl执行
,如果我们只需执行
解析url=pool.map(解析url,url)
,您完全可以这样做。在发布之前,我本来在这个循环中有更多的内容……你这是什么意思?所以,如果我像您一样执行for循环,如果我检查len(resolved_url),我可以知道resolve_url函数处理了多少个元素?
import multiprocessing

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