如何爬取JavaScript动态生成的内容?

  • Post category:Python

网络爬虫可以通过模拟浏览器的行为来获取JavaScript动态生成的内容。在具体实现中,我们可以参考以下步骤:

  1. 分析页面

首先需要对需要爬取的页面进行分析。具体包括查看页面源码中是否包含JavaScript代码以及通过Chrome等浏览器开发工具查看页面的DOM结构和XHR请求。

  1. 执行JavaScript代码

在浏览器中,JavaScript代码可以通过DOM API来直接操作页面元素。但在Python等非浏览器运行环境下,我们通常需要使用第三方库,如Selenium或Pyppeteer,来模拟浏览器环境。这些库可以自动执行JavaScript代码,并将结果返回给我们。

下面是一个使用Selenium爬取淘宝商品销量的示例:

from selenium import webdriver

browser = webdriver.Chrome()

url = 'https://s.taobao.com/search?q=%E6%89%8B%E6%9C%BA&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201016&ie=utf8'

browser.get(url)

# 执行JavaScript代码
sales = browser.execute_script("return Array.from(document.querySelectorAll('.deal-cnt')).map(e => e.innerHTML)")

print(sales)

browser.quit()

这段代码先创建了一个Selenium WebDriver,然后访问了淘宝的搜索页面。通过执行JavaScript代码,我们可以得到每个商品的销量信息。

  1. 解析页面

获取到JavaScript动态生成的内容后,我们需要对其进行解析。对于JSON格式的数据,常常使用内置库json来解析。而对于HTML页面,则可以使用像BeautifulSoup一样的解析库来提取其中的信息。

以下是一个使用Pyppeteer爬取知乎用户信息的示例:

import asyncio
from pyppeteer import launch
from bs4 import BeautifulSoup

async def main():
    # 创建一个Pyppeteer Browser对象
    browser = await launch()
    page = await browser.newPage()

    url = 'https://www.zhihu.com/people/gong-jie-64-1'
    # 发送网络请求
    await page.goto(url)
    # 执行JavaScript代码
    html = await page.content()

    soup = BeautifulSoup(html, 'html.parser')
    profile = soup.find('div', {'class': 'ProfileHeader-content'})

    print(profile.text)

    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

这段代码创建了一个Pyppeteer浏览器对象,并在其中加载了知乎用户公派(”https://www.zhihu.com/people/gong-jie-64-1″)的个人主页。然后我们获取了页面的HTML内容,并使用BeautifulSoup解析其中的内容,最终输出了用户的详细信息。