如何用Python抓取iframe内数据?Google框架页面爬取求助
嘿,我来帮你搞定这两个Python爬取的问题!
如何用Python抓取iframe内部的数据?
iframe本质就是在当前页面嵌入了另一个独立的网页,核心思路是找到这个嵌入页面的真实地址,再去请求它。分两种情况处理:
静态iframe(src直接可见)
如果iframe的src属性直接写在HTML里,用requests+BeautifulSoup就能轻松搞定:
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin # 替换成你要爬的原页面URL original_page_url = "你的原页面地址" # 第一步:获取原页面HTML,解析出iframe的src resp = requests.get(original_page_url) soup = BeautifulSoup(resp.text, "html.parser") iframe_tag = soup.find("iframe") if iframe_tag and "src" in iframe_tag.attrs: iframe_src = iframe_tag["src"] # 处理相对路径的情况,拼接成完整URL if not iframe_src.startswith(("http://", "https://")): iframe_src = urljoin(original_page_url, iframe_src) # 第二步:请求iframe对应的页面,拿到内部内容 iframe_resp = requests.get(iframe_src) print("iframe内部内容:\n", iframe_resp.text) else: print("页面里没找到有效的iframe标签哦")
动态加载的iframe(src由JS生成)
如果iframe的src是通过JavaScript动态渲染出来的,静态请求拿不到,这时候就得用无头浏览器模拟真实浏览器加载页面,比如selenium或者playwright。这里给个selenium的例子:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化浏览器(需要提前对应好ChromeDriver版本) driver = webdriver.Chrome() driver.get("你的原页面地址") try: # 等待iframe加载完成,切换到iframe上下文 iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "iframe")) ) driver.switch_to.frame(iframe) # 现在就能获取iframe内部的所有内容了 iframe_content = driver.page_source print("iframe内部内容:\n", iframe_content) finally: # 记得关闭浏览器 driver.quit()
抓取jobbnorge.no链接内容遇到Google框架限制的解决方案
你说的“Google框架内”大概率是指页面用了Google的reCAPTCHA反爬验证,或者内容依赖Google的JavaScript渲染,导致静态请求拿不到数据。给你几个可行的方案:
用无头浏览器模拟真实访问
静态请求绕不开JS渲染和验证,用playwright(比selenium更省心,自动管理驱动)模拟浏览器加载,能解决大部分动态内容和基础反爬问题:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头浏览器(headless=True就是不显示窗口,改成False可以看到浏览器操作) browser = p.chromium.launch(headless=True) page = browser.new_page() # 设置真实的User-Agent,避免被识别为爬虫 page.set_extra_http_headers({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" }) try: # 等待页面加载完成(networkidle表示网络请求稳定后再继续) page.goto("https://www.jobbnorge.no/en/available-jobs/job/148574/project-manager-researcher-translational-nk-cell-biology", wait_until="networkidle") # 这里可以根据页面结构提取具体内容,比如职位描述 job_description = page.locator(".job-description").inner_text() print("职位描述:\n", job_description) except Exception as e: print(f"抓取出错啦:{str(e)}") finally: browser.close()
检查网站是否提供官方API
很多招聘网站会开放API接口,直接调用API获取数据不仅更稳定,还不会触发反爬。你可以去jobbnorge的robots.txt(访问网站根目录下的robots.txt文件)看看有没有API相关的说明,或者找找他们的开发者文档,说不定能直接拿到结构化的数据,比爬页面高效多了。
反爬注意事项
- 别太频繁请求,每次请求后加个
time.sleep(2-3),避免被封IP - 如果多次请求被限制,可以试试用代理IP分散请求来源
- 尽量模拟真实用户的行为,比如随机的点击、滚动(用playwright可以实现),不要一上来就直接爬内容
内容的提问来源于stack exchange,提问作者Tran Tam
相关产品推荐
相关产品推荐

