簡體   English   中英

快速搜索數千個鏈接Python3

[英]Searching through 1000s of links quickly Python3

我正在嘗試制作一個程序,該程序可搜索Imgur鏈接URL並保存由圖像實際存在的指定字符列表組成的鏈接。 我有6個字母在鏈接中占100%,並嘗試使用這6個字符+ 1個額外的未知字符(a到z,0到9)進行所有組合。
例如: www.imgur.com/gallery/BZmO8Ha

我想知道是否有比打開Python殼堆(每個字母只包含少量字母)的方法更快的方法?
這是我目前擁有的代碼:

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")

這確實很慢,因為您花了大部分時間等待imgur的回復。 通過划分排列以使用線程進行檢查,您可以大大提高速度,從而可以並行執行一堆請求。 更好的替代方法是使用異步編程(使用asyncio / twisted / tornado / whatever)。

另一種可能是最好的選擇是使用grequests ,它與請求一樣,但使用gevent異步:
https://github.com/kennethreitz/grequests

無論您選擇哪種方式,都請確保以某種方式對請求進行速率限制,因為否則將使請求泛濫。

因此,要使此操作快得多的一件事是不要打開並永久添加到文件中。

保存到內存:

做這樣的事情:

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或其他方式並行處理請求,但這可能會過分這么少的請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM