我正在尝试从网站上抓取文本。我使用简单的代码:requests.get(url_here)。我的代码直到最近才有效。现在,当我使用请求时,我收到一条消息,而不是获取网站的文本:
“该网站需要启用 JavaScript!您使用的浏览器不支持 JavaScript,或者已关闭 JavaScript。 “
我已验证我的浏览器确实启用了 JavaScript。有没有办法解决这个问题?
在 Mac 上使用 Jupyter 笔记本使用 Python 工作,供参考。
当网站依赖 JavaScript 来呈现其内容,而你使用
requests.get()
之类的库时,你只是在获取初始 HTML 源代码,它可能还没有你想要的文本。这是因为
requests
库不执行 JavaScript。
为了抓取需要 JavaScript 的网站,你需要一个可以执行 JavaScript 并呈现网页的工具,就像真正的网络浏览器一样。以下是两种流行的选项:
1. 使用无头浏览器(Headless Browser)
无头浏览器是在没有图形用户界面的情况下运行的网络浏览器,可以由程序控制。你可以使用它们来加载网站、运行 JavaScript 并提取呈现的内容。以下是一些流行的无头浏览器选项:
-
Selenium: Selenium 最初是用于网络应用程序测试的工具,但也非常适合网络抓取。它允许你控制一个真正的浏览器(如 Chrome 或 Firefox),让你可以像人类用户一样与网站进行交互。
```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup
url = '你的网站地址'
options = Options() options.add_argument('--headless=new') # 在无头模式下运行 Chrome options.add_argument('--disable-gpu') # 可选,用于无头模式
with webdriver.Chrome(options=options) as driver: driver.get(url) html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 现在你可以使用 BeautifulSoup 解析内容了 print(soup.get_text()) ```
-
Playwright: Playwright 是另一个强大的库,可以自动化 Chromium、Firefox 和 WebKit 浏览器。它以其速度、可靠性和跨浏览器支持而闻名。
```python from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup
url = '你的网站地址'
with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto(url) html = page.content() browser.close()
soup = BeautifulSoup(html, 'html.parser')
# 现在你可以使用 BeautifulSoup 解析内容了 print(soup.get_text()) ```
2. 使用渲染 JavaScript 的请求库
-
Requests-HTML: 如果你不想使用完整的浏览器,可以使用像
requests-html
这样的库,它提供了在进行请求时渲染 JavaScript 的功能。```python from requests_html import HTMLSession from bs4 import BeautifulSoup
url = '你的网站地址'
session = HTMLSession() response = session.get(url)
# 渲染 JavaScript response.html.render()
soup = BeautifulSoup(response.html.html, 'html.parser')
# 现在你可以使用 BeautifulSoup 解析内容了 print(soup.get_text()) ```
选择正确的方法
- 如果你需要与网站进行复杂的交互,例如点击按钮、填写表单或与动态内容交互,那么 Selenium 或 Playwright 等无头浏览器是更好的选择。
-
如果你只是需要渲染 JavaScript 来获取最终的 HTML 内容,那么
requests-html
可能是一个更轻量级的选择。
请记住,使用这些技术时要小心,并尊重网站的
robots.txt
文件,以避免给其服务器造成过大的负担。