【发布时间】:2016-12-14 22:09:15
【问题描述】:
我正在尝试编写一个网络爬虫,但我被卡住了,因为我在代码中的某处看不到无限循环。
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)
它永远运行。我应该如何确保消除重复链接?
【问题讨论】:
-
“看不到无限循环”是什么意思?
-
@uoɥʇʎPʎzɐɹC 他不明白为什么他的代码会陷入无限循环。
-
与您的问题无关,但有一个建议:在
__init__中创建 PoolManager 并始终使用它以从中获得最大收益。 -
可能没有无限循环,程序只是运行了很长时间。粗略计算:如果每个爬取的页面包含 20 个链接(对于大多数网站来说是一个较低的估计值),则您必须加载 20^4=160K 个页面。以每页 10 毫秒计算,这将花费 4 多个小时。每页有 40 个链接,大约需要 70 个小时。等等。指数增长。当您将默认深度设置为 1 而不是 5 时会发生什么?
标签: python beautifulsoup web-crawler urllib3