2017-02-28 56 views
0

我試圖製作一個程序,通過Imgur鏈接URL進行搜索並保存由圖像實際存在的指定字符列表組成的列表。我有6個字母在鏈接中是100%,並且試圖通過與這6個字符+ 1個額外的未知字符(a到z,0到9)的所有組合運行。
例如:www.imgur.com/gallery/BZmO8Ha快速搜索1000個鏈接Python3

我想知道是否有一個更快的方法來做到這一點,而不是打開每一小堆字母的Python shell的堆?
繼承人的代碼,我已經得到了目前:

import requests 
from itertools import permutations 

letters = 'BZmO8H' 
letter_list = 'abcdefghijklmnopqrstuvwxyz1234567890' 

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: 
      file = open('links.txt', 'a') 
      file.write("www.imgur.com/gallery/{}\n".format(link)) 
      file.close() 
      print("Image Found. Added to File") 
     elif r.status_code == 404: 
      print("No Image") 
     else: 
      print("ERROR, SOMETHING WENT WRONG") 

回答

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或者其他類似的方法來並行處理請求,但是對於這麼少的請求可能是過度的。

+0

謝謝,甚至沒有意識到大寫有所作爲。我可能沒有說清楚,但是這些信件沒有按順序排列,所以它可以以任何順序排列。意思是有1000個組合。那就是我的問題所在,不同組合的數量 –

+0

好吧,您的字母='BZmO8H'您剛剛用於您的示例,但您可能有數千個該字符串的不同組合?它是一個Anagram,還是完全隨機的數字? –

+0

字母='BZmO8H'都在裏面,加上一個我不知道的隨機字符。所以總共有7個字符隨機順序。 –

3

這真的很慢,因爲你大部分時間都在等待imgur的回覆。您可以通過將排列劃分爲使用線程進行檢查來加快這一點,以便可以並行執行一堆請求。更好的選擇是使用asyncio/twisted/tornado/whatever的異步編程。

另一種選擇,這也許是最好的,就是用grequests這就像請求,但異步使用GEVENT:
https://github.com/kennethreitz/grequests

無論你選擇確認率在某種程度上限制請求,因爲你會洪水與請求否決。

+0

好的,謝謝,任何推薦的指南/例子進入gevent? –