Python如何爬取动态网页内容?使用curl和wget获取静态HTML无法获取部分内容

我不 duqiu 的,这个页面就遇到以往学习中没遇到过的情况。。
如:
http://www.310win.com/analysis/1659945.htm ,昨晚中国对伊朗的情况:

“对赛往绩”
“中国 近期战绩”
“伊朗 近期战绩”

网页上有其中三个这样的数据表格,关于表格的内容:

1、使用 cur 或者 wget 去获取 http://www.310win.com/analysis/1659945.htm ,默认获取的网页明文,是没有这样设计的三个表格的内容数据的。。。
2、同上,页面静态打开,“对赛往绩”是有“平均欧赔”,“竞赛让球”“竞赛胜平负”等等下拉菜单选项等等东西,默认获取的网页明文,连这些下拉菜单的菜单内容都没有。。。
3、第一个问题:python 如何获取这些内容?
4、第二个问题,如果不确定表格下拉菜单有多少个(也许有可能根据不同的页面,有不同数量的菜单选择),python 如何逐步穷尽选择下拉菜单每一个,获取到每一个菜单选项都出现的内容?
Python如何爬取动态网页内容?使用curl和wget获取静态HTML无法获取部分内容


4 回复

1、2、3 是一个问题,你 wget 是下载的 html 初始化页面,你想拉取的是 js 渲染完后的 html,所以你下载和你浏览器里看到的页面内容不同
所以简单说,是你的思路方向错了,你去网上搜一下如何用 python 获取 js 渲染的网页内容就行,overflow 上应该有相关资料


对于爬取动态网页,用curlwget确实不行,因为它们只能拿到初始的静态HTML。动态内容通常是JS执行后通过Ajax请求数据再渲染出来的。你得用能执行JS的工具,比如Selenium或者Playwright,或者直接找到背后的API接口用requests去请求。

1. 直接找API(推荐,效率高) 很多动态网站的数据是通过Ajax请求从后端API获取的JSON数据。用浏览器的开发者工具(F12 -> 网络/Network -> XHR或Fetch),找到数据请求,然后直接用requests模拟这个请求。

import requests

url = 'https://example.com/api/data'  # 替换成你找到的真实API地址
headers = {
    'User-Agent': 'Mozilla/5.0',
    # 可能还需要其他headers,如Authorization、Referer等,从开发者工具里复制
}
params = {'page': 1}  # 根据API需要的参数填写
response = requests.get(url, headers=headers, params=params)
data = response.json()  # 假设返回的是JSON
print(data)

2. 用Selenium模拟浏览器 如果网站没有暴露清晰的API,或者数据渲染逻辑很复杂,就用Selenium控制一个真正的浏览器去加载页面,等JS执行完再拿HTML。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无头模式,不显示浏览器窗口
driver = webdriver.Chrome(options=options)

try:
    driver.get('https://example.com')
    # 等待某个动态元素出现,比如等一个class为"dynamic-content"的元素
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'dynamic-content'))
    )
    # 现在页面已经加载完动态内容了
    full_html = driver.page_source
    print(full_html)
finally:
    driver.quit()

3. 用Playwright(更现代的选择) Playwright比Selenium更新,对动态页面的处理通常更好。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto('https://example.com')
    # 可以等待特定请求或元素
    page.wait_for_selector('.dynamic-content')
    content = page.content()
    print(content)
    browser.close()

总结:优先找API直接请求,不行再用Selenium或Playwright这类浏览器自动化工具。

Phantomjs 渲染一次

from selenium import webdriver

回到顶部