本答案页包含 Python 分页与去重 的 4 道选择题、4 道填空题和 4 道输出预测题,每题都给出准确答案和简短解释。
答案已完整展示,建议先尝试作答,再用本页核对。第一次练习最好从互动练习页开始。
抓取时为什么要维护 visited 集合?
答案: 避免环和重复页面
为什么: visited 集合记录已经处理过的 URL。
哪个 deque 方法删除最左端元素?
答案: popleft()
为什么: popleft 从队首删除,为队列提供先进先出顺序。
为什么要设置最大页面数?
答案: 限制工作量,阻止抓取失控
为什么: 即使链接不断出现,页面预算也是简单的停止条件。
这段程序打印出什么?
from collections import deque
pages = {"/1": ["/2", "/a"], "/2": ["/b"]}
queue = deque(["/1"])
seen = []
while queue and len(seen) < 3:
url = queue.popleft()
if url in seen:
continue
seen.append(url)
queue.extend(pages.get(url, []))
print(seen)答案: ['/1', '/2', '/a']
为什么: 广度优先队列先访问 /1,再访问它的链接 /2 和 /a,到三个页面的预算时停止。
补全队列类型。
from collections import deque
queue = ____(["/1", "/2"])
print(queue.popleft())答案: deque
为什么: deque 支持高效 append 和 popleft 操作。
补全取出下一个 URL 的方法。
from collections import deque
queue = deque(["/1", "/2"])
print(queue.____())答案: popleft
为什么: popleft 从 deque 左端取出元素。
补全集合插入调用。
seen = set()
url = "/a"
seen.____(url)
print(len(seen))答案: add
为什么: Set.add 把 URL 记录为已访问。
补全成员判断。
seen = {"/a"}
url = "/a"
print(url in ____)答案: seen
为什么: 检查 visited 集合可以避免重复访问。
代码的输出结果是什么?
links = ["/a", "/b", "/a"]
print(list(dict.fromkeys(links)))答案: ['/a', '/b']
为什么: dict.fromkeys 在去重的同时保留首次出现顺序。
屏幕上会显示什么?
pages = {"/1": ["/2"], "/2": ["/3"], "/3": []}
queue = ["/1"]
seen = []
while queue:
url = queue.pop(0)
if url in seen:
continue
seen.append(url)
queue.extend(pages.get(url, []))
print(seen)答案: ['/1', '/2', '/3']
为什么: 队列按广度优先顺序访问每个页面一次。
这段代码会输出什么?
seen = set()
for url in ["/a", "/a", "/b"]:
seen.add(url)
print(len(seen))答案: 2
为什么: 集合包含两个唯一 URL。
运行结果是什么?
from urllib.parse import urlsplit, urlunsplit
parts = urlsplit("https://example.com/guide.html#top")
print(urlunsplit((parts.scheme, parts.netloc, parts.path, parts.query, "")))答案: https://example.com/guide.html
为什么: 把片段替换为空字符串会去掉 #top。
先试一遍题目
打开 Python 分页与去重 练习页,用即时反馈回答同样的 12 道题。