用scrapy框架爬取拉勾网招聘信息

本文实例为爬取拉勾网上的如职位名, 薪资, 公司名称相关python的职位信息。

分析思路

分析查询结果页

在拉勾网搜索框中搜索'python'关键字, 在浏览器地址栏可以看到搜索结果页的url为: 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=', 尝试将?后的参数删除, 发现访问结果相同.

打开Chrome网页调试工具(F12), 分析每条搜索结果(即每个职位)在html中所处的元素定位, 发现每条结果都在<ul class="item_con_list">下的li标签中.

 

因为我们需要每个职位的具体信息, 因此需要获取到每条搜索结果的详情url, 即点击搜索结果后进入的详情页的url.

继续查看li标签中的元素, 找到想要的详情url, 找到后的url为: href=https://www.lagou.com/jobs/6945237.html?show=b6e8e778fcae4c2aa2111ba58f9ebfa0

 

查看其它搜索结果的详情url, 发现其格式都为: href="https://www.lagou.com/jobs/{某个id}.html?show={show_id}" rel="external nofollow"

对于第一个ID, 每条结果的id都不一样, 猜想其为标记每个职位的唯一id, 对于show_id, 每条结果的id都是一样的, 尝试删除show参数, 发现一样可以访问到具体结果详情页

那么我们直接通过xpath提取到每个职位的第一个ID即可, 但是调试工具的elements标签下的html是最终网页展示的html, 并不一定就是我们访问 https://www.lagou.com/jobs/list_python 返回的response的html, 因此点到Network标签, 重新刷新一下页面, 找到 https://www.lagou.com/jobs/list_python 对应的请求, 查看其对应的response, 搜索 'position_link'(即前面我们在elements中找到的每条搜索结果的详情url), 发现确实返回了一个网址, 但是其重要的两个ID并不是直接放回的, 而是通过js生成的, 说明我们想要的具体数据并不是这个这个请求返回的.

 

那么我们就需要找到具体是哪个请求会返回搜索结果的信息, 一般这种情况首先考虑是不是通过ajax获取的数据, 筛选类型为XHR(ajax)的请求, 可以逐个点开查看response, 发现 positionAjax.json 返回的数据中就存在我们想要的每条搜索结果的信息. 说明确实是通过ajax获取的数据, 其实点击下一页, 我们也可以发现地址栏url地址并没有发生变化, 只是局部刷新了搜索结果的数据, 也说明了搜索结果是通过ajax返回的.

 

分析上面ajax的response, 查看其中是否有我们想要的职位ID, 在preview中搜索之前在elements中找到的某个职位的url的两个ID, 确实两个ID都存在response中, 分析发现第一个ID即为positionId, 第二个即为showId, 我们还可以发现response中返回了当前的页码数pageNo

因此我们只需要访问上面ajax对应的url: https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false 就可以拿到我们想要的ID, 然后填入详情url模板: https://www.lagou.com/jobs/{position_id}.html?show={show_id}中即可访问详情页了.

但是当我们直接访问 https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false 时 ,返回的结果却是:  {"status":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"139.226.66.44","state":2402}

 

经过百度查询后发现原来直接访问上述地址是不行的, 这也是拉钩的一个反爬策略, 需要我们带上之前访问查询结果页(https://www.lagou.com/jobs/list_python?)的cookie才行, 因为我们这里使用的是scrapy框架, 该框架是能够自带上次请求的cookie来访问下一个请求的, 所以我们这里不需要手动去添加cookie信息, 只需要首先访问一下查询结果页就可以了. 即start_url = https://www.lagou.com/jobs/list_python

此外发现这个ajax请求是通过POST方式发送的, 因此还需要分析它提交的form数据, 在第一页中有三条数据信息, first为true, pn为1 kd为python , 第二页中first为false, pn为2, kd同样为python, 且多了一个sid

分析这四个参数, 第一个first为表示是否是第一页, 第二个pn为表示当前页码数, 第三个kd为表示搜索的关键字, 第四个sid经过和上面showId对比发现其值就为showId

 

分析职位详情页

前面分析完后就可以拼接出职位详情页url了, 点开详情页, 同样的思路分析我们想要的数据是不是就在详情页的url中, 这里想要职位名称, 工资, 地点, 经验, 关键字, 公司信息等

 

在network中查找对应的response, 发现数据确实就存在response中, 因此直接通过xpath就可以提取想要的数据了

编写爬虫代码

具体代码在github:

这里只放出关键代码

创建scrapy项目

scrapy startproject LaGou

创建爬虫

scrapy genspider lagou www.lagou.com

编写items.py, 设置要想爬取的字段

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

class LagouItem(scrapy.Item):
  # define the fields for your item here li
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Scrapy框架爬取智联招聘站职位信息的示例代码: 1. 创建Scrapy项目 在命令行中输入以下命令,创建一个名为`zhaopin`的Scrapy项目: ``` scrapy startproject zhaopin ``` 2. 创建爬虫文件 在项目根目录下,使用以下命令创建一个名为`zhaopin_spider`的爬虫文件: ``` scrapy genspider zhaopin_spider sou.zhaopin.com ``` 3. 修改爬虫代码 打开`zhaopin_spider.py`文件,将其修改为以下代码: ```python import scrapy class ZhaopinSpiderSpider(scrapy.Spider): name = 'zhaopin_spider' allowed_domains = ['sou.zhaopin.com'] def start_requests(self): # 设置请求URL url = 'https://sou.zhaopin.com/?jl=530&kw=Python&kt=3' # 发送请求 yield scrapy.Request(url, callback=self.parse) def parse(self, response): # 获取职位列表 job_list = response.xpath('//div[@class="joblist-box__item"]') # 遍历职位列表,获取职位信息 for job in job_list: # 获取职位名称 job_name = job.xpath('.//div[@class="joblist-box__jobname"]/text()') # 获取公司名称 company_name = job.xpath('.//div[@class="joblist-box__companyname"]/text()') # 获取工作地点 location = job.xpath('.//div[@class="joblist-box__jobarea"]/text()') # 获取薪资范围 salary = job.xpath('.//span[@class="joblist-box__salary"]/text()') # 获取职位链接 job_link = job.xpath('.//a[@class="joblist-box__jobname"]/@href') # 输出职位信息 yield { '职位名称': job_name.extract_first().strip(), '公司名称': company_name.extract_first().strip(), '工作地点': location.extract_first().strip(), '薪资范围': salary.extract_first().strip(), '职位链接': job_link.extract_first().strip() } ``` 在`start_requests`方法中,我们设置了请求URL,并使用`scrapy.Request`发送请求。在`parse`方法中,我们使用XPath表达式获取职位信息,并使用`yield`输出结果。 4. 运行爬虫 在命令行中,进入项目根目录,输入以下命令运行爬虫: ``` scrapy crawl zhaopin_spider -o result.json ``` 其中,`-o result.json`表示将结果保存到名为`result.json`的文件中。 需要注意的是,Scrapy框架会自动处理反爬虫机制,但是也需要注意一些规则,如请求频率等。另外,在爬取数据时,可以使用Scrapy提供的一些中间件,如随机User-Agent、自动重试等,以提高爬取效率和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值