Python网络爬虫(三)

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数据就行了。

原文地址:https://www.cnblogs.com/yunlambert/p/8729419.html

时间: 2024-10-15 08:32:50

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

python网络爬虫三

request库七个方法详解 1. request方法 所有方法的的基础方法,三个参数:method,url,**kwargs. 1.1 method:请求方式 method参数共有七个可选的值,分别对应HTTP协议的七种操作: 对应的方法可以用request方法直接实现,也可以用封装好的request.get()等方法实现. 1.2 访问控制参数(可选) 1.params:字典或者字节序列,作为参数增加到URL中.不仅访问URL,还可以向服务器携带参数. 2.data:字典.字节序列或文件对象

[Python]网络爬虫(三):异常的处理和HTTP状态码的分类(转)

先来说一说HTTP的异常处理问题.当urlopen不能够处理一个response时,产生urlError.不过通常的Python APIs异常如ValueError,TypeError等也会同时产生.HTTPError是urlError的子类,通常在特定HTTP URLs中产生. 1.URLError通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生. 这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),

爬虫学习 Python网络爬虫第三弹《爬取get请求的页面数据》

爬虫学习 Python网络爬虫第三弹<爬取get请求的页面数据> 一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2. 二.由易到难的爬虫程序: 1.爬取百度首页面所有数据值 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #导包 4

Python网络爬虫

http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么

2017.07.28 Python网络爬虫之爬虫实战 今日影视2 获取JS加载的数据

1.动态网页指几种可能: 1)需要用户交互,如常见的登录操作: 2)网页通过js / AJAX动态生成,如一个html里有<div id="test"></div>,通过JS生成<divid="test"><span>aaa</span></div>: 3)点击输入关键字后进行查询,而浏览器url地址不变 2.想用Python获取网站中JavaScript返回的数据,目前有两种方法: 第一种方法

Python]网络爬虫

Originated From: http://blog.csdn.net/pi9nc/article/details/9734437#comments [Python]网络爬虫(一):抓取网页的含义和URL基本构成 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些

什么是Python网络爬虫?带你爬向顶峰

首先我们来介绍一下什么是Python网络爬虫,先大概了解一下关于Python网络爬虫的相关知识点. Python作为一门入门简单,功能强大的,库类完善的语言,身受广大猿友们的喜欢.本身对Python也是非常有好感的,所以时不时的逛逛有关Python的网站啥的.通过在各大Python学习群和论坛的学习,我发现学习Python的人大部分都对网络爬虫很感兴趣.下面给各位介绍下Python的学习流程,并且会给出对应的学习教程. 第一步--学习Python 不管你有没有编程语言基础,也不管你其他语言是多厉

python网络爬虫学习资料

第一:Python爬虫学习系列教程(来源于某博主:http://cuiqingcai.com/1052.html) Python版本:2.7 整体目录: 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库的高级用法 5. Python爬虫入门五之URLError异常处理 6. Python爬虫入门六之Cookie的使用 7. Python爬虫入门七之正则

Python网络爬虫基础知识学习

对Python有一些简单了解的朋友都知识Python编程语言有个很强大的功能,那就是Python网络爬虫(http://www.maiziedu.com/course/python/645-9570/),一提到Python,就会想到相关的Python爬虫和scrapy等等,今天就来简单认识学习Python爬虫的基础知识,有了一定的相关爬虫知识,以后学习scrapy.urllib等等知识时,会相对轻松些. 爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组