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

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

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

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

开始

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

果真仍是跳出来一个页面,可是貌似。。网址同样,我打开看一下scrapy

和以前不同也!ide

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

别急,咱们继续看看别的信息
在preview咱们看到了Pageno.2 说明确实不是一样的内容post

Header

咱们继续看header,貌似发现了不得的东西。大数据

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

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

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

相关文章
相关标签/搜索