我试图创建一个搜索Imgur链接网址的程序,并保存由图像实际存在的指定字符列表组成的程序。我在链接中有6个100%的字母,我试图通过这6个字符+ 1个额外的未知字符(a到z,0到9)运行所有组合。
例如:www.imgur.com/gallery/BZmO8Ha
我想知道除了打开每堆少量字母的Python外壳之外,还有更快的方法吗?
继承了我目前的代码:
- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker {
// your click action
StringAddress = marker.snippet;
StringName = marker.title;
NSInteger indexCheck = [NameHSArray indexOfObject:marker.title];
NSLog(@"Curret Index =%ld",(long)indexCheck);
StringName=[NSString stringWithFormat:@"%@",[NameHSArray objectAtIndex:indexCheck]];
StringAddress=[NSString stringWithFormat:@"%@",[AddressHSArray objectAtIndex:indexCheck]];
StringPhoneNo=[NSString stringWithFormat:@"%@",[PhoneNoHSArray objectAtIndex:indexCheck]];
NSLog(@"Address=%@",StringAddress);
NSLog(@"Name= %@",StringName);
NSLog(@"Phone No =%@",StringPhoneNo);
lblNamepopup.text=StringName;
lblAddresspopup.text=StringAddress;
}
答案 0 :(得分:3)
这真的很慢,因为你大部分时间都在等待来自imgur的回复。您可以通过将排列除以使用线程进行检查来加快速度,这样您就可以并行执行大量请求。更好的选择是使用asyncio / twisted / tornado / what进行异步编程。
另一个可能是最好的替代方案是使用 grequests ,这就像请求但是使用gevent异步:
https://github.com/kennethreitz/grequests
无论你选择什么,请确保以某种方式对请求进行评级限制,因为否则会对请求产生影响。
答案 1 :(得分:0)
所以有一件事情可以让它快得多,就是不要每次都打开并附加到文件中。
将其保存到内存中:
做这样的事情:
import requests
from itertools import permutations
letters = 'BZmO8H'
letter_list = 'abcdefghijklmnopqrstuvwxyz1234567890'
imgur_links = []
for letter in letter_list:
new_list = letters+letter
print(new_list)
for per in permutations(new_list, 7):
link = ''.join(per)
print(link)
r = requests.head("http://imgur.com/{}".format(link))
print(r.status_code)
if r.status_code == 200:
imgur_links .append("www.imgur.com/gallery/{}\n".format(link))
print("Image Found. Added to File")
elif r.status_code == 404:
print("No Image")
else:
print("ERROR, SOMETHING WENT WRONG")
file = open('links.txt', 'a')
file.write(imgur_links)
file.close()
这将最多加载36个图像,你也可能想要获得大写字符,这将使这总共62个应该非常快,你可以使用Asyncio或其他东西并行化请求,但是对于如此少的请求,它可能有点过分。