抓取动态网页(Python爬虫4.2—ajax[动态网页数据]用法教程综述)

优采云 发布时间: 2021-12-22 18:20

  抓取动态网页(Python爬虫4.2—ajax[动态网页数据]用法教程综述)

  Python爬虫4.2——ajax【动态网页数据】使用教程

  概括

  本系列文档用于给出Python爬虫技术学习的简单教程,巩固您的技术知识,同时,如果对您有所帮助就更好了。

  Python版本为3.7.4

  有时,当我们使用请求来获取页面时,我们得到的结果可能与我们在浏览器中看到的不同。在浏览器中可以看到正常显示的页面数据,但是使用requests得到的结果却看不到。这是因为获取的请求都是原创的 HTML 文档,浏览器中的页面是 JavaScript 处理数据后生成的结果。这些数据的来源有很多,可能是通过Ajax加载的,可能是收录在HTML中的,也可能是通过JavaScript和特定算法计算后生成的文档中的文档。

  因此,如果遇到这样的页面,可以直接使用requests等库来抓取原创页面,无法获取有效数据。这时候就需要从网页后台分析发送到界面的Ajax请求。如果可以使用requests来模拟ajax请求,那么就可以成功爬取。

  因此,在本文中,我们主要了解什么是 Ajax,以及如何分析和捕获 Ajax 请求。

  AJAX介绍什么是AJAX

  AJAX (Asynchronous JavaScript And XML) 异步 JavaScript 和 XML。通过后台与服务器协商的数据交换,Ajax 可以实现网页的异步更新,即不需要重新加载整个网页就可以更新网页的某一部分。如果需要更新传统网页的内容(不使用Ajax),则必须重新加载整个网页,因为传统的数据传输格式使用XML语法,所以称为Ajax。实际上,受限数据交互基本使用JSON,使用Ajax加载数据。即使使用JS,将数据渲染到浏览器,在查看网页源代码时,也看不到通过ajax加载的数据,只能看到这个。由 url 加载的 HTML 代码。

  示例说明

  在浏览网页时,我们会发现很多网页都有向下滚动查看更多选项的功能。比如微博、今日头条等,有的会根据鼠标下拉自动加载,这些其实就是ajax加载的过程。我们可以看到页面并没有完全刷新,也就是说页面的链接没有改变,但是页面中有新的内容,这就是获取新数据并通过ajax呈现的过程。

  请求分析

  使用 Chrome 开发者工具的过滤功能过滤掉所有的 Ajax 请求,这里不再详细说明。

  Fiddler抓包工具也可以用于抓包分析。Fiddler工具的使用方法这里不做说明,大家可以网上搜索查看。

  Ajax 响应结果一般为json 数据格式。

  获取方法直接分析Ajax使用的接口,然后通过代码请求这个接口获取数据(下面的例子就是这么一个普通)。使用Selenium + Chromedriver模拟浏览器行为获取数据(文章后面会继续介绍)。方式优缺点

  分析界面

  可直接请求数据,无需分析工作,代码量小,性能高。

  分析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js知识,发现很容易被爬取。

  硒

  直接模拟浏览器的行为,浏览器可以请求的也可以用selenium来请求,爬虫更稳定。

  代码量大,性能低。

  示例说明

  举个例子,爬取“做一个高颜值的程序员是什么感觉?”这个问题的所有答案。在 知乎 下。示例代码如下:

<p># 引入所需库

import json

import requests

# 声明定义请求头

header = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '

'AppleWebKit/537.36 (KHTML, '

'like Gecko) Chrome/67.0.3396.99 '

'Safari/537.36',

'Host': "www.zhihu.com",

'Referer': "https://www.zhihu.com/question/37787176"

}

def answer(url_):

"""

获取问题答案

:param url_:

:return:

"""

r = requests.get(url_, headers=header)

data = r.text

jsonobj = json.loads(data)

return jsonobj

# 问题答案接口地址

url = "https://www.zhihu.com/api/v4/questions/37787176/answers?include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%2Cis_recognized%2Cpaid_info%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%2A%5D.topics&limit=5&offset=0&platform=desktop&sort_by=default"

# 获取回答总数

answer_total = int(answer(url)['paging']['totals'])

offset = 0

while offset

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线