python网络爬虫 post请求 状态代码302_网络爬虫 – 从面子到里子

6328232c2dc8cdfb263594b45390b9d3.png

免责声明:文章内容仅为个人技术思考,不作任何形式的技术推荐或商业推广。

网络爬虫作为当下热门的技术手段之一,被越来越多的数据型用户视为重要的信息获取方法。本文将从预备知识、技术原理两方面以个人视角介绍该技术途径。

1.重识网页

1.1 HTML基础概念

提到爬虫就不得不从网页这个熟悉又陌生的预备知识开始。一般用户浏览网页时仅关心输入网页地址后窗口显示的图形页面信息,但熟悉互联网知识的用户都知道网页实际上是由一系列HTML代码构成(严格来说包含HTML-网页内容CSS-网页布局JavaScript-网页行为),浏览器不过是将其图形化方便用户使用,其二者表达的信息是完全一致的。

用浏览器随便打开一个网页,使用Web查看器(快捷键F12)便可看到当前页面的HTML源码,网页中每个您能看到的元素都有一段带有“标签”的HTML代码与之对应(形如<div class=… id=…>…</div>)。我们甚至可以通过修改该代码,来立刻改变页面显示的内容。

50f23a9cd5777233a13b9a50b0ac8f11.png

每个难以入眠的夜晚,您都可以打开商城,把自己想买的东西价格改为¥9.90,然后安然入睡。但梦终究是会醒的,刷新页面后一切如初。这一切理所当然的同时也引出下一话题:网页是通过什么流程才呈现在我们面前的。

1.2 网页交互方式

一般而言,用户在浏览器地址栏输入网页的地址,确认后等待页面加载完成便可直接使用。但背后实际的运作要略显复杂,我们使用的网址称为URL统一资源定位符-对可从互联网上得到的资源的位置和访问方法的一种简洁表示),浏览器通过URL向服务器发出请求(POST/GET),服务器确认请求正确后返回数据包(HTML/JSON/CSS/…),最后浏览器解析数据为图形窗口供用户使用。

4bcfebb02f47ca0c6067b55a7f54749d.png

一般打开网页后,使用Web查看器(快捷键F12),选择“网络”栏,我们就可以看到浏览器与服务器的交互过程(如没有信息可刷新页面)。其中,POST为修改请求,用于向服务器提交数据以修改部分页面信息(账号登录…);GET为查询请求,用于获取服务器数据但不能修改(搜索关键字…)。

7878953d5cebbf502884caf2065c228e.png

在上述示例中,我在搜索栏输入关键字“爬虫技术”并执行,浏览器将这个行为按电脑当前的真实状态包装为GET请求并发送给服务器HOST,服务器正常响应后返回了我需要的搜索结果页面。选中对应的GET指令,可在右侧看到该指令的详细信息。

1.3 静态与动态

按照原计划,预备知识铺垫至此足以应付使用需求,但个人在实际项目中踩过一些坑(缺乏网络知识所致),故在此补充分享一下该知识点。

一般而言,网页有静态、动态之分,静态页面内容为运营方预设,无论何人、何时、何地、何设备访问,页面内容完全一致(时不变性),其元素不能与用户交互。

而动态页面则是由程序(JavaScript程序)根据访问页面时的状态(账户、设备、时间、访问渠道…)实时计算生成的,页面内容可随用户操作动态更新(一般以JSON数据格式反馈执行结果)。两者在应用层面并不矛盾,可根据应用场景灵活使用。

现在的网站对功能性要求较高,大多使用动态网页实现。这在方便用户使用的同时也引出一个问题,网页元素并非一次性加载完毕后再显示出来,它们受元素对象(文本、图像、视频)、JavaScript程序运行顺序/速度(广告、登录)、网络情况影响,不同步的出现在浏览器中。

这对于普通用户来说无非是多等几秒或者干脆刷新,于使用效果而言无伤大雅,但对于爬虫用户是有隐患的(后面详解在此不赘述)。

综上所述,普通用户之所以能如此简单的浏览网页,是因为浏览器替我们完成了上述繁琐且难以理解的操作。而爬虫用户将不可避免地要以编写代码的方式人为参与到这个过程中,这也是为何介绍爬虫之前要对网页知识有所了解。

2.爬虫技术

结合上述预备知识,爬虫的技术路线便逐渐清晰起来,简单来说可分为:通过URL获取页面信息、解析页面内容、结构化存储备用。因个人偏好,我选择了Python3.7+PyCharm作为日常工作的平台。

2.1 获取原始页面

由于现在Python有诸多扩展库可以调用,获取页面信息已不是多难的事情,用户仅需要知道页面的URL并调用对应函数即可,函数会自动模拟向服务器发出GET请求的过程并返回页面数据。如果想做的更专业一点,可在请求时添加额外参数以获取更好的效果。如果一切顺利,我们会得到与浏览器Web查看器中一样的字符串,留存备用即可。

ae20f94cbc1cb785714d62942386f2ff.png

603ef2ef08497becc8387ac9b7242c39.png

此处需注意,通过这种方式的得到的数据大多为网页的静态部分,而动态部分要等待网页中的JavaScript程序执行完毕成功反馈JSON数据包后,才由浏览器解析补充到页面中。程序一般不会像人这样智能(或智障),执行时它只会接收请求时刻返回的静态数据,并不会等待之后的动态加载数据(可理解为第一次与服务器交互得到页面的静态内容+待执行的动态代码,动态加载已属于下一次交互行为,程序认为本次交互已结束直接返回结果),这可能导致获取的数据存在缺失。

解决这个问题会比较麻烦,需要额外编写代码以模拟动态加载过程获取JSON数据。虽然功能实现可依靠扩展库,但人工定位目标请求及其数据的过程实在曲折。

2.2 解析页面内容

上述方法获取的页面数据一般是一堆HTML代码,直接使用十分不便。好在有许多扩展库可以辅助我们在不必读懂HTML的前提下,通过“标签”来快速提取所需数据。前文提到过,网页中每个元素都用带“标签”的代码来描述。我们要做的就是人工查找待提取数据对应“标签”(形如<div>…</div>)及其属性(形如class=…、id=…),将其作为输入量通过库函数提取其信息即可。本例提取了标签为“h3”、属性class为“c-gap-bottom-small”的信息条目。

36b541dd1a8e6d522fbcd9a243b366b5.png

29961a7902642b564f8f75f23915f493.png

2.3 结构化存储

由于收集数据更多是为了支撑后续统计分析或建模,所以结构化的数据会大大减少后期的工作量。我个人常用DataFrame数据类型,它是一种支持索引/方法的结构化数据类型,便于和SQL、Excel、CSV等类型文件交互,提供诸多管理或分析数据的功能。诚然,结构化方法并非唯一选择,以上仅为个人习惯。

3611b6151fe122ee6cf10ce3d07c0b3e.png

3.结束语

爬虫技术的具体实现方法在领域内一直是边缘话题,不便于在公开渠道讨论。所以本文内容仅对爬虫技术中的关键点进行原理讨论。简言之,爬虫技术是一种利用代码模拟用户操作浏览器获取信息的过程,以实现批量化、自动化收集信息的技术手段。

换句话说,它是由“面子”到“里子”的过程。

由于本期内容非本人专业方向,讲解如有谬误还请多包涵。感谢您的阅读。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值