javassm框架项目实例_用scrapy框架爬取拉勾网招聘信息

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

分析思路
分析查询结果页

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

打开Chrome网页调试工具(F12), 分析每条搜索结果(即每个职位)在html中所处的元素定位, 发现每条结果都在

  • 下的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.htmlimport scrapyclass LagouItem(scrapy.Item):  # define the fields for your item here like:  job_url = scrapy.Field()  job_name = scrapy.Field()  salary = scrapy.Field()  city = scrapy.Field()  area = scrapy.Field()  experience = scrapy.Field()  education = scrapy.Field()  labels = scrapy.Field()  publish_date = scrapy.Field()  company = scrapy.Field()  company_feature = scrapy.Field()  company_public = scrapy.Field()  company_size= scrapy.Field()

编写爬虫代码 lagou.py

# -*- coding: utf-8 -*-import scrapyfrom LaGou.items import LagouItemimport jsonfrom pprint import pprintimport timeclass LagouSpider(scrapy.Spider):  name = 'lagou'  allowed_domains = ['www.lagou.com']  start_urls = ['https://www.lagou.com/jobs/list_python?']  def __init__(self):    # 设置头信息, 若不设置的话, 在请求第二页时即被拉勾网认为是爬虫而不能爬取数据    self.headers = {      "Accept": "application/json, text/javascript, */*; q=0.01",      "Connection": "keep-alive",      "Host": "www.lagou.com",      "Referer": 'https://www.lagou.com/jobs/list_Python?',      "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",      "referer": "https://www.lagou.com/jobs/list_python?"    }    self.sid = ''    self.job_url_temp = 'https://www.lagou.com/jobs/{}.html?show={}'    # 清空文件    with open('jobs.json', 'w') as f:      f.truncate()  def parse(self, response):    """    解析起始页    """    # response为GET请求的起始页, 自动获取cookie    # 提交POST带上前面返回的cookies, 访问数据结果第一页    yield scrapy.FormRequest(      'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false',      callback=self.parse_list,      formdata={"first": "false",           "pn": "1",           "kd": "python",           },      headers=self.headers    )  def parse_list(self, response):    """    解析结果列表页的json数据    """    # 获取返回的json,转为字典    res_dict = json.loads(response.text)    # 判断返回是否成功    if not res_dict.get('success'):      print(res_dict.get('msg', '返回异常'))    else:      # 获取当前页数      page_num = res_dict['content']['pageNo']      print('正在爬取第{}页'.format(page_num))      # 获取sid      if not self.sid:        self.sid = res_dict['content']['showId']      # 获取响应中的职位url字典      part_url_dict = res_dict['content']['hrInfoMap']      # 遍历职位字典      for key in part_url_dict:        # 初始化保存职位的item        item = LagouItem()        # 拼接完整职位url        item['job_url'] = self.job_url_temp.format(key, self.sid)        # 请求职位详情页        yield scrapy.Request(          item['job_url'],          callback=self.parse_detail,          headers=self.headers,          meta={'item': item}        )      # 获取下一页      if page_num < 30:        # time.sleep(2)        yield scrapy.FormRequest(          'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false',          callback=self.parse_list,          formdata={"first": "false",               "pn": str(page_num+1),               "kd": "python",               "sid": self.sid               },          headers=self.headers        )  def parse_detail(self, response):    """    解析职位详情页    """    # 接收item    item = response.meta['item']    # 解析数据    # 获取职位头div    job_div = response.xpath('//div[@class="position-content-l"]')    if job_div:      item['job_name'] = job_div.xpath('./div/h1/text()').extract_first()      item['salary'] = job_div.xpath('./dd/h3/span[1]/text()').extract_first().strip()      item['city'] = job_div.xpath('./dd/h3/span[2]/text()').extract_first().strip('/').strip()      item['area'] = response.xpath('//div[@class="work_addr"]/a[2]/text()').extract_first()      item['experience'] = job_div.xpath('./dd/h3/span[3]/text()').extract_first().strip('/').strip()      item['education'] = job_div.xpath('./dd/h3/span[4]/text()').extract_first().strip('/').strip()      item['labels'] = response.xpath('//ul[@class="position-label clearfix"]/li/text()').extract()      item['publish_date'] = response.xpath('//p[@class="publish_time"]/text()').extract_first()      item['publish_date'] = item['publish_date'].split('&')[0]      # 获取公司dl      company_div = response.xpath('//dl[@class="job_company"]')      item['company'] = company_div.xpath('./dt/a/img/@alt').extract_first()      item['company_feature'] = company_div.xpath('./dd//li[1]/h4[@class="c_feature_name"]/text()').extract_first()      item['company_feature'] = item['company_feature'].split(',')      item['company_public'] = company_div.xpath('./dd//li[2]/h4[@class="c_feature_name"]/text()').extract_first()      item['company_size'] = company_div.xpath('./dd//li[4]/h4[@class="c_feature_name"]/text()').extract_first()      yield item

编写middlewares.py, 自定义downloadermiddleware, 用来每次发送请求前, 随机设置user-agent, 这里使用了第三方库 fake_useragent, 能够随机提供user-agent, 使用前先安装: pip install fake_useragent

from fake_useragent import UserAgentimport randomclass RandomUserAgentDM:  """  随机获取userAgent  """  def __init__(self):    self.user_agent = UserAgent()  def process_request(self, request, spider):    request.headers['User-Agent'] = self.user_agent.random

编写pipelines.py, 将数据存为json文件

import jsonclass LagouPipeline:  def process_item(self, item, spider):    with open('jobs.json', 'a', encoding='utf-8') as f:      item_json = json.dumps(dict(item), ensure_ascii=False, indent=2)      f.write(item_json)      f.write('')

编写settings.py

# 设置日志显示LOG_LEVEL = 'WARNING'# 设置ROBOTSTXT协议, 若为true则不能爬取数据ROBOTSTXT_OBEY = False# 设置下载器延迟, 反爬虫的一种策略DOWNLOAD_DELAY = 0.25# 开启DOWNLOADER_MIDDLEWARESDOWNLOADER_MIDDLEWARES = { # 'LaGou.middlewares.LagouDownloaderMiddleware': 543,  'LaGou.middlewares.RandomUserAgentDM' :100,}# 开启ITEM_PIPELINESITEM_PIPELINES = { 'LaGou.pipelines.LagouPipeline': 300,}

启动爬虫

scrapy crawl lagou

发现依然只能5 6页, 说明拉勾网的反爬确实做得比较好, 还可以继续通过使用代理来进行反反爬, 这里就不再演示了,

查看爬取结果

以上就是Python爬虫实例——scrapy框架爬取拉勾网招聘信息的详细内容,更多关于Python爬虫爬取招聘信息的资料请关注我们其它相关文章!

时间:2020-07-14

Python Scrapy框架第一个入门程序示例

本文实例讲述了python Scrapy框架第一个入门程序.分享给大家供大家参考,具体如下: 首先创建项目: scrappy start project maitian 第二步: 明确要抓取的字段items.py import scrapy class MaitianItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() price

Scrapy框架爬取Boss直聘网Python职位信息的源码

分析 使用CrawlSpider结合LinkExtractor和Rule爬取网页信息 LinkExtractor用于定义链接提取规则,一般使用allow参数即可 LinkExtractor(allow=(), # 使用正则定义提取规则 deny=(), # 排除规则 allow_domains=(), # 限定域名范围 deny_domains=(), # 排除域名范围 restrict_xpaths=(), # 使用xpath定义提取准则 tags=('a', 'area'), attrs=(

图文详解python安装Scrapy框架步骤

python书写爬虫的一个框架,它也提供了多种类型爬虫的基类,scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 首先要先安装python 安装完成以后,配置一下环境变量. 还需要安装一些组件pywin32,百度搜索下载安装 pywin32安装完成还要安装pip,百度搜索pip下载下来,解压通过cmd命令进行安装 我查看一下pip是否安装成功 执行pip install Scrapy进行安装Scrapy 测试一下Scrapy框架是否安装成功,不报错就说明安装成功了

使用Python的Scrapy框架十分钟爬取美女图

简介 scrapy 是一个 python 下面功能丰富.使用快捷方便的爬虫框架.用 scrapy 可以快速的开发一个简单的爬虫,官方给出的一个简单例子足以证明其强大: 快速开发 下面开始10分钟倒计时: 当然开始前,可以先看看之前我们写过的 scrapy 入门文章

Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】

本文实例讲述了Python3爬虫爬取英雄联盟高清桌面壁纸功能.分享给大家供大家参考,具体如下: 使用Scrapy爬虫抓取英雄联盟高清桌面壁纸 源码地址:https://github.com/snowyme/loldesk 开始项目前需要安装python3和Scrapy,不会的自行百度,这里就不具体介绍了 首先,创建项目 scrapy startproject loldesk 生成项目的目录结构 首先需要定义抓取元素,在item.py中,我们这个项目用到了图片名和链接 import scrapy

Python爬虫 scrapy框架爬取某招聘网存入mongodb解析

创建项目 scrapy startproject zhaoping 创建爬虫 cd zhaoping scrapy genspider hr zhaopingwang.com 目录结构 items.py title = scrapy.Field() position = scrapy.Field() publish_date = scrapy.Field() pipelines.py from pymongo import MongoClient mongoclient = MongoClien

Python利用Scrapy框架爬取豆瓣电影示例

本文实例讲述了Python利用Scrapy框架爬取豆瓣电影.分享给大家供大家参考,具体如下: 1.概念 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通过Python包管理工具可以很便捷地对scrapy进行安装,如果在安装中报错提示缺少依赖的包,那就通过pip安装所缺的包 pip install scrapy scrapy的组成结构如下图所示 引擎Scrapy Engine,用于中转调度其他部分的信号和数据

Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例

本文实例讲述了Python Scrapy框架:通用爬虫之CrawlSpider用法.分享给大家供大家参考,具体如下: 步骤01: 创建爬虫项目 scrapy startproject quotes 步骤02: 创建爬虫模版 scrapy genspider -t quotes quotes.toscrape.com 步骤03: 配置爬虫文件quotes.py import scrapy from scrapy.spiders import CrawlSpider, Rule from scrap

Python2.7下安装Scrapy框架步骤教程

由于毕业设计的要求,需要在网站上抓取大量的数据,那么使用Scrapy框架可以让这一过程变得简单不少,毕竟Scrapy是一个为了爬取网站数据.提取结构性数据而编写的应用框架.于是,便开始了我的安装Scrapy框架之旅.可以说这个过程并不是很愉快,各种错误各种出,不过到最后,终于安装上了Scrapy框架.下面总结一下我的Scrapy框架的安装. 1.安装python2.7 由于Scrapy不支持Python3.0,于是我卸载了Python3.0,又重新安装了Python2.7(python2.7安装

Mac中Python 3环境下安装scrapy的方法教程

0261ea0735bd78edc59cab026d854677.png

前言 最近抽空想学习一下python的爬虫框架scrapy,在mac下安装的时候遇到了问题,逐一解决了问题,分享一下,话不多说了,来一起看看详细的介绍吧. 步骤如下: 1. 从官网 下载最新版本Python 3.6.3(本地快速下载安装:http://www.jb51.net/softs/583651.html) # 在Mac上Python3环境下安装scrapy 2. 安装 Python3 在终端输入python3出现下面的内容表示安装成功 ➜ ~ python3 Python 3.6.3 (

Centos7 Python3下安装scrapy的详细步骤

65d29a67e5003348e72a284f71b8f375.png

苦逼的前夜 昨晚很辛苦,搞到晚上快两点,最后还是没有把python3下的scrapy框架安装起来,后面还把yum这玩意给弄坏了,一直找不到命令.今天早上又自己弄了快一上午,又求助@函兮,弄了快一个中午,最后无奈还是没有弄好yum跟python这玩意,最后还是放弃治疗了.真的是什么招,什么损招都用完了,最后也没折了,直接报告老大去,然后把阿里云的centos7实例重新磁盘回滚了一下. 正确的安装姿势 这个不多废话,如果你是直接接手过来一个centos7的实例镜像,当然包括腾讯云或者阿里云上面的,只

在Linux系统上安装Python的Scrapy框架的教程

ee4a8f30690e4887565f066d448254a2.png

这是一款提取网站数据的开源工具.Scrapy框架用Python开发而成,它使抓取工作又快又简单,且可扩展.我们已经在virtual box中创建一台虚拟机(VM)并且在上面安装了Ubuntu 14.04 LTS. 安装 Scrapy Scrapy依赖于Python.开发库和pip.Python最新的版本已经在Ubuntu上预装了.因此我们在安装Scrapy之前只需安装pip和python开发库就可以了. pip是作为python包索引器easy_install的替代品,用于安装和管理Python

CentOS7下安装Scrapy步骤详细介绍

CentOS7下安装Scrapy步骤详细介绍 更新yum [root@localhost ~]# yum -y update 安装gcc及扩展包 [root@localhost ~]# yum install gcc libffi-devel python-devel openssl-devel 安装开发工具包 [root@localhost ~]# yum groupinstall -y development 安装libxslt-devel支持lxml [root@localhost ~]#

Windows下安装Django框架的方法简明教程

ec4b5bbddfba94041ca67d77dfd3d930.png

本文实例讲述了Windows下安装Django框架的方法.分享给大家供大家参考,具体如下: 在idea上运行Python项目时,出现了如下错误,这是因为系统中只安装了Python,没有安装Django,有童鞋可能会问,什么是Django,博主的建议是去问度年或谷老师 既然报错的原因就是缺少Django,那我们现在就开始安装这个应用框架. 本站下载Django1.6:Django-1.6.11.tar.gz 官网下载: Django-1.6.11.tar.gz || Django-1.7.11.t

Windows10下安装Docker的步骤图文教程

本文主要是记录吾本人在Windows10下安装Docker的过程,当然这些步骤也是在网上搜索查阅资料得知而来的!具体步骤如下: 一.启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 点击确定后,启用完毕会提示重启系统,我们可以稍后再重启. 二.安装Docker Docker下载地址为:https://store.docker.com/editions/community/docker-ce-desktop-windo

window下安装配置mongodb的教程图解

1.下载mongodb安装包 https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl?_ga=2.233271640.711265466.1519368764-1223643675.1519368764 这里是所有历史版本 首先声明下,我下载了此时最新版本3.6.3怎么安装都是报错,闪退,寻找各种办法都没有能够解决,最后降低版本安装才得以成功,我下载的版本是3.4.0 解压安装mongodb,我是安装在d:/MongoDB目录下 2.创建必须的

python mac下安装虚拟环境的图文教程

Mac 下 Flask 框架 workon命令找不到 ---- 最终解决方案(详解具体实现操作过程中遇到的坑)2018年08月17日 00:02:05Jasonmes阅读数:622 Mac 下 Flask 的 全网最详细搭建1.安装virtualenv和virtualenvwrapper sudo pip install virtualenv# 以下成功截图 sudo pip install virtualenvwrapper# 以下成功截图 创建存放虚拟环境的文件夹并切换到该文件夹下 mkdi

大家平时学习Python的时候肯定会遇到很多问题,小编我为大家准备了Python学习资料,将这些免费分享给大家!如果想要的可以找我领取

领取方式:

如果想获取这些学习资料,先关注我然后私信小编“01”即可免费领取!(私信方法:点击我头像进我主页右上面有个私信按钮)

如果这篇文章对你有帮助,请记得给我来个评论+转发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值