zoukankan      html  css  js  c++  java
  • scrapy抓取拉勾网职位信息(三)——爬虫rules内容编写

    在上篇中,分析了拉勾网需要跟进的页面url,本篇开始进行代码编写。

    在编写代码前,需要对scrapy的数据流走向有一个大致的认识,如果不是很清楚的话建议先看下:scrapy数据流


    本篇目标:让拉勾网爬虫能跑起来


    分析:我们要通过拉勾网的起始url,通过设定一些规则,跟进我们需要的网页,提取出详情页的某些字段,如:岗位,薪酬,公司名称,地址等

    编写lagou_c.py文件

    原始代码如下:

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    
    
    class LagouCSpider(CrawlSpider):
        name = 'lagou_c' 
        allowed_domains = ['lagou.com']
        start_urls = ['http://lagou.com/']
    
        rules = (
            Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            i = {}
            #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
            #i['name'] = response.xpath('//div[@id="name"]').extract()
            #i['description'] = response.xpath('//div[@id="description"]').extract()
            return i

    解释:

    LagouCSpider继承自CrawlSpider类,内部定义了4个属性和一个函数

    name:代表的是爬虫的名称

    allowed_domains:代表的是跟进页面后允许爬取的referer,类型是一个列表,举个例子,如果我要爬取www.baidu.com首页,无论allowed_domains设置成什么我都能爬取到首页,但是如果我要爬取的是百度页面首页的其他链接,如果设置allowed_domains =['baidu.com/']可以继续爬取,然鹅换成allowed_domains=['lagou.com‘],跟进的页面就无法爬取了

    start_urls:代表的是初始的urls地址,也就是初始请求url的一个列表

    rules:是一个元组类型,里面存放的是一个个Rule对象,也就是规则,这些规则用来限定要跟进的页面,

    • LinkExtractor链接提取器:allow参数代表允许跟进的页面url,这里是allow=r'Items/',也就是说对于lagou.com/items/的页面它是会继续跟进爬取的,这个我们后续需要修改为我们需要的。
    • callback:回调函数使用parse_item,也就是说这个页面返回的response,使用这个函数来进行解析。另外注意,使用crawl模板生成爬虫时,不要使用parse作为回调函数,否则爬虫可能运行不起来。
    • follow:这个字面很好理解,就是跟进,如果没有指定callback函数的话,默认就是跟进,否则的话就是不跟进。也就是说没有到详情页的时候,默认都是跟进的,到了详情页我们需要设置回调函数进行解析了,那默认就不再跟进了,但是如果详情页还有详情页,也有我们需要提取的信息的话,那就设置follow=True。follow不要都设置为True,这样可能导致重复请求。

    parse_item:作为回调函数存在,主要做一些页面解析工作

    现在先把rules修改下跟进首页的职业方向标签url(zhaopin/.*),在setting.py下修改ROBOTSTXT_OBEY = False(不遵守robots协议)

    修改的rules代码如下:

    rules = (
            Rule(LinkExtractor(allow=r'zhaopin/.*',restrict_css='.sidebar')),  #restrict_css就是用css选择器对页面进行限制,我这里限制为只只跟进上图中的选定部分
        )

    在项目根目录下运行一下爬虫,scrapy crawl lagou_c:

    控制台输出的信息显示可以看出来我们确定跟进了哪些标签页,比如java,shell等,但是这些页面的url都重定向到一个网页,而这个网页其实就是拉勾网的登陆页面。

    那是不是要登录爬取呢?

    大家应该经常听过一句话:可见即可爬。也就是说只要在浏览器能看到的东西都是能爬的,我们在拉勾网查询职位的时候没有登陆也能查询,所以使用爬虫爬取同样不用登录。我们这里增加一个cookie然后进行爬取。对于cookie很多人有误区,认为登录了才会产生cookie,这是不正确的。

    在lagou_c.py文件,rules和parse_item函数之间加入custom_settings属性如下(里面的cookie我是网上直接找的一个,当然你也可以自己抓包获取)

    custom_settings = {
            "COOKIES_ENABLED": False,
            'DEFAULT_REQUEST_HEADERS': {
                'Accept': 'application/json, text/javascript, */*; q=0.01',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.8',
                'Connection': 'keep-alive',
                'Cookie': 'user_trace_token=20171015132411-12af3b52-3a51-466f-bfae-a98fc96b4f90; LGUID=20171015132412-13eaf40f-b169-11e7-960b-525400f775ce; SEARCH_ID=070e82cdbbc04cc8b97710c2c0159ce1; ab_test_random_num=0; X_HTTP_TOKEN=d1cf855aacf760c3965ee017e0d3eb96; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; PRE_UTM=; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DsXIrWUxpNGLE2g_bKzlUCXPTRJMHxfCs6L20RqgCpUq%26wd%3D%26eqid%3Dee53adaf00026e940000000559e354cc; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; index_location_city=%E5%85%A8%E5%9B%BD; TG-TRACK-CODE=index_hotjob; login=false; unick=""; _putrc=""; JSESSIONID=ABAAABAAAFCAAEG50060B788C4EED616EB9D1BF30380575; _gat=1; _ga=GA1.2.471681568.1508045060; LGSID=20171015203008-94e1afa5-b1a4-11e7-9788-525400f775ce; LGRID=20171015204552-c792b887-b1a6-11e7-9788-525400f775ce',
                'Host': 'www.lagou.com',
                'Origin': 'https://www.lagou.com',
                'Referer': 'https://www.lagou.com/',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
            }
        }

    再次运行爬虫,首页能正确的抓取了,状态码返回200

    我们要对每一个标签页进行跟进,得到详情页

    rules变成如下:

    rules = (
            Rule(LinkExtractor(allow=r'zhaopin/.*',restrict_css='.sidebar')),
            Rule(LinkExtractor(allow=r'jobs/d+.html',restrict_css='.item_con_list'))  #同样用restrict_css限制跟进范围
        )

    再次运行爬虫scrap'y crawl lagou_c,可以看到详情页也陆续显示出来了

    得到的详情页已经是我们所需要的了,我们需要对页面进行解析,并且不再follow(设置follow为False),当然这个rules目前只做了首页的跟进,还有公司页的跟进和校园的跟进需要进行定义,这一部分因为和首页的分析过程差不多,就不详细说了,我们就以首页标签的提取项为目标,rules如下:

    rules = (
            Rule(LinkExtractor(allow=r'zhaopin',restrict_css='.sidebar')),
            Rule(LinkExtractor(allow=r'jobs',restrict_css='.s_position_list'),callback='parse_item',follow=False),
        )

    对详情页的链接提取后,不再进行跟进,并且使用一个回调函数对页面进行解析,当然解析前需要对我们要提取的字段进行定义。

    2、编写items.py文件(还是那句话,实际写代码进行必要的注释就好,不要每条都写,我这里为了更详细解释,全写了)

    原始代码如下:

    import scrapy
    
    
    class LagouItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        pass

    我们增加字段后代码如下:

    import scrapy
    
    
    class LagouspiderItem(scrapy.Item):
        url = scrapy.Field()   #详情页面的url地址
        name = scrapy.Field() #岗位名称
        salary = scrapy.Field() #薪水
        location = scrapy.Field() #地址
        work_exp = scrapy.Field() #工作经验
        edu_background = scrapy.Field() #学历要求
        type = scrapy.Field() #工作类型
        tags = scrapy.Field() #标签
        release_time = scrapy.Field() #发布时间
        advantage = scrapy.Field() #职位诱惑
        job_desc = scrapy.Field()  #职位描述
        work_addr = scrapy.Field() #工作地址
        company = scrapy.Field() #公司名称

  • 相关阅读:
    变量的创建和初始化
    HDU 1114 Piggy-Bank (dp)
    HDU 1421 搬寝室 (dp)
    HDU 2059 龟兔赛跑 (dp)
    HDU 2571 命运 (dp)
    HDU 1574 RP问题 (dp)
    HDU 2577 How to Type (字符串处理)
    HDU 1422 重温世界杯 (dp)
    HDU 2191 珍惜现在,感恩生活 (dp)
    HH实习 acm算法部 1689
  • 原文地址:https://www.cnblogs.com/sjfeng1987/p/10026032.html
Copyright © 2011-2022 走看看