8.1 拉勾网网站分析
8.1.1 拉勾网网站页面初步分析
通过前面的学习,读者对如何使用 Requests 爬取一个网站、如何解析网页、如何应对网站反爬虫,以及如何爬取动态网页都有了一定的了解,这一章通过爬取拉勾网数据分析招聘岗位的例子,为读者综合演示从开始分析页面到遭遇反爬虫时的应对方法和实战技巧,把整个思考、测试的过程以接近实战的方式展示给读者,希望读者通过本章的学习,巩固前 7 章所学内容。同时,本章也为读者演示一些前面还没讲到和说明的编写爬虫的技巧,读者可以在看下面的内容之前,自己尝试去爬取一下拉勾网。
下面分析一下拉勾网网站,根据分析选择合适的爬取策略。打开拉勾网,然后以“数据分析”为关键词搜索相关的招聘职位,搜索结果如图 8-1 所示。
图 8-1 “数据分析”岗位的搜索结果
从图 8-1 左上角的“职位(500+)”可知,拉勾网上与数据分析相关的职位超过 500 个。把页面拉到最下面,可以看到页数和翻页情况,结果如图 8-2 所示。
图 8-2 搜索结果翻页情况
从翻页栏可知,搜索结果一共有 30 页,而每页仅仅显示 15 条招聘信息,也就是说拉勾网在搜索结果页面仅仅展示了 450 条招聘信息。如果想对数据分析相关招聘职位的要求、报酬、工作地点等做一个客观的分析,仅仅 450 条是明显不够的,应该如何处理呢?事实上,在很早之前,拉勾网要求必须登录才能查看和搜索其职位,而现在网站应该是改版了,也仅仅展示最近发布的 450 条招聘信息。如何才能抓取更多的数据以分析相关职位呢?
前面曾经提到过,如果网站有移动页面,推荐读者优先抓取移动页面。一般网站的移动页面网址是以 m 开头的子域名,拉勾网是有移动页面的,如图 8-3 所示。
图 8-3 拉勾网移动页面
从图 8-3 中可以看出拉勾网移动页面非常简洁,很有利于爬虫爬取。单击底部的“搜索”按钮,输入“数据分析”,按回车键,看一下搜索结果列表,拉到底部,可以看到一个“加载更多”的按钮,单击它可以再显示 15 个职位信息,如果不停地单击这个按钮,就会不断有新的数据被加载出来。很显然这是一个动态网页,单击“加载更多”按钮时,网页加载了新的数据,但是网页的 URL 并没有变化。现在读者肯定知道,这是因为在单击的时候发送了请求给服务器,服务器响应这个请求才显示了更多的数据。可以查看一下这个请求,并模仿它向服务器发送请求,从而获取新的数据。
打开 Chrome 浏览器,在空白处单击右键,在弹出的菜单中选择“检查”,然后单击“加载更多”,可以看到发送的请求,如图 8-4 所示。
图 8-4 加载数据发送的请求信息
从 8-4 图中可以看到 Request URL 为 http://m.lagou.com/search.json?city= %E5%85%A8%E5%9B%BD&positionName=%E 6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&pageNo=3&pageSize=15。
这个网址很长,可能刚开始不知它到底有什么含义,可以多加载几页看看,不难发现请求的网址都是上面的形式,仅仅 pageNo 的值在增加。由此可知,pageNo 代表所请求的页码,而 Size=15 代表每页显示的招聘岗位数,至于前面的参数 city 代表城市,positionName 应该就是搜索的岗位关键词了。通过上面对拉勾移动网站的分析,我们已经知道如何构造请求的网址了:可以通过改变 pageNo 的值爬取多页信息,实现对数据分析岗位招聘信息的大量抓取。那么通过这个移动页面,我们到底能抓取到多少条与数据分析相关的职位信息呢?
改变 pageNo 的值,查看一下能否得到对应页的数据。例如,查看第 100 页(http://m.lagou.com/search.json?city=%E5%85%A8%E5%9B%BD&positionName=%E 6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&pageNo=100&pageSize=15)。
结果如图 8-5 所示。
图 8-5 搜索结果第 100 页
这里得到第 100 页的数据。虽然不是平时看到的网页的样子,但是至少包含招聘数据。那么最多可以爬取多少页呢?再试一下 pageNo=300,结果出现变化了,如图 8-6 所示。
图 8-6 搜索结果第 300 页
第 300 页仅仅显示了一行数据,说明第 300 页已经没有招聘岗位了,不过能在这一行里找到"totalCount":"2682"这样的提示,这就说明总共可以看到 2682 条与数据分析相关的招聘信息,每页显示 15 条,也就是总共 179 页,可以打开第 179 页和第 180 页验证一下。当然了,在读者看到本书的时候,可能数据已经更多了。至此,爬取思路已经有了,只需要构造总共 179 页的请求网址,发起请求就可以抓取到这些数据,分析相关招聘职位的列表数据。
8.1.2 解析 json 数据和招聘岗位详情页分析
上面对招聘岗位列表页面的分析有一个问题需要解决,那就是打开构造的请求网址返回的是 json 数据。前面我们并没有演示返回 json 数据的处理方法。幸运的是,对于网站返回 json 数据,Requests 中有一个内置的 json 解码器,可以帮助处理 json 数据。下面请求第一页试试。
>>>import requests >>>url = 'http://m.lagou.com/search.json?city=%E5%85%A8%E5%9B%BD' '&positionName=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90' '&pageNo=1&pageSize=15') >>>r = requests.get(url) >>>r.json()
从图 8-7 中可以看到使用 Requests 的 json 解码器解码返回了 Python 字典结构的数据,这样就简单了 - 我们可以直接从字典中取出招聘岗位列表数据,非常方便。
图 8-7 Requests 解码 json 数据
因为希望能够爬取到招聘岗位的要求,如学历、工作经验及岗位职责等,我们还需要进入招聘岗位的详情页面爬取这些数据,那就需要获取招聘岗位详情页的 URL,如何获取详情页 URL 呢?回到页面继续分析。
以第一条招聘数据为例,单击进入其详情页面,如图 8-8 所示。
图 8-8 招聘岗位详情页面
可以看到它的 URL 为 http://m.lagou.com/jobs/4006595.html。其关键就是最后的数字 id,通过与列表页中解析出的数据对比,不难发现这个数字 id 就是招聘列表页面中职位的 positionId 的值。由此可见,通过解析招聘列表页面中招聘职位的 positionId 的值,构造成招聘职位详情页的 URL,然后请求这个地址,就可以解析出学历、工作经验及岗位职责等信息。
下节将按照这个思路编写拉勾网爬虫代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论