import asyncio
from playwright.async_api import async_playwright
async def scrape_liberty_times():
"""
使用 Playwright 爬取自由时报首页的新闻标题和链接。
"""
async with async_playwright() as p:
# Launch the Firefox browser in headless mode
browser = await p.firefox.launch(headless=False)
# 创建一个新页面
page = await browser.new_page()
try:
# 访问自由时报主页
print("正在访问自由时报网站...")
await page.goto("https://news.ltn.com.tw/list/breakingnews/world")
# 等待新闻列表加载完成。
# 这里我们使用一个 CSS 选择器,等待一个包含新闻链接的元素出现。
# 如果网站结构变化,你可能需要更新这个选择器。
# ul.list > li > a 这个完整的选择器所代表的含义是:“找到页面上所有 class 为 list 的 ul 元素,然后在其所有直接子元素 li 中,找到所有直接子元素 a
await page.wait_for_selector('ul.list > li > a')
# 定位所有新闻链接元素
# Playwright 的 `locator` 是获取元素的推荐方式,它会自动等待元素加载。
news_items = page.locator('ul.list > li > a')
# 获取元素总数,以便循环遍历
count = await news_items.count()
print(f"找到 {count} 篇新闻。")
# 遍历每个新闻元素并提取信息
for i in range(count):
item = news_items.nth(i)
title = await item.text_content()
link = await item.get_attribute('href')
# 打印提取到的标题和链接
print(f"标题: {title.strip()}")
print(f"链接: {link}")
except Exception as e:
print(f"爬取过程中发生错误: {e}")
finally:
# 确保浏览器在任何情况下都会被关闭
await browser.close()
print("浏览器已关闭。")
# 运行主函数
if __name__ == "__main__":
asyncio.run(scrape_liberty_times())