如何批量提取目标网页中存储的所有链接?
如何批量提取目标网页中存储的所有链接?
嘿,看你已经尝试了手动翻页面找链接,还用了BeautifulSoup,但没成功一次性把那100个左右的链接都提取出来对吧?我来帮你调整下代码,解决这个问题~
首先说下你之前代码的小问题:你是把整个<a>标签的HTML代码存进列表了,而不是提取里面真正的链接地址(也就是href属性的值),而且还没过滤掉那些没用的锚点链接(比如#开头的)。先给你修正后的BeautifulSoup版本代码,专门提取有效链接:
import requests from bs4 import BeautifulSoup # 目标网页地址 url = 'https://www.wohnungsbaugenossenschaften.de/gaestewohnung-finden/teilnehmende-genossenschaften' # 发送HTTP请求获取页面内容 response = requests.get(url) # 先检查请求是否成功 if response.status_code == 200: # 解析页面内容 soup = BeautifulSoup(response.text, 'lxml') # 用来存储有效链接的列表 valid_links = [] # 只遍历带有href属性的a标签,避免空标签 for a_tag in soup.find_all('a', href=True): link = a_tag['href'] # 过滤掉锚点链接和空链接 if not link.startswith('#') and link.strip() != '': # 把相对链接转换成完整的绝对链接 if not link.startswith('http'): link = requests.compat.urljoin(url, link) valid_links.append(link) # 输出结果 print(f"一共提取到{len(valid_links)}个有效链接") for idx, link in enumerate(valid_links, 1): print(f"{idx}. {link}") else: print(f"请求网页失败啦,状态码:{response.status_code}")
这段代码做了这些优化:
- 用
href=True筛选出真正带链接的a标签,跳过那些没有实际跳转地址的标签 - 自动过滤掉
#开头的锚点链接,这些不是你要的页面链接 - 把相对路径的链接转换成完整的绝对链接,这样复制出来就能直接访问
- 加了请求状态码判断,方便排查请求失败的情况
如果运行上面的代码还是没拿到那100个左右的链接,那大概率这些链接是动态加载的——也就是页面初始加载时没有,是通过JavaScript后续异步加载出来的。这时候requests就抓不到了,得用能模拟浏览器渲染的工具,比如Selenium。给你个示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By import time url = 'https://www.wohnungsbaugenossenschaften.de/gaestewohnung-finden/teilnehmende-genossenschaften' # 初始化Chrome浏览器(需要提前下载对应版本的chromedriver哦) driver = webdriver.Chrome() driver.get(url) # 等3秒让页面的动态内容加载完成(也可以用更精准的等待方式,比如等某个元素出现) time.sleep(3) valid_links = [] # 找到页面所有a标签 a_tags = driver.find_elements(By.TAG_NAME, 'a') for a_tag in a_tags: link = a_tag.get_attribute('href') # 过滤无效链接 if link and not link.startswith('#') and link.strip() != '': valid_links.append(link) # 输出结果 print(f"一共提取到{len(valid_links)}个有效链接") for idx, link in enumerate(valid_links, 1): print(f"{idx}. {link}") # 记得关闭浏览器 driver.quit()
Selenium会像真实用户一样打开浏览器,等页面的JavaScript加载完所有内容后再提取链接,这样就能抓到那些动态生成的链接了。不过要注意提前下载对应浏览器的驱动(比如Chrome的chromedriver),并配置好环境哦。
备注:内容来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

