【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)
上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能。
之前的内容就不再介绍了,不熟悉的请一定要去看之前的文章,代码是在之前的基础上修改的
【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(1)
开始
还是回到我们熟悉的页面,这里,我们熟练的打开了Newwork标签,我们点下一页,看会出来什么结果
/1463152528112.png)
果然还是跳出来一个页面,但是貌似。。网址一样,我打开看一下
/1463152929961.png)
和之前不一样也!
/1463152921303.png)
一样的网址,结果不一样的结果,这怎么可能!!小伙伴是不是也和我一样,一脸懵B!
/1463153132325.png)
别急,我们继续看看别的信息
在preview我们看到了Pageno.2 说明确实不是同样的内容
/1463153168981.png)
Header
我们继续看header,貌似发现了不起的东西。
/1463153261036.png)
这个pn不就是pageno的简写吗?(什么,你怎么不知道有这个缩写?)我们可以再打开一个网页看看,事实证明,我是对的。
/1463153537222.png)
好的,我们现在知道页码信息在这里了,那要怎么把这个信息附加上呢??
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功能,并给出了例子
/1463154957391.png)
/1463155174463.png)
我们在我们的之前代码中的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)]
/1463155613437.png)
运行一下,出错了,才发现,原来目前拉勾的json结构改了,中间加了一个positionResult
/1463156012296.png)
修改代码:
jcontent = jdict["content"]
jposresult = jcontent["positionResult"]
jresult = jposresult["result"]
再运行一下,和第2页的一致,说明成功了
/1463156134916.png)
/1463156215813.png)
这里再说下,如果你在关键词里搜索,你会发现链接也不会变化,说明什么??说明也是用的post,比如我搜索大数据,可以看到kd变成了大数据,所以我们也可以构造特定关键词的爬虫了。
/1463157500842.png)
实现自动翻页
我们只要能控制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页。
/1463157303949.png)
self.totalPageCount = jposresult['totalCount'] /15;
if self.totalPageCount > 30:
self.totalPageCount = 30;
这里我们爬所有北京有关“大数据”的工作
formdata={'pn':str(self.curpage),'kd':'大数据'}
好了大工告成!享受你的成果吧!!
/1463157993670.png)
这个工程我上传到了github,有兴趣的同学可以下载下来看看:
https://github.com/hk029/LagouSpider
【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)的更多相关文章
- node.js爬虫爬取拉勾网职位信息
简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳.杭州.西安.成都7个城市的数据,分别以前端.PHP.java.c++.python.Androi ...
- python爬虫(三) 用request爬取拉勾网职位信息
request.Request类 如果想要在请求的时候添加一个请求头(增加请求头的原因是,如果不加请求头,那么在我们爬取得时候,可能会被限制),那么就必须使用request.Request类来实现,比 ...
- 爬虫系列5:scrapy动态页面爬取的另一种思路
前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...
- scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立
本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...
- scrapy之盗墓笔记三级页面爬取
#今日目标 **scrapy之盗墓笔记三级页面爬取** 今天要爬取的是盗墓笔记小说,由分析该小说的主要内容在三级页面里,故需要我们 一一解析 *代码实现* daomu.py ``` import sc ...
- scrapy抓取拉勾网职位信息(六)——反爬应对(随机UA,随机代理)
上篇已经对数据进行了清洗,本篇对反爬虫做一些应对措施,主要包括随机UserAgent.随机代理. 一.随机UA 分析:构建随机UA可以采用以下两种方法 我们可以选择很多UserAgent,形成一个列表 ...
- python-scrapy爬虫框架爬取拉勾网招聘信息
本文实例为爬取拉勾网上的python相关的职位信息, 这些信息在职位详情页上, 如职位名, 薪资, 公司名等等. 分析思路 分析查询结果页 在拉勾网搜索框中搜索'python'关键字, 在浏览器地址栏 ...
- scrapy抓取拉勾网职位信息(八)——使用scrapyd对爬虫进行部署
上篇我们实现了分布式爬取,本篇来说下爬虫的部署. 分析:我们上节实现的分布式爬虫,需要把爬虫打包,上传到每个远程主机,然后解压后执行爬虫程序.这样做运行爬虫也可以,只不过如果以后爬虫有修改,需要重新修 ...
- scrapy抓取拉勾网职位信息(三)——爬虫rules内容编写
在上篇中,分析了拉勾网需要跟进的页面url,本篇开始进行代码编写. 在编写代码前,需要对scrapy的数据流走向有一个大致的认识,如果不是很清楚的话建议先看下:scrapy数据流 本篇目标:让拉勾网爬 ...
随机推荐
- c++ 函数调用在进入下一个循环的时候会再次初始化参数,将函数体直接写进去就正常
#include"stdafx.h" #include"string" #include<iostream> #include<vector& ...
- 织梦DedeCMS删除所有栏目或文章后,新建ID不从1开始的解决方法
这个修改方法很简单,从模板无忧那里找到的,只需要在后台系统-SQL命令行工具里面运行以下语句即可,不用采用笨方法重新安装织梦CMS了. 删除所有栏目,新建ID从1开始: ALTER TABLE `de ...
- 锋利的jQuery-4--动画方法总结简表
- Java中使用split、sort函数
public static void main(String[] args) { // TODO Auto-generated method stub String str = null ; Scan ...
- struts返回json
<param name="includeProperties"> </param> 这个属性表示要包含进JSON数据中的数据.<param name= ...
- ajax原理,验证码生成原理
什么是ajax AJAX:”Asynchronous JavaScript and XML” 中文意思:异步JavaScript和XML 指一种创建交互式网页应用的网页开发技术. 不是指一种单一的 ...
- ETHERNET数据包格式( IP & UDP & ICMP & ARP )
ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...
- linux 查找php.ini 文件
sudo find /* -name 'php.ini' /etc/php5/fpm/php.ini
- jsp include page指令标记
include指令标记 <jsp:include page=""> 父页面和包含进来的页面单独编译,单独翻译成servlet后,在前台拼成一个HTML页面. 动态编译& ...
- 微信公众号"赞赏"功能来了 觉得不错就给作者打个赏吧
微信很早以前就开始测试“赞赏”功能了,只是官方还没出公告,近日腾讯科技就发了一篇题为 试试给微信公众号“赞赏” 的文章,算是一个回应吧.微信打赏功能势在遏制公众账号抄袭,鼓励用户创造优质内容,内容付费 ...