AJAX学习

AJAX=Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。通俗来说,AJAX是一种无需加载整个网页的情况下,通过在后台与服务器进行少量数据交换,更新部分网页的技术,用于创建快速动态网页的技术。

向服务器发送请求与服务器的响应

发送请求可以利用XMLHttpRequest对象的open()和send()方法。

方法 描述
open(method,url,async) 规定请求的类型、URL 以及是否异步处理请求。method:请求的类型;GET 或 POST;url:文件在服务器上的位置;async:true(异步)或 false(同步)
send(string) 将请求发送到服务器。string:仅用于 POST 请求

服务器的响应需要使用XMLHttpRequest对象的responseText或responseXML属性。

属性 描述
responseText 获得字符串形式的响应数据。
responseXML 获得 XML 形式的响应数据。

下面有一段简单的代码:

<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
} xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
if(xmlhttp.status==404)
{
document.write("The file doesn't exist.");
}
}
xmlhttp.open("POST","/ajax/demo.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");
}
</script>
</head>
<body> <h2>我的一个测试案例</h2>
<button type="button" onclick="loadXMLDoc()">发出请求</button>
<div id="myDiv"></div> </body>
</html>

可以在w3wschool测试网站看到相应的用法。

代码中有xmlhttp.onreadystatechange=function(),其中的onreadystatechange是一个事件,意思为当readyState发生改变时,onreadystatechange事件会自动触发。下面是XMLHttpRequest对象的三个重要的属性:

属性 描述
onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化;1: 服务器连接已建立;2: 请求已接收;3: 请求处理中;4: 请求已完成,且响应已就绪
status 200: "OK";404: 未找到页面

网络爬虫相关

python角度分析AJAX

下面我们从python爬虫的角度对AJAX进行思考,可以分为发送请求->解析内容->渲染网页三个步骤。其中发送请求,是使用javascript的代码进行实现,新建了XMLHttpRequest对象,然后利用onreadystatechange属性设置了监听,然后再用open()和send()方法发送请求,而我们在python中是请求后直接可以得到响应结果。解析内容是在发送请求并收到服务器的响应后,onreadystatechange事件又再一次被触发,此时利用xmlhttp的responseText属性就可以获取响应的内容。类似于 Python 中利用 Requests向服务器发起了一个请求,然后得到响应的过程。那么返回内容可能是 HTML,可能是 Json,接下来只需要在方法中用 JavaScript 进一步处理即可。最后一个步骤是渲染网页,我们都知道javascript可以更改网页内容,而代码中document.getElementById().innerHTM这样的操作就是对某个元素内的源代码进行更改,这样网页显示的内容就发生了改变;这是对Document网页文档进行了操作,即DOM操作。在python中我们同样的也是利用beautifulsoup库解析了网页后,查找其中的节点然后进行提取,AJAX只不过在对应的节点处更改为服务器返回的内容,这样原网页的代码量很少,但是渲染的时候是通过服务器的响应进行渲染的。

AJAX分析

首先我们在浏览器中进入F12开发者模式,进入存储并刷新一个页面(这里以用FireFox打开微博为例),会出现很多请求,这实际上就是在页面加载过程中浏览器与服务器之间发送 Request 和接收 Response 的所有记录。



而AJAX请求类型为xhr,可以看到有下面3条请求,我们随便点进去一个进行查看:



而我们所有请求的第一个则是网页的源代码,基本上只是写出了节点,没有渲染的代码。当我们加载新内容的时候,会出现新的AJAX请求,比如笔者这里提供三个请求地址:

https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1005052145291155

https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1076032145291155

https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1076032145291155&page=2

每次更新都会有新的请求。所以我们需要利用python来实现AJAX请求的模拟,从而实现数据的抓取。

Python提取AJAX数据

首先分析一下上面笔者列出的三个请求地址,发现地址都包含有type、value、containerid与page,前两个地址加上page=1也是可以请求的,浏览器自动省略了而已。观察一下这些请求,发现它们的 type、value、containerid 始终如一。type 始终为 uid,value的值就是页面的链接中的数字,其实这就是用户的 id,另外还有一个containerid,经过观察发现它就是 107603 然后加上用户id。所以改变的值就是 page,很明显这个参数就是用来控制分页的,page=1 代表第一页,page=2 代表第二页,以此类推。



那么我们只需要以这些参数作为请求参数请求然后抓取json数据就行了。

Python网络爬虫(三)的更多相关文章

  1. 【Python网络爬虫三】 爬去网页新闻

    学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...

  2. 【Python网络爬虫三】 爬取网页新闻

    学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...

  3. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...

  4. 第三次作业-MOOC学习笔记:Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 第一周 Requests库的爬 ...

  5. python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]

    前言 hello,大家好 本章可是一个重中之重,因为我们今天是要爬取一个图片而不是一个网页或是一个json 所以我们也就不用用到selenium模块了,当然有兴趣的同学也一样可以使用selenium去 ...

  6. 第三次作业-Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 过程. 5.写一篇不少于100 ...

  7. Python网络爬虫

    http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...

  8. Python网络爬虫笔记(五):下载、分析京东P20销售数据

    (一)  分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1.      翻页的时候,谷歌F12的Network页签可以看到下面 ...

  9. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

随机推荐

  1. ACM学习历程—UESTC 1215 Secrete Master Plan(矩阵旋转)(2015CCPC A)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1215 题目大意就是问一个2*2的矩阵能否通过旋转得到另一个. 代码: #include <iostre ...

  2. ACM学习历程—HDU 3915 Game(Nim博弈 && xor高斯消元)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所 ...

  3. Core Data存储数据出错(This NSPersistentStoreCoordinator has no persistent stores (unknown))

    Core Data存储数据的时候崩溃,崩溃信息: reason: 'This NSPersistentStoreCoordinator has no persistent stores (unknow ...

  4. "_OBJC_CLASS_$_ALAssetsLibrary", referenced from:和clang: error: linker command failed with exit code 1 (use -v to see invocation)错误

    在项目中使用MWPhotoBrowser未导入ALAssetsLibrary类库时会导致编译时出现异常: "_OBJC_CLASS_$_ALAssetsLibrary", refe ...

  5. Oracle 12C 新特性之级联truncate

    12c之前的版本中,在子表引用一个主表以及子表存在记录的情况下,是不提供截断此主表操作的.而在 12c 中的带有 CASCADE 操作的TRUNCATE TABLE 可以截断主表中的记录,并自动对子表 ...

  6. 使用Visual Studio进行单元测试-Shim类中无法找到参数包含CancellationTokenSource的方法

    Shim类中无法找到参数包含CancellationTokenSource的方法,这句话有点绕口,看例子. 一.代码 public class CancellationDemo { public in ...

  7. bzoj 3157 & bzoj 3516 国王奇遇记 —— 推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3157 https://www.lydsy.com/JudgeOnline/problem.p ...

  8. Nuget:目录

    ylbtech-Nuget:目录 1.返回顶部 1. https://www.nuget.org 2. https://docs.microsoft.com/zh-cn/nuget/ 3. https ...

  9. Ubuntu14.04如何用root账号登陆系统

    在虚拟机VMWARE中安装完Ubuntu后,只能用新建的普通用户登陆,很不方便做实验:那如何用root用户登陆账号呢? (1)用普通账号登陆,打开终端terminal: (2)在terminal的输入 ...

  10. Java 数据类型间的相互转化

    Java中常见基本数据类型包括(String除外[引用]) Date(int year,int month,int day,int hour,int minute,int sec); String 格 ...