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

 更新时间:2014年12月25日 08:59:33   投稿:hebedich  
这篇文章主要介绍了Python 抓取动态网页内容方案详解,首先通过Chrome的工具来进行分析,然后再使用python进行处理,最终得到我们需要的内容,非常的方便,这里也算是给大家提供一个思路

用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”。

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

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

复制代码 代码如下:

up=urllib2.urlopen(url)
cont=up.read()

就抓取不到上述内容了。

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

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

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

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

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

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

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

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

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

“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粘贴到浏览器中来看:

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

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

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

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

相关文章

  • Python正确调用 jar 包加密得到加密值的操作方法

    Python正确调用 jar 包加密得到加密值的操作方法

    这篇文章主要介绍了Python 正确调用 jar 包加密得到加密值的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Opencv+Python 色彩通道拆分及合并的示例

    Opencv+Python 色彩通道拆分及合并的示例

    今天小编就为大家分享一篇Opencv+Python 色彩通道拆分及合并的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python判断两个序列的成员是否一样的实例代码

    python判断两个序列的成员是否一样的实例代码

    在本篇文章里小编给大家整理了关于python判断两个序列的成员是否一样的实例代码,需要的朋友们参考下。
    2020-03-03
  • tensorflow2 自定义损失函数使用的隐藏坑

    tensorflow2 自定义损失函数使用的隐藏坑

    本文主要介绍了tensorflow2 自定义损失函数使用的隐藏坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • python的函数最详解

    python的函数最详解

    这篇文章主要介绍了详解python中各种的函数,是Python入门中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • 在keras 中获取张量 tensor 的维度大小实例

    在keras 中获取张量 tensor 的维度大小实例

    这篇文章主要介绍了在keras 中获取张量 tensor 的维度大小实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python Jupyter Notebook显示行数问题的解决

    Python Jupyter Notebook显示行数问题的解决

    这篇文章主要介绍了Python Jupyter Notebook显示行数问题的解决方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法

    详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法

    这篇文章主要介绍了详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • pytorch中节约显卡内存的方法和技巧

    pytorch中节约显卡内存的方法和技巧

    显存不足是很多人感到头疼的问题,毕竟能拥有大量显存的实验室还是少数,而现在的模型已经越跑越大,模型参数量和数据集也越来越大,所以这篇文章给大家总结了一些pytorch中节约显卡内存的方法和技巧,需要的朋友可以参考下
    2023-11-11
  • Python实现特定场景去除高光算法详解

    Python实现特定场景去除高光算法详解

    这篇文章主要介绍了如何利用Python+OpenCV实现特定场景去除高光算法,文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下
    2021-12-12

最新评论