Python 抓取动态网页内容方案详解


Posted in Python onDecember 25, 2014

用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字。如下所示:

import urllib2

url="http://mm.taobao.com/json/request_top_list.htm?type=0&page=1"

up=urllib2.urlopen(url)#打开目标页面,存入变量up

cont=up.read()#从up中读入该HTML文件

key1='<a href="http'#设置关键字1

key2="target"#设置关键字2

pa=cont.find(key1)#找出关键字1的位置

pt=cont.find(key2,pa)#找出关键字2的位置(从字1后面开始查找)

urlx=cont[pa:pt]#得到关键字1与关键字2之间的内容(即想要的数据)

print urlx

但是,在动态页面中,所显示的内容往往不是通过HTML页面呈现的,而是通过调用js等方式从数据库中得到数据,回显到网页上。以发改委网站上的“备案信息”(http://beian.hndrc.gov.cn/)为例,要抓取此页面中的某些备案项目。例如“http://beian.hndrc.gov.cn/indexinvestment.jsp?id=162518”。

那么,在浏览器中打开此页面:

Python 抓取动态网页内容方案详解

相关信息都显示的很全了,但是如果按照之前的办法:

up=urllib2.urlopen(url)

cont=up.read()

就抓取不到上述内容了。

我们查看一下这个页面对应的源码:

Python 抓取动态网页内容方案详解

由源码可以看出,这个《备案确认书》属于“填空”形式的,HTML提供文字模板,js根据不同的id提供不同的变量,“填入”到文字模板中,形成了一个具体的《备案确认书》。所以单纯抓取此HTML,只能得到一些文字模板,而无法得到具体内容。

那么,该如何找到那些具体内容呢?可以利用Chrome的“开发者工具”来寻找谁是真正的内容提供者。

打开Chrome浏览器,按下键盘F12即可呼出此工具。如下图:

Python 抓取动态网页内容方案详解

此时选中“Network”标签,在地址栏中输入此页面“http://beian.hndrc.gov.cn/indexinvestment.jsp?id=162518”,浏览器会分析出此次响应的全过程,而红框内的文件,就是此次响应中,浏览器和web后端的所有通信。

Python 抓取动态网页内容方案详解

因为要获得不同企业对应的不同信息,那么浏览器发送给服务器的请求里面一定会有一个和当前企业id有关的参数。

那么,参数是多少呢?URL上有,是“jsp?id=162518”,问号表示要调用参数,后面跟的是id号即是被调用的参数。而通过对这几个文件的分析,很显然,企业信息存在于“indexinvestment.action”文件中。

Python 抓取动态网页内容方案详解

然而,双击打开此文件并不能获得企业信息,而是一堆代码。因为没有对应的参数为它指明要显示第几号的信息。如图:

Python 抓取动态网页内容方案详解

那么,应该如何将参数传递给它呢?这时我们仍旧看F12窗口:

Python 抓取动态网页内容方案详解

“Header”一栏中明确地显示出了此次响应的过程:

对目标URL,用POST的方式,传递了一个id为162518的参数。

我们先手工操作一下。js是如何调用参数的呢?对,上面说过:问号+变量名+等号+变量对应的数字。也就是说,向“http://beian.hndrc.gov.cn/indexinvestment.action”这个页面提交id为162518的参数时,应该在URL后面加上

“?id=162518”,即

“http://beian.hndrc.gov.cn/indexinvestment.action?id=162518”。

我们把这个URL粘贴到浏览器中来看:

Python 抓取动态网页内容方案详解

似乎有了点内容,可是都是乱码啊,怎么破?熟悉的朋友可能一眼就看出来,这是编码的问题。是因为响应回来的内容与浏览器默认的编码方式不同。只需要在Chrome右上角菜单——更多工具——编码——“自动检测”即可。(其实这是UTF-8的编码,而Chrome默认的是中文简体)。如下图:

Python 抓取动态网页内容方案详解

好了,真正的信息源已经被挖出,剩下的就是用Python处理这些页面上的字符串,然后剪切、拼接,重新组成新的《项目备案书》了。

再然后使用for、while等循环,批量获取这些《备案书》。

正如“不论是静态网页,动态网页,模拟登陆等,都要先分析、搞懂逻辑,再去写代码”所说,编程语言只是一个工具,重要的是解决问题的思路。有了思路,再寻找趁手的工具去解决,就OK了。

Python 相关文章推荐
python实现bitmap数据结构详解
Feb 17 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
Python中的groupby分组功能的实例代码
Jul 11 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 Python
三个python爬虫项目实例代码
Dec 28 Python
python学生管理系统的实现
Apr 05 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
Python装饰器如何实现修复过程解析
Sep 05 Python
Python实战之用tkinter库做一个鼠标模拟点击器
Apr 27 Python
利用Psyco提升Python运行速度
Dec 24 #Python
Python解决鸡兔同笼问题的方法
Dec 20 #Python
Python列表计数及插入实例
Dec 17 #Python
Python二维码生成库qrcode安装和使用示例
Dec 16 #Python
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 #Python
Python 正则表达式(转义问题)
Dec 15 #Python
python正则表达式中的括号匹配问题
Dec 14 #Python
You might like
PHP截取中文字符串的问题
2006/07/12 PHP
javascript 写类方式之七
2009/07/05 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
python开发中module模块用法实例分析
2015/11/12 Python
python 显示数组全部元素的方法
2018/04/19 Python
set在python里的含义和用法
2019/06/24 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
餐厅总经理岗位职责
2013/12/31 职场文书
公务员转正鉴定材料
2014/02/11 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
幼儿园运动会口号
2014/06/07 职场文书
2015年工会工作总结
2015/03/30 职场文书
企业战略合作意向书
2015/05/08 职场文书
Mysql Show Profile
2021/04/05 MySQL
python神经网络编程之手写数字识别
2021/05/08 Python
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
instantclient客户端 连接oracle数据库
2022/04/26 Oracle