• Scrapy 爬取BOSS直聘关于Python招聘岗位


      年前的时候想看下招聘Python的岗位有多少,当时考虑目前比较流行的招聘网站就属于boss直聘,所以使用Scrapy来爬取下boss直聘的Python岗位。

    1.首先我们创建一个Scrapy 工程
    scrapy startproject boss

    2.此时创建项目成功,进入boss目录查看整体的项目目录结构  

      

      

    文件说明:
    1 scrapy.cfg 项目配置文件
    2 items.py 数据存储模板,用于结构化数据
    3 pipelines.py 数据处理
    4 settings.py 配置文件
    5 middlewares.py 定义项目中间件 
    6 spiders 爬虫目录
    3.创建爬虫(spiders) 
    scrapy genspider boss_zhipin zhipin.com

    语法:

    scrapy genspider [爬虫名称][爬取范围]
    此时我们已经创建完成boss项目的第一个spider任务,其实创建spider不是很难,关键是我们怎么来编写我们的spider,下面我们看下我们要爬去的页面的对象;

    4.明确爬虫需求,设计爬虫代码

    题目我们已经明确了我们要做什么事情,我们主要来爬取boss直聘上关于python的职位,那么我们先把需求再次缩小一些我们来搜索北京区域关于python的职位,如果我们可以解决了北京区域,那么剩下的其他区域我们完全可以照着北京的来处理。 
    Ⅰ.定义入口url地址

     

      通过上面的演示,我们首先登陆zhipin.com,通过搜索方式找到北京与python相关的职位,此时我们拿到入口url地址"https://www.zhipin.com/job_detail/?query=python&scity=101010100&industry=&position=".因为我们爬去的数据肯定不仅是首页,
    所有我们会考虑到翻页的问题,我们进行翻页,看到第二和第二页的地址"https://www.zhipin.com/c101010100/h_101010100/?query=python&page=2&ka=page-2"和"https://www.zhipin.com/c101010100/h_101010100/?query=python&page=3&ka=page-3",
    此时我们可以清楚的看到url变化规律,那么我们是否可以入口url定义为"https://www.zhipin.com/c101010100/h_101010100/?query=python&page=1&ka=page-1",我们试着通过返回第一页的方式来验证了下,确实这样的规律可以访问到第一页的数据,那么我们可以把
    start_url定义为"https://www.zhipin.com/c101010100/?query=python&page=1&ka=page-1"。
    start_urls = ['https://www.zhipin.com/c101010100/?query=python&page=1&ka=page-1']
    Ⅱ.items定义我们要爬取的字段;
    class BossItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        job_title = scrapy.Field()  # 岗位
        compensation = scrapy.Field()  # 薪资
        company = scrapy.Field()  # 公司
        address = scrapy.Field()  # 地址
        seniority = scrapy.Field()  # 工作年薪
        education = scrapy.Field()  # 教育程度
        company_type = scrapy.Field()  # 公司类型
        company_finance = scrapy.Field()  # 融资
        company_quorum = scrapy.Field()  # 公司人数

    说明:

      scrapy.Field()有点类似我们在数据库中定义的数据类型;

    Ⅲ.通过定义的字段来定义我们的spider;
    class ZhipinSpider(scrapy.Spider):
        # 定义spider的名字
        name = 'zhipin'
        # 定义爬取的域
        allowed_domains = ['zhipin.com']
        # 定义入口URL
        start_urls = ['https://www.zhipin.com/c101010100/?query=python&page=1&ka=page-1']
    
        # 定义解析规则,这个方法必须叫做parse
        def parse(self, response):
            item = BossItem()
            # 获取页面数据的条数
            node_list = response.xpath("//*[@id="main"]/div/div[2]/ul/li")
            # 循环解析页面的数据
            for node in node_list:
                item["job_title"] = node.xpath(".//div[@class="job-title"]/text()").extract()[0]
                item["compensation"] = node.xpath(".//span[@class="red"]/text()").extract()[0]
                item["company"] = node.xpath("./div/div[2]/div/h3/a/text()").extract()[0]
                company_info = node.xpath("./div/div[2]/div/p/text()").extract()
                temp = node.xpath("./div/div[1]/p/text()").extract()
                item["address"] = temp[0]
                item["seniority"] = temp[1]
                item["education"] = temp[2]
                if len(company_info) < 3:
                    item["company_type"] = company_info[0]
                    item["company_finance"] = ""
                    item["company_quorum"] = company_info[-1]
                else:
                    item["company_type"] = company_info[0]
                    item["company_finance"] = company_info[1]
                    item["company_quorum"] = company_info[2]
                yield item

    这样我们就可以顺利的解析完成第一页数据,因为我们不仅仅需要第一页数据,我们这里需要的是所有,我们这里还需要添加一个分页;

    Ⅳ.获取下一页数据;


    我们分析了下分页标签,发现我们可以一直通过下页标签的方式来获取下页请求的地址,为什么不直接通过分页标签来获取,经过翻页我们没有办法确定元素位置,只有下页元素位置固定且,可以完全的获取下页的请求地址,根据下页的herf地址来拼接请求地址。
                # 定义下页标签的元素位置
                next_page = response.xpath("//div[@class="page"]/a/@href").extract()[-1]
                # 判断什么时候下页没有任何数据
                if next_page != 'javascript:;':
                    base_url = "https://www.zhipin.com"
                    url = base_url + next_page
                    yield Request(url=url, callback=self.parse)
    这样我们就可以完成的获取所有的岗位数据。
    通过boss直聘来爬取python的岗位,我们来介绍了下如何来编写自己的定义爬虫,这里我们是通过页面的方式来爬取了数据,那么我们是否可以通过其他的方式来获取数据,下次介绍通过抓包获取接口地址来爬取数据。

      

  • 相关阅读:
    STM32+ESP8266+AIR202基本控制篇-301-服务器单向SSL认证-MQTT服务器配置SSL单向认证(.Windows系统)
    STM32+ESP8266+AIR202基本控制篇-213-功能测试-微信小程序扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
    17-STM32+ESP8266+AIR202基本控制篇-完成功能2-微信小程序使用APUConfig配网绑定ESP8266,并通过MQTT和ESP8266实现远程通信控制
    Python 元类
    硬核!15张图解Redis为什么这么快
    Protobuf 中 any 的妙用
    Grpc性能压测方法:用ghz进行压测
    压测工具Locuse的使用
    Locust 多机器分布式测试
    kubespray部署kubernetes高可用集群
  • 原文地址:https://www.cnblogs.com/mengyu/p/8494515.html
Copyright © 2020-2023  润新知