我正在编写一个python脚本,基本上检查每个可能的URL并记录它是否响应请求。
我在StackOverflow上找到了一篇帖子,其中提出了一种为URL生成字符串的方法,该方法效果很好。
for n in range(1, 4 + 1):
for comb in product(chars, repeat=n):
url = ("http://" + ''.join(comb) + ".com")
currentUrl = url
checkUrl(url)
正如您可以想象的那样,有许多方法可以访问许多URL,这将花费很长的时间,因此我试图找到一种方法来保存我的脚本并从停止的脚本中恢复。
我的问题是,如何让循环从特定的地方开始,或者有人能执行相同的代码并允许我在起点指定代码?
这是我的剧本。
import urllib.request
from string import digits, ascii_uppercase, ascii_lowercase
from itertools import product
goodUrls = "Valid_urls.txt"
saveFile = "save.txt"
currentUrl = ''
def checkUrl(url):
print("Trying - "+url)
try:
urllib.request.urlopen(url)
except Exception as e:
None
else:
log = open(goodUrls, 'a')
log.write(url + '\n')
chars = digits + ascii_lowercase
try:
while True:
for n in range(1, 4 + 1):
for comb in product(chars, repeat=n):
url = ("http://" + ''.join(comb) + ".com")
currentUrl = url
checkUrl(url)
except KeyboardInterrupt:
print("Saving and Exiting")
open(saveFile,'w').write(currentUrl)
最佳答案
尽管通过这种方法查找所有URL的尝试是荒谬的,但提出的一般问题是一个很好的问题。简短的答案是,您不能以直接的方式来腌制迭代器,因为腌制机制无法保存迭代器的内部状态。但是,您可以腌制同时实现__iter__
和__next__
的对象。因此,如果您创建具有所需功能并且还可以作为迭代器(通过实现这两个功能)的类,则可以对其进行腌制和重新加载。当您从中创建迭代器时,重新加载的对象将从其中断处继续。
#! python3.6
import pickle
class AllStrings:
CHARS = "abcdefghijklmnopqrstuvwxyz0123456789"
def __init__(self):
self.indices = [0]
def __iter__(self):
return self
def __next__(self):
s = ''.join([self.CHARS[n] for n in self.indices])
for m in range(len(self.indices)):
self.indices[m] += 1
if self.indices[m] < len(self.CHARS):
break
self.indices[m] = 0
else:
self.indices.append(0)
return s
try:
with open("bookmark.txt", "rb") as f:
all_strings = pickle.load(f)
except IOError:
all_strings = AllStrings()
try:
for s in iter(all_strings):
print(s)
except KeyboardInterrupt:
with open("bookmark.txt", "wb") as f:
pickle.dump(all_strings, f)
此解决方案还消除了对字符串长度的限制。迭代器将永远运行,最终生成所有可能的字符串。当然,由于宇宙的熵增加,应用将在某个时候停止。
关于python - Python-如何保存itertools.product循环并从中断处恢复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46629051/