我正在编写一个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/

10-12 17:24
查看更多