如何修改Python爬虫代码以获取所有含image.png的网页列表?
修改代码实现包含image.png的网页列表生成
第一步:修正原代码的基础语法错误
原代码存在多处语法/拼写问题,先修正这些基础错误:
- 函数
getdata内代码缺少缩进,Python要求函数体必须缩进 request.get拼写错误,应为requests.getBeautifulSoup初始化需指定解析器(如html.parser),否则会抛出警告print(imgae_links)拼写错误,变量名应为image_links
修正后的基础代码片段:
import requests from bs4 import BeautifulSoup def getdata(url): r = requests.get(url) return r.text data = getdata("https://example.com") soup = BeautifulSoup(data, 'html.parser') # 匹配所有src以image.png结尾的图片(覆盖相对/绝对路径) image_links = soup.find_all('img', {'src': lambda x: x and x.endswith('image.png')}) print(image_links)
第二步:添加网页遍历逻辑,实现"所有包含image.png的网页"收集
原代码仅检查单个页面,要生成目标列表,需要构建简单爬虫遍历站点内的网页:
- 用集合维护已访问URL,避免重复爬取
- 提取页面中所有
<a>标签的链接,将相对路径转为绝对URL - 对每个页面检查是否包含
image.png - 收集符合条件的URL并输出
完整修改后的代码:
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse def getdata(url): try: r = requests.get(url, timeout=5) r.raise_for_status() # 抛出HTTP请求错误 return r.text except requests.exceptions.RequestException: return "" def find_pages_with_image(base_url, target_image="image.png"): visited = set() queue = [base_url] matching_pages = [] while queue: current_url = queue.pop(0) if current_url in visited: continue visited.add(current_url) page_content = getdata(current_url) if not page_content: continue soup = BeautifulSoup(page_content, 'html.parser') # 检查当前页面是否包含目标图片 has_target_image = soup.find('img', {'src': lambda x: x and x.endswith(target_image)}) if has_target_image: matching_pages.append(current_url) print(f"找到包含图片的页面: {current_url}") # 提取页面中所有链接,转为绝对URL for link in soup.find_all('a', href=True): href = link['href'] absolute_url = urljoin(base_url, href) # 仅爬取同一域名下的页面 if urlparse(absolute_url).netloc == urlparse(base_url).netloc: if absolute_url not in visited and absolute_url not in queue: queue.append(absolute_url) return matching_pages # 替换为你要爬取的站点根URL base_url = "https://example.com" result = find_pages_with_image(base_url) print("\n所有包含image.png的页面列表:") for page in result: print(page)
关键修改说明
- 增加异常处理,避免单个请求失败导致程序崩溃
- 使用
urljoin处理相对路径,确保链接为绝对URL - 限制爬取同一域名下的页面,避免无差别爬取
- 用队列实现广度优先遍历,用集合去重已访问页面
- 改用lambda表达式匹配img的src,覆盖
image.png、/image.png、../image.png等多种路径情况
内容的提问来源于stack exchange,提问作者Chras
相关产品推荐
相关产品推荐

