在Python爬虫中,会遇到反爬虫机制。如需要正常的浏览器访问才会显示内容,即动态加载内容。在前面我写过利用Selenium来实现。但是配置比较麻烦。因此,这里介绍另外一种方法!

Python

利用Python+playwright来实现反爬虫。由于高版本的Python环境利用pip安装相关的模块,会提示报错。因此建议使用虚拟环境。

Selenium 爬虫参考文章《Python+Selenium 反爬虫实战》

创建虚拟环境

python3 -m venv biaoge #biaoge为虚拟环境的名字
source biaoge/bin/activate #激活虚拟环境

配置虚拟环境
接下来,我们需要在虚拟环境中,安装相关工具。

安装 playwright

pip3 install playwright

安装playwright

安装完成后,安装对应的浏览器(本地环境中没有浏览器可以安装,有的话可以忽略)

playwright install firefox


因为是在虚拟环境中安装,因此,对本地环境没有影响。

示例代码:

from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

# 使用 sync_playwright 上下文管理器
with sync_playwright() as p:
    # 启动 Firefox 浏览器
    browser = p.firefox.launch(headless=True)
    # 创建一个新的浏览器页面
    page = browser.new_page(
        user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    )

    # 打开目标网页
    page.goto('https://data.xxxx.cn/easyquery.htm?cn=A01&zb=A010G06&sj=202502')

    # 等待页面加载
    page.wait_for_load_state('networkidle')

    # 获取渲染后的 HTML
    html = page.content()
    soup = BeautifulSoup(html, 'html.parser')

    # 关闭浏览器
    browser.close()

    # 解析数据
    table_main = soup.find('table', id='table_main')
    if table_main:
        time_th = table_main.find_all('th')[1]
        time = time_th.find('strong').get_text(strip=True)

        tbody = table_main.find('tbody')
        data = []
        for tr in tbody.find_all('tr'):
            tds = tr.find_all('td')
            indicator = tds[0].get_text(strip=True).replace('\n', '')
            price = tds[1].get_text(strip=True)
            data.append((time, indicator, price))

        for item in data:
            print(f"时间: {item[0]}")
            print(f"指标: {item[1]}")
            print(f"价格: {item[2]}元/公斤\n")
    else:
        print("未找到表格数据")

效果:

注意事项

每次运行脚本,需要到虚拟环境中去。因此,最好建议是写一个脚本。

最后修改:2025 年 03 月 17 日
可怜可怜吧!正在沿街乞讨~