JS动态数据get不到?解决办法!

优采云 发布时间: 2023-05-05 00:54

  爬虫在数据获取中起着重要作用,但是在实际操作中,经常会遇到无法获取JS动态网页的数据的问题。这时候该怎么办呢?本文将针对这个问题,从以下八个方面进行详细讨论。

  一、分析网站结构

  在爬取网站数据之前,首先需要对网站进行分析。可以使用开发者工具查看网页源代码,找到需要的数据所在的标签和属性,并确定是否为JS动态生成的。

  例如,在某电商平台上爬取商品数据时,需要注意到商品价格、销量等信息是通过Ajax异步加载的。因此,在编写爬虫程序时,必须模拟Ajax请求才能获取到这些数据。

  二、使用Selenium模拟浏览器行为

  Selenium是一个自动化测试工具,可以模拟浏览器行为。通过Selenium可以加载JS动态生成的页面,并获取其中的数据。

  例如,在Python中使用Selenium模块可以实现以下代码:

  python

from selenium import webdriver

browser = webdriver.Chrome()

browser.get('http://www.example.com')

data = browser.find_element_by_xpath('//div[@class="data"]')

print(data.text)

  三、使用PhantomJS无界面浏览器

  PhantomJS是一个无界面浏览器,可以模拟浏览器行为,支持JS动态生成的页面。通过PhantomJS可以获取网页源代码、截屏等操作。

  例如,在Python中使用Selenium和PhantomJS可以实现以下代码:

  python

from selenium import webdriver

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

dcap = dict(DesiredCapabilities.PHANTOMJS)

dcap["phantomjs.71860c77c6745379b0d44304d66b6a13.settings.userAgent"]=(

"Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")

browser = webdriver.PhantomJS(desired_capabilities=dcap)

browser.get('http://www.example.com')

data = browser.find_element_by_xpath('//div[@class="data"]')

print(data.text)

  四、使用Requests-HTML库

  Requests-HTML是一个Python库,可以用于解析HTML和JS动态生成的页面。通过Requests-HTML可以获取网页源代码、CSS选择器、XPath等操作。

  例如,在Python中使用Requests-HTML可以实现以下代码:

  python

from requests_html import HTMLSession

session = HTMLSession()

r = session.get('http://www.example.com')

data =r.html.xpath('//div[@class="data"]')[0]

print(data.text)

  

  五、分析Ajax请求

  Ajax请求是在页面加载完成后,通过JavaScript向服务器发送请求获取数据的一种方式。在爬取数据时,需要分析Ajax请求,模拟发送Ajax请求,并解析返回的JSON数据。

  例如,在Python中使用requests库和json库可以实现以下代码:

  python

import requests

import json

url ='http://www.example.com/api/data'

params ={'71860c77c6745379b0d44304d66b6a13':1}

headers ={'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

response = requests.get(url, params=params, headers=headers)

data = json.loads(response.text)

print(data['data'])

  六、使用Pyppeteer库

  Pyppeteer是一个Python库,可以通过无头Chrome浏览器模拟用户交互,支持JS动态生成的页面。通过Pyppeteer可以获取网页源代码、截屏等操作。

  例如,在Python中使用Pyppeteer可以实现以下代码:

  python

import asyncio

from pyppeteer import launch

async def main():

browser = await launch()

page = await browser.newPage()

await page.goto('http://www.example.com')4ebe3b1ab3f5ac7efc0ef5cdca537b54= await page.querySelectorEval('div.data','node => node.textContent')

print(data)

await browser.close()

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

  七、使用Splash渲染服务

  Splash是一个JavaScript渲染服务,可以在服务器端渲染JS动态生成的页面,并返回HTML结果。通过Splash可以获取网页源代码、CSS选择器、XPath等操作。

  例如,在Python中使用requests库和json库可以实现以下代码:

  python

import requests

import json

url ='http://localhost:8050/render.html'

params ={'url':'http://www.example.com','wait':0.5,'html':1}

headers ={'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

response = requests.get(url, params=params, headers=headers)

data = response.json()

print(data['html'])

  八、总结

  对于JS动态生成的页面,爬虫抓取数据的难度相对较大。但是通过分析网站结构、使用Selenium模拟浏览器行为、使用PhantomJS无界面浏览器、使用Requests-HTML库、分析Ajax请求、使用Pyppeteer库、使用Splash渲染服务等方法可以解决这个问题。希望本文对爬虫工程师有所帮助。

  本文由优采云提供,如需了解更多关于爬虫和SEO优化的知识,欢迎访问我们的官网www.ucaiyun.com。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线