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线程池的实现实例
Nov 18 Python
python字符串连接方式汇总
Aug 21 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
mac使用python识别图形验证码功能
Jan 10 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
python中pyplot基础图标函数整理
Nov 10 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中数字、字符与对象判断函数用法实例
2014/11/26 PHP
PHP如何使用Memcached
2016/04/05 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
原生小程序封装跑马灯效果
2020/10/21 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
初步解析Python中的yield函数的用法
2015/04/03 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
python实现解数独程序代码
2017/04/12 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
日语专业推荐信
2013/11/12 职场文书
高级销售求职信
2014/02/21 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
2014年人事部工作总结
2014/12/03 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书