Python爬虫4.2

您所在的位置:网站首页 如何爬取网站动态数据 Python爬虫4.2

Python爬虫4.2

2024-07-12 03:11| 来源: 网络整理| 查看: 265

Python爬虫4.2 — ajax[动态网页数据]用法教程 综述AJAX 介绍什么是AJAX实例说明请求分析获取方式 实例说明其他博文链接

综述

本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。 Python 版本是3.7.4

有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样。在浏览器中可以看到正常显示的页面数据,但是使用requests得到的结果并没有。这是因为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直接模拟浏览器的行为,浏览器能请求到的,使用selenium也能请求到,爬虫更稳定。代码量多,性能低。 实例说明

下面我们就做一个实例,爬取知乎下问题“当一个颜值很高的程序员是怎样一番体验?”的所有答案。实例代码如下:

# 引入所需库 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3