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无法获取部分内容
1、2、3 是一个问题,你 wget 是下载的 html 初始化页面,你想拉取的是 js 渲染完后的 html,所以你下载和你浏览器里看到的页面内容不同
所以简单说,是你的思路方向错了,你去网上搜一下如何用 python 获取 js 渲染的网页内容就行,overflow 上应该有相关资料
对于爬取动态网页,用curl或wget确实不行,因为它们只能拿到初始的静态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

