【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

时间:2022-08-27 17:12:48

上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能。

之前的内容就不再介绍了,不熟悉的请一定要去看之前的文章,代码是在之前的基础上修改的

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(1)

开始

还是回到我们熟悉的页面,这里,我们熟练的打开了Newwork标签,我们点下一页,看会出来什么结果

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

果然还是跳出来一个页面,但是貌似。。网址一样,我打开看一下

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

和之前不一样也!

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

一样的网址,结果不一样的结果,这怎么可能!!小伙伴是不是也和我一样,一脸懵B!

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

别急,我们继续看看别的信息

在preview我们看到了Pageno.2 说明确实不是同样的内容

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

Header

我们继续看header,貌似发现了不起的东西。

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

这个pn不就是pageno的简写吗?(什么,你怎么不知道有这个缩写?)我们可以再打开一个网页看看,事实证明,我是对的。

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

好的,我们现在知道页码信息在这里了,那要怎么把这个信息附加上呢??

Get or Post??

我们知道网页有两种方式传输数据,get和post,get是把需要传输的数据写到URL上,用户可以直观看见,就是我们之前一直使用的(比如搜索城市,工作经验,学历什么的)。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

scrapy实现post

看来我们得想办法用scrapy实现post了。

如果你还记得我们之前讲request的时候讲了request是可以轻松实现post的,那scrapy有request吗?毫无疑问是有的。我们在文档中找到了一个叫FormRequest的对象,它能实现post功能,并给出了例子

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)
【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

我们在我们的之前代码中的class中加入一个start_requests函数

def start_requests(self):
return [scrapy.http.FormRequest('http://www.lagou.com/jobs/positionAjax.json?px=new&city=%E5%8C%97%E4%BA%AC',
formdata={'pn':'2'},callback=self.parse)]

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

运行一下,出错了,才发现,原来目前拉勾的json结构改了,中间加了一个positionResult

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

修改代码:

        jcontent = jdict["content"]
jposresult = jcontent["positionResult"]
jresult = jposresult["result"]

再运行一下,和第2页的一致,说明成功了

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)
【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

这里再说下,如果你在关键词里搜索,你会发现链接也不会变化,说明什么??说明也是用的post,比如我搜索大数据,可以看到kd变成了大数据,所以我们也可以构造特定关键词的爬虫了。

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

实现自动翻页

我们只要能控制pn就行了,我们新增一个变量curpage让它运行一次自加1,然后我们还是用之前的yield的方法

if self.curpage <= self.totalPageCount:
self.curpage += 1
yield scrapy.http.FormRequest('http://www.lagou.com/jobs/positionAjax.json?px=new&city=%E5%8C%97%E4%BA%AC', formdata={'pn':str(self.curpage)},callback=self.parse)

要说明的是,之前json文件里是有个totalPageCount属性的,目前没了!所以不能直接从json文件中获取页数信息了,怎么办呢?如果你要细心观察就可以发现有个totalCount属性,你做实验可以发现,每页都是15个,页数就是totalCount/15取整,如果页数大于30,只显示30页。

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

  self.totalPageCount = jposresult['totalCount'] /15;
if self.totalPageCount > 30:
self.totalPageCount = 30;

这里我们爬所有北京有关“大数据”的工作

 formdata={'pn':str(self.curpage),'kd':'大数据'}

好了大工告成!享受你的成果吧!!

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

这个工程我上传到了github,有兴趣的同学可以下载下来看看:

https://github.com/hk029/LagouSpider

【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)的更多相关文章

  1. node&period;js爬虫爬取拉勾网职位信息

    简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳.杭州.西安.成都7个城市的数据,分别以前端.PHP.java.c++.python.Androi ...

  2. python爬虫(三) 用request爬取拉勾网职位信息

    request.Request类 如果想要在请求的时候添加一个请求头(增加请求头的原因是,如果不加请求头,那么在我们爬取得时候,可能会被限制),那么就必须使用request.Request类来实现,比 ...

  3. 爬虫系列5:scrapy动态页面爬取的另一种思路

    前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...

  4. scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立

    本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...

  5. scrapy之盗墓笔记三级页面爬取

    #今日目标 **scrapy之盗墓笔记三级页面爬取** 今天要爬取的是盗墓笔记小说,由分析该小说的主要内容在三级页面里,故需要我们 一一解析 *代码实现* daomu.py ``` import sc ...

  6. scrapy抓取拉勾网职位信息(六)——反爬应对(随机UA,随机代理)

    上篇已经对数据进行了清洗,本篇对反爬虫做一些应对措施,主要包括随机UserAgent.随机代理. 一.随机UA 分析:构建随机UA可以采用以下两种方法 我们可以选择很多UserAgent,形成一个列表 ...

  7. python-scrapy爬虫框架爬取拉勾网招聘信息

    本文实例为爬取拉勾网上的python相关的职位信息, 这些信息在职位详情页上, 如职位名, 薪资, 公司名等等. 分析思路 分析查询结果页 在拉勾网搜索框中搜索'python'关键字, 在浏览器地址栏 ...

  8. scrapy抓取拉勾网职位信息(八)——使用scrapyd对爬虫进行部署

    上篇我们实现了分布式爬取,本篇来说下爬虫的部署. 分析:我们上节实现的分布式爬虫,需要把爬虫打包,上传到每个远程主机,然后解压后执行爬虫程序.这样做运行爬虫也可以,只不过如果以后爬虫有修改,需要重新修 ...

  9. scrapy抓取拉勾网职位信息(三)——爬虫rules内容编写

    在上篇中,分析了拉勾网需要跟进的页面url,本篇开始进行代码编写. 在编写代码前,需要对scrapy的数据流走向有一个大致的认识,如果不是很清楚的话建议先看下:scrapy数据流 本篇目标:让拉勾网爬 ...

随机推荐

  1. ubuntu12&period;10 源更新出错(sudo apt-get update)

    Ubuntu12.10 刚安装完发现vi编辑器无法正常使用,后来用sudo apt-get install vim 一直出错,搜索相关资源发现需要更新源 首先,备份一下Ubuntu 12.10 原来的 ...

  2. const int &ast; pi&sol;int &ast; const pi的区别

    前面有一篇文章:数组名就是常量指针 参考文章:http://blog.pfan.cn/whyhappy/5164.html const int * pi .int const * pi与int *   ...

  3. &lbrack;POJ 3420&rsqb; Quad Tiling

      Quad Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3495   Accepted: 1539 Des ...

  4. C&plus;&plus; Preprosessor import

    #import Attributes Provides links to attributes used with the #import directive. Microsoft Specific ...

  5. VUE项目的目录关系

    1.页面中只有一个index.html. 2.一个js文件.在路由中. 3.主要的app.vue. 4.最后就是可以放多个vue文件的~~(一个页面对应一个vue文件,一个vue组件对应一个js中的i ...

  6. oracle错误汇总2

    http://blog.itpub.net/30430420/viewspace-1799925/ ============================= 现象!!!!!!!!!!!!!!!!!S ...

  7. 浅谈C&num;在网络波动时防重复提交

    前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同).排查原因,发现是网络波动造成了重复提交. 由于网络波动而重复提交的例子也比较多: 网络上,防重复提交的方法也很多,使用redis锁, ...

  8. Test Design Techniques - STATE BASED TESTING

    Test Design Techniques - STATE BASED TESTING -Test note of “Essential Software Test Design” 2015-08- ...

  9. 【转】VISUAL STUDIO 2008代码指标为您节省资金

    转自:https://www.geekzone.co.nz/vs2008/4773 Visual Studio 2008 Team Developer和Team Suite版本中提供的许多新功能之一是 ...

  10. Windows:chm 文件打开出现&OpenCurlyDoubleQuote;已取消到该网页的导航”的解决方案

    症状 解决方案