当前位置:   article > 正文

qpython爬虫例子_小白自学者系列 | Python爬虫实战教程之爬取IPT案例 - 1

python 爬虫query string parameters current

这篇教程会和大家分享如何用Python爬取移民与保护法庭(IPT)网站上,过往的判例。因涉及内容较多,教程会分成几部分。这是第一篇。

学习效果展示

通过这个系列的教程,我期望读者可以:爬取到IPT中的判例的信息(https://forms.justice.govt.nz/search/IPT/Residence/),并生成类似下边格式的Excel文件保存到电脑本地,其中含有判例的标题、摘要、日期、引用的条例等自己需要的信息。将PDF格式的判例批量下载到电脑本地

将教程中的知识应用到其他场景,爬取其他不需要登录的网页内容。

具体来说,通过这篇教程及其中提供的外部链接,我预期读者能够:了解基本的网络知识:如client(客户端)、服务器(server)、request(请求)和response(回应)、HTTP Headers(头部)等

通过剩下的教程及其中提供的学习资源,我预期读者能够:了解如何安装Python及Python module(模块)

初步接触并了解如何使用requests模块爬取网络内容

了解如何使用Xlswriter模块把爬取到的内容保存到Excel格式的文件

了解如何使用urllib模块批量下载PDF文件到本地电脑

通过教程或文中提供的学习资源,掌握教程中出现的所有代码

所需知识及目标读者

这篇文章假设读者和我一样,没有接受过系统的电脑科学的教育,但有日常使用电脑的经验。

读者不需要学过Python,可以通过文章中给出的资源,自学相关概念及知识。

同时要求读者:有自学的意愿。限于篇幅,这些教程没法做到“手把手”教学,也无法事无巨细覆盖所有方面,实操中可能出现的问题也是层出不穷的。读者不可能只通过我的教程掌握所有相关内容。相反,如果是完全没有基础的读者,大概率需要通过文章中的外部链接和资源、花时间自学。所以有自学的意愿是重要的。

通常,读者还会遇到各种问题,这是所有自学者需要克服的困难。建议需要通过网络搜索等方式解决,这是自学者需要掌握的最重要的技巧之一。读者需要有基本的英语阅读能力。文中给出的资源都是英文(对的,Python和几乎所有其他编程语言的代码也是用英文写的)。英语是lingua franca、是机会的语言、也是通往海量的优质信息的大门。九年义务教育让我们花了六七年在学英语,不是没理由的。如果英语不好,可以在电脑上安装词典边查边看。要相信办法总比困难多。

有没有时间或精力、以前是不是读理科生等、英语有没有考过四级,这些是不重要的。有强烈意愿的人,会想办法克服这些困难。

读者需要的工具

电脑、Chrome浏览器、网络连接。

这篇文章假设读者使用Windows操作系统。使用Mac或Linux的,可通过搜索获得替代方案。

网络知识

在讲解如何用Python爬取网络之前,我们需要先讲解爬虫的原理,也就是基础的网络知识。我会用叫外卖的例子帮助读者理解。这个例子可能有不是太精准的地方,但大概可以把事情说清楚。

我们假设现在有个人叫小明,他要和附近一家“真香餐馆”叫外卖。他打电话,和餐馆要了一份叉烧拼鹅腿饭,让餐馆多淋一些酱汁,还要了一瓶盒装的维他奶(在这个例子里,请忘了外卖app的存在)。过一会,外卖员把外卖送到,他去把外卖拿回来。

上边是一个日常的例子。其实我们日常上网浏览网页的过程,和叫外卖是类似的。

实际发生的事情是:我们通过浏览器,和网站要(request)东西。这就像我们打电话给餐馆,说我们要点什么东西。

网站收到我们请求,就像餐馆接到我们电话,会按照我们要求,把我们要的东西送回来(比如文本、图片、视频),而这就像餐馆接单后准备外卖后送给我们的过程。

在计算机科学中,去请求要东西的一方,叫client(客户端),给回东西的一方,叫server(服务器端)。可以注意到,client的本意是客户,而server是由serve(服务)这个词变过来的)。Client和server的关系,有点像一个甲方和乙方、顾客和餐馆的关系:一方要东西,另一方提供东西。

打电话出去要东西这个过程,对应到网络中,我们会说是客户端发出请求(request)。餐馆把外卖送过来,对应的是服务器返回网页等内容给我们,返回的内容叫response。

注意:客户端可以是一个浏览器,也可以是其他东西。比如一段Python代码也可以向服务器发出请求(并接收服务器的回应)。

在客户端-服务器你来我往、你要我给的交流过程中,需要遵循一些共同的规则,以达到(高效)沟通目的。在互联网中,这些规则叫HTTP协议。细节可以见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview。

HTTP协议里很重要的一部分,就是客户端和服务器沟通时,需要提供一些必要的信息。比如最明显的,客户端需要和服务器说明自己想要的是什么东西、希望服务器以什么格式呈现这些信息。这就像小明叫餐时,他会说餐馆说明,自己要点什么、点几份、要不要加辣。

客户端发出请求时,可以通过几种形式,把这些信息给到服务器端,比如:Request headers(请求头部)

Query string parameter(查询字符串参数)

为了说明request headers和query string长什么样,我会用Chrome浏览器的开发者工具中的“网络”工具,给大家演示下。

首先我们用Chrome浏览器打开必应的网站(https://www.bing.com/)。在搜索框随便输入一个词,比如这里我输入spring。然后我们按右键 > Inspect,或按快捷键Ctrl + Shift + J。会看到下边截图红框中的窗口,这个就是我所说的开发者工具。

接着我们按右上方的Network,出现类似下边的界面。里边会记录我们所有的网络活动,包括请求和回应。我们勾选上Preserve Log,这样可以保留网络请求的记录。

如果你打开的Network视窗已经有类似下边的记录,可以按下图说明,清除已有的请求,以便于观察新发起的请求。

接着我们点击必应的搜索按钮( ),会看到Network窗口出现一堆东西。这些是浏览器的网络活动,包括发出去的请求和浏览器的回应。

我们拉到最上方,点下图中红框部分。这个是我们点击搜索按钮时,发出去的搜索请求及回应。点开后会出现右下角的视窗。

在右下角的视窗中,我们看到有Headers、Preview、Response等标签页。里边有我们的搜索请求和回应的信息。我们先重点关注其中的Headers。

从上往下看,Headers这个标签页有四个部分组成:General。关于请求和回应的基础信息

Request Headers。请求头部。

Response Headers。回应头部。

Query String Parameters。查询字符串参数

我们现在讲下其中的Request Headers和Query String Parameters。刚上边说了,客户端发出请求时,会带上一些信息,这些信息可以用request headers和query string的形式发出。

Request headers

客户端发出的请求所带的headers,即为request headers。我们上边的必应搜索请求的请求头部如下。

Headers是用复数,是因为其中还有很多一条条的header。这些header以配对的的键-值出现,比如上边截图里,加粗的部分是键,冒号后边是值。如:authority为键,http://www.bing.com为值。

Headers的作用不一,可以在网上搜索到,比如可以在下边这个网址查到:

我们仅举其中几条headers为例说明header的作用。比如accept这条header,是客户端告诉服务器,自己接受的回应的文件格式,比如请求要图片和PDF文档时,accept header就会有所不同。accept-language是告诉服务器,想接受什么语言的回应。服务器可以根据这些请求头,返回对应的不同格式或语言版本的回应。

而知道headers对于我们用Python爬取内容有什么意义呢?回答如下,我们用Python发出请求时,通常需要模拟请求头部信息,也就是构建上边这些头部,随请求一起发出去,以得到想要的特定的回应。另外,有的服务器有反爬措施,如果直接用代码发出请求,可能会被识别出是爬虫进而被屏蔽。我们通过让Python发出的请求中,带有和浏览器一样的头部,避免被识别出是爬虫。

Query string

接下来我们讲下query string。我们的必应搜索例子中的query string parameters如下,可以看出它们也是键-值配对的格式。如q为键,spring为值。

那这些query string又是做什么用的呢?简单来说,我们在和服务器互动时,经常需要和服务器查询、获取一些东西。比如用bing搜索spring这个词时,就是客户端和服务器“查询”spring相关的搜索结果。而查询字符串参数,可以看成是用于告诉浏览器,我们想要查询什么东西。有点像点餐时,和餐馆说自己想要点什么。

观察上边的参数,细心的读者可能已经看出来,query string中的第一个参数q,对应的值spring,即是我们刚才搜索的关键词。那客户端和服务器请求时,带上q这个参数,其作用很明显,就是告诉服务器,我们想要查询是关于spring的信息,这样服务器可以返回对应的查询结果。

这对于我们构建爬虫的意义,就是我们想和服务器抓取符合指定条件的信息时,可以模拟query string的参数,发出请求,服务器可以返回对应的内容。举个例子,比如我们想爬取豆瓣上对于对应《爱尔兰人》的影评(https://movie.douban.com/subject/6981153/reviews),会看到第一页只显示一部分影评。而当我们点第二页影评时,查询参数为start: 20,第三页为start: 40,那么我们可以很合理地推测:start参数值和页数的数学关系,为:页数 = start参数/20 +1。在用Python影评时,可以通过设置查询参数中的start的值,获取到对应不同页数的影评。第2页影评的query string

扩展知识

网络请求有不同的方法(method),最常见的有POST、GET。我们上边必应例子中的请求方法是GET。GET方法的特点就是查询参数可以在查询的网址中看到(而POST则不能)。比如我们看到,下边为请求链接,其中加粗部分是键,紧接着是=,=后边是值。不同的参数之间用&连接起来。直接点开下边链接,能看到spring的搜索结果。

这个对爬虫的意义在于,我们既可以通过设置请求参数,也可以通过构建对应的网址,直接获取想要的回应。我个人偏向于用设置请求参数的方式。

而在POST请求中,请求参数是不会反映在请求网址里的。这意味着,用POST请求爬取东西时,只能通过设置请求参数,获取想要的查询结果,不能通过构建网址的方式获得。更多内容可见:https://en.wikipedia.org/wiki/Query_string

应用到实例

下边把我们上边讲到的内容应用到我们要爬取的IPT网站。假设我们需要爬取技术移民类别下关于主厨(chef)的案例,我们可以先用浏览器获取请求头部,用在Python请求中。并观察查询字符串参数的特点,看下我们查询案例的条件,是如何对应到字符串中。

具体来讲,我们需要做的事情如下。

1.在IPT的查询页面中的Category中输入类别,这里选的是从2017年8月以前旧政策对应的技术移民案例:Skill Migrant (to 27/08/2017)。在Search Terms中输入搜索的关键词chef。后点Search。

2.通过开发者工具的Network,获取到请求头部如下,这里不细讲。

3.观察查询字符串参数,确定查询条件(即Category和Search Terms)和查询字符串参数之间关系。这个一般很容易发现,但有时需要大胆猜测小心求证。

观察上图,结合我们查询的条件和字符串命名,我们可以很合理地猜测,q这个参数值中的policycategoryiptlegacy或policycategory_s对应的是网页中的Category选中的内容。同样可看到chef也在其中,猜测这是Search Term对应的搜索关键词。

我们可以通过改变搜索的类别和Search Term,再对比下查询字符串参数的值的变化,验证我们的猜想。这些参数中,有些参数的作用比较容易猜到,有一些比较神秘,很难猜出来,比如hl和fl。实操证明,我们只需要依样画葫芦照抄这些参数即可。不知道他们作用并不影响我们爬取到想要的内容。

下一步

得到请求头部,以及知道怎么通过构建查询参数,获取想要的查询结果。我们可以进入到下一步,安装Python及Python模块,并使用requests模块爬取网页。我们会在后续教程中讲。

注:我不是计算机科班出身,这篇文章可能会有一些错漏的信息,还请读者包涵,行家指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/995347
推荐阅读
相关标签
  

闽ICP备14008679号