抓取动态网页( 参考百度百科的介绍2.获取真实数据请求(组图))
优采云 发布时间: 2021-11-09 06:18抓取动态网页(
参考百度百科的介绍2.获取真实数据请求(组图))
动态页面爬取主题
本文档讨论如何抓取动态页面,包括如何发现真实的数据请求,以及如何构造和解析请求返回的结果。
1.什么是动态页面?
动态瀑布和ajax页面通常按需返回html和json。
旧的网站刷新时会返回页面的全部内容,但如果只更新一部分,可以大大节省带宽。这个方法叫做ajax,服务端向浏览器传输xml或者json,执行浏览器的js代码,在页面上渲染数据。因此,获取数据的真实url不一定显示在浏览器地址栏中,而是隐藏在js调用中。本质上,javascript发起一个新的隐藏http请求来获取数据。只要可以模拟,就可以像真实的浏览器一样获取所需的数据。参考百度百科介绍
2.获取真实数据请求2.1.Hawk自动获取动态请求
这些隐藏的请求可以通过浏览器抓包获取,但是需要熟悉HTTP请求的原理,不适合初学者。Hawk 简化了流程并使用自动嗅探。Hawk成为后端代理,拦截并分析所有系统级Http请求,过滤掉收录关键字的请求(基于fiddler)
搜索字符时,如果在当前页面找不到该关键字,Hawk 会提示“您要启用动态嗅探吗?” 这时候Hawk会弹出浏览器,打开它所在的网页。您可以将页面拖动到收录关键字的位置,Hawk 会自动记录并过滤收录该关键字的真实请求,搜索完成后,Hawk 会自动弹回。
2.2. 不能自动嗅探怎么办?
由于 Hawk 具有阻止功能,因此浏览器会认为它不安全。如何解决?
Hawk的底层嗅探是基于fiddler的,所以通过fiddler生成证书后导入chrome即可解决。方法可以参考这个文档:
设置 采集器 如下:
2.3.备注 有时候可以直接把URL复制到Hawk,运气好也能拿到数据。这是因为许多 网站 对待第一页和其他页面的方式不同。第一页的内容将与整体框架一起返回。但是页面的内容是通过ajax单独返回的。有时我为第一页做了很多XPath开发,但最后发现在其他页面上不能使用,主要是因为上面提到的问题(一脸迷茫)。因此,根据经验,建议在提出请求之前先转到其他页面。2.4.手动获取真实请求
即使嗅探失败也没关系。如果使用Chrome等浏览器,进入开发者工具(F12):
选择上角的network rollout,然后刷新网页,chrome会列出所有的请求,一般最上面的就是真正的请求:
点击查看源码,将所有文字复制到网页采集器,对应高级设置-请求参数。事实上,Hawk 也做了类似的操作。
3.请求构建4.数据后处理
获取返回的真实数据后,除了可以通过超级模式一步一步分析所需数据外,还可以通过手动方式更灵活地获取所需数据。
4.1.Json 处理
json是最常见的数据传输格式,也是一棵树。它收录键值对(字典)和数组。有关详细信息,请参阅文档。
第 1 步:使 Json 合法化
有时,网站传递的json不是很合法的json,有回调的地址返回的一些数据会是如下形式:
var datas=此处是json;
这时候就需要通过字符的首尾提取,或者正则表达式和字符串切分来提取真正合法的json。
第 2 步:将字符串转换为文档
上一步得到的结果还是一个字符串,需要转换成json。只需拖入 json 转换器即可。常见的json模式有3种,我们依次讲解。
类型 1:
数据可能在“数据”字段中。这里,json转换器应该选择“不转换”,转换器本身不执行任何操作,而是将json作为一个整体转移到新列中。
然后使用python转换器,在脚本内容中填写value['data']。value是当前列对应的内容,后面部分是获取它的数据。如果嵌套更深,则可能需要 value['data1']['data2']
{
'total':12
'data':
[
{ 'key':'value'}
{ 'key':'value'}
]
}
类型 2:
这种类型比较少见。它是一个纯键值对的字典。我们通常要做的操作是列出所有内部的键值对,比如添加两列key1和key2,内容为value。
方法很简单,json转换器选择“单文档”模式即可。不需要python转换器。
{
'key1':'value'
'key2':'value'
}
类型 3:
[{'key':'value'}{'key':'value'}]
json选择器选择“文档列表”模式,不需要python转换器。
那么,你看到了吗?json 和 python 转换器的三种工作模式都具有相同的含义。当你想处理一个数组时,选择一个文档列表,一个字典,然后选择一个文档。如果您想获得更多内部信息,请选择不转换。
4.2. json 在 Hawk 中的呈现问题
由于Hawk的可视化列表只能显示字符串和数字,而Json是一棵树,所以在Hawk中很难显示。稍后我们会考虑优化这个区域。
如果显示 System.Object[],则表示它是一个数组。如果显示 System.Generic.Dictionary...,则为字典。也就是文档。
这件作品的设计真的很烂,太不可思议了,普通人看不懂,也是我做的不好的地方。. . 希望能帮到大家。
4.3. 使用 python 转换器处理 Json
5.案例。5.1. 嗅探
我们以某政府网站的专利检索为例来说明如何使用: 示例图如下:
无论您单击哪种下拉菜单,网址都保持不变。我们可以断定这是一个ajax页面。现在的目标是通过一个分类号来获取它的中英文含义,比如D01B1/00,就是右边的内容:
我们启动Hawk,新建一个网页采集器,将刚才的一串URL复制到网页采集器的地址栏中,发现得到的数据根本不收录这些中文意思.
怎么做?
您可以使用嗅探。我们以天然或人造线或纤维为关键词,填写网页采集器的内容过滤器:
然后点击开始。然后单击浏览器上的下拉菜单以展开类别编号。发现Hawk已经成功嗅探了字段:
此时,打开请求属性,可以看到真实请求的相关信息:
这是一个Post请求,(真实地址)url是:
!searchChildrenOfClassifyNum.dopost 的内容是classifyNum=D01。有了这些,我们将此命名为 采集器 Patent Inquiry`,下一步就很容易了。
即使嗅探失败也没关系。如果使用Chrome等浏览器,进入开发者工具(F12):
选择上角的network rollout,然后刷新网页,chrome会列出所有的请求,一般最上面的就是真正的请求:
点击查看源码,将所有文字复制到网页采集器,对应高级设置-请求参数。事实上,Hawk 也做了类似的操作。
5.2.步骤 2:
这里简单介绍一下,可以新建一个数据清洗,生成所有要查询的专利号的ID。这相对容易。例如,拖入是从文本生成的:
然后拖拽合并多列,把这串ID转换成一列要发布的数据:
拖进去新增一列,因为要网页采集器访问真实数据的url,所以填写上面提到的真实地址:
见证奇迹的时刻到了,在url栏拖拽从爬虫切换到刚才,然后配置如下:
由于post数据需要从post列中读取,所以用方括号括起来,像这样[post]。
结果是这样的:
这是一个Json,所以我们拖拽转换成json到content列:并将生成方式改为单文档,因为这只是一个字典,而不是一个字典数组:
你会发现只有一列有值:
是一个数组。然后,拖入python转换器,将生成模式配置为文档列表:你想要的数据都有:
点评:虽然这种请求可以用Hawk来配置,但还是推荐使用python,灵活性更大