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