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

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

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

开始

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

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

和之前不一样也!

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

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

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

Header

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

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

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

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功能,并给出了例子


我们在我们的之前代码中的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)]

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

修改代码:

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

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


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

实现自动翻页

我们只要能控制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页。

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

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

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

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

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

https://github.com/hk029/LagouSpider

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

  1. node.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. ELF(Executable and Linkable Format)

    目录 . 引言 . ELF文件格式 . ELF格式分析工具 0. 引言 0x1: ELF文件类型 ELF文件标准里把系统中采用ELF格式的文件归为以下几类 . 可重定位文件(Relocatable F ...

  2. xml 嵌入式资源

    使用Ibatis总是说未能加载相应的sqlmap.xml,原来是 xml以内容方式,而不是嵌入式方式载入Dll中

  3. 求一元二次方程ax^2+bx+c=0的解

    Console.WriteLine("求解方程ax^2+bx+c=0的解."); Console.WriteLine("请分别输入a,b,c的值(注意每输入一个值按一下回 ...

  4. vi显示行号

    vi显示行号   :set nu         带行号查看,并不改变文件内容:set nonu     取消带行号查看在每个用户的主目录下,都有一个 vi 的配置文件".vimrc&quo ...

  5. Kd-tree算法原理

    参考资料: Kd Tree算法原理 Kd-Tree,即K-dimensional tree,是一棵二叉树,树中存储的是一些K维数据.在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成 ...

  6. Support Vector Machines for classification

    Support Vector Machines for classification To whet your appetite for support vector machines, here’s ...

  7. IPC 机制简介

    IPC 机制简介 概述 在Unix早期发展中,做出重大贡献的两大主力Bell实验室和伯克利大学(BSD)在IPC(InterProcess Communication)方面的侧重点有所不同.前者对Un ...

  8. 使用 GDB 调试多进程程序

    使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...

  9. 一个C++类的注释:

    #ifndef __RUNTIMEPARA__HPP#define __RUNTIMEPARA__HPP #include <string> //后面会有介绍 #include <m ...

  10. js中查找一个字符是否存在。

    <script> var a = 'd'; var re = a.indexOf('d'); ){ alert('存在'); } else { alert('不存在'); } </s ...