gpt4 book ai didi

python - 看不到无限循环

转载 作者:行者123 更新时间:2023-11-28 22:34:37 26 4
gpt4 key购买 nike

我正在尝试编写一个网络爬虫,但我被卡住了,因为我在代码中的某处看不到无限循环。

class Crawler(object):
def __init__(self, url, query, dir = os.path.dirname(__file__)):
self.start_url = url
self.start_parsed = urllib3.util.parse_url(url)
self.query = re.compile(query, re.IGNORECASE)
self.dir = dir
self.__horizon = set()
self.log = []

self.__horizon.add(url)
self.log.append(url)
print("initializing crawler....")
print(locals())

def start(self, depth= 5, url = '/'):
print(url, depth)
self.log.append(url)
if depth > 0:
pool = urllib3.PoolManager()
data = pool.request("GET", self.start_url if url == '/' else url).data.decode('utf-8')

valid_list = []
self.add_horizon(parser_soup.get_links(data), valid_list)

if re.search(self.query, parser_soup.get_text(data)):
self.output(data)

for u in valid_list:
self.start(depth = (depth-1), url = u)

def output(self, data):
with open(os.path.join(self.dir, get_top_domain(self.start_parsed.host) + '.' + str(time.time()) + '.html'), 'w+') as f:
f.write(data)

def add_horizon(self, url_list, valid_list = []):
for url in url_list:
if get_top_domain(url) == get_top_domain(self.start_parsed.host) \
and (not str(url) in self.log or not str(url) in self.__horizon):
valid_list.append(str(url))

self.__horizon.update(valid_list)

它永远运行。我应该如何确保消除重复链接?

最佳答案

改编自 Giogian 的代码:

class Crawler(object):
def __init__(self, url, query, dir=os.path.dirname(__file__)):
self.visited = set()
# Rest of code...

def start(self, depth=5, url='/'):
if url in self.visited:
return True
self.visited.add(url)

defaultdict 是一个具有默认值的字典,如果索引不存在则使用该默认值。然而,这是错误的解决方案。如我的代码所示,集合会更高效、更优雅。

一组使用 O(1) 时间 - 与@Giorgian 的回答一样快。

使用 Ctrl-C 可以在程序处于无限循环时中断它。这将打印一个 Traceback,显示程序中断时正在执行的命令。这样做几次,您应该清楚它发生的位置。或者,使用调试器并在它处于无限循环时暂停并使用“步”功能运行到下一行执行,以便您可以跟踪程序的执行。 PyCharm 是一个很棒的编辑器,包含一个调试器。它有很好的自动补全功能,而且各方面都很好。它是免费的,请查看。

关于python - 看不到无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38840970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com