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

优采云 发布时间: 2021-09-21 12:11

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

  Python爬虫4.2-Ajax[动态网页数据]使用教程

  概述

  本系列文档用于学习Python爬虫技术的简单教程。在巩固你的技术知识的同时,如果它碰巧对你有用,那就更好了

  python版本为3.7.4

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

  因此,如果您遇到这样的页面,您无法通过直接使用请求和其他库获取原创页面来获得有效的数据。此时,您需要分析web页面后台发送到接口的Ajax请求。如果可以使用请求来模拟Ajax请求,就可以成功地捕获它们

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

  Ajax介绍了Ajax是什么

  Ajax(异步JavaScript和XML)异步JavaScript和XML。通过与后台服务器的数据交换,AJAX可以实现web页面的异步更新,这意味着可以在不重新加载整个web页面的情况下更新部分web页面。如果一个传统的网页(没有Ajax)需要更新内容,它必须重新加载整个网页,因为传统的数据传输格式使用XML语法,所以称为Ajax。事实上,受限数据交互基本上使用JSON和Ajax加载的数据。即使使用JS将数据呈现给浏览器,在查看网页源代码时也无法看到通过Ajax加载的数据,只能看到使用此URL加载的HTML代码

  示例说明

  浏览网页时,我们会发现许多网页有更多的选择。例如,微博、今日头条以及其他内容都是根据鼠标下拉菜单自动加载的。这些实际上是Ajax加载的过程。我们可以看到,页面尚未完全刷新,这意味着页面的链接没有变化,但网页中有更多的新内容,这意味着获取新数据并通过Ajax呈现的过程

  请求分析

  使用ChromeDeveloper工具的过滤功能过滤掉所有Ajax请求,这里不再详细解释

  fiddler数据包捕获工具也可用于数据包捕获分析。这里不解释fiddler工具的使用。您可以在Internet上搜索和查看它

  Ajax的响应结果通常是JSON数据格式

  采集方法直接分析Ajax使用的接口,然后请求该接口通过代码获取数据(下面的示例就是这样一种方法)。使用selenium+chromedriver模拟浏览器行为并获取数据(稍后文章继续)。这种方法的优点和缺点

  分析接口

  可以直接请求数据,而无需进行一些解析。代码量小,性能高

  分析接口比较复杂,特别是一些通过JS混淆的接口。你应该有一定的JS知识,这很容易被爬虫发现

  硒

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

  大量代码和低性能

  示例说明

  让我们以知乎对“作为一名高价值程序员的经历是什么?”这个问题的所有答案为例。示例代码如下所示:

<p># 引入所需库

import json

import requests

# 声明定义请求头

header = {

&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) &#39;

&#39;AppleWebKit/537.36 (KHTML, &#39;

&#39;like Gecko) Chrome/67.0.3396.99 &#39;

&#39;Safari/537.36&#39;,

&#39;Host&#39;: "www.zhihu.com",

&#39;Referer&#39;: "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)[&#39;paging&#39;][&#39;totals&#39;])

offset = 0

while offset

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线