scrapy项目2:爬取智联招聘的金融类高端岗位(spider类)

---恢复内容开始---

今天我们来爬取一下智联招聘上金融行业薪酬在50-100万的职位。

第一步:解析解析网页

当我们依次点击下边的索引页面是,发现url的规律如下:

第1页:http://www.highpin.cn/zhiwei/ci_180000_180100_as_50_100.html

第2页:http://www.highpin.cn/zhiwei/ci_180000_180100_as_50_100_p_2.html

第3页:http://www.highpin.cn/zhiwei/ci_180000_180100_as_50_100_p_3.html

看到第三页时,用我小学学的数据知识,我便已经找到了规律,哈哈,相信大家也是!

接下来说说我要爬取的目标吧:

如下图:我想要得到的是:职位名称、薪资范围、工作地点、发布时间

借助谷歌的xpath我就着手解析和提取这些数据了,这里不做分析,在代码中体现

第二步:项目实现 通过 scrapy startproject zhilian创建项目,结构如下:

   

1. items.py

# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy
class ZhilianItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 职位
    position = scrapy.Field()
    # 公司名称
    company = scrapy.Field()
    # 薪资
    salary = scrapy.Field()
    # 工作地点
    place = scrapy.Field()
    # 发布时间
    time = scrapy.Field()

 2.爬虫文件:highpin.py 通过命令scrapy genspider highpin 'highpin.cn'创建

# -*- coding: utf-8 -*-
import scrapy
from zhilian.items import ZhilianItem
class HighpinSpider(scrapy.Spider):
  # 爬虫名,创建文件时给定
    name = "highpin"
    allowed_domains = ["highpin.cn"]
    url = 'http://www.highpin.cn/zhiwei/ci_180000_180100_as_50_100'
    # 用于构造url的参数
    offset = 1
    start_urls = [url + '.html']
    def parse(self, response):
        # 用xpath对网页内容进行解析,返回的是一个选择器列表
        position_list = response.xpath('//div[@class="c-list-box"]/div/div[@class="clearfix"]')
        item = ZhilianItem()
        print '------------------------------'
        print len(position_list)
        print '-----------------------------------'
        for pos in position_list:
            # 这里的item对应于items.py文件中的字段
            item['position'] = pos.xpath('./div/p[@class="jobname clearfix"]/a/text()').extract()[0]
            item['company'] = pos.xpath('./div/p[@class="companyname"]/a/text()').extract()[0]
            item['salary'] = pos.xpath('./div/p[@class="s-salary"]/text()').extract()[0]
            item['place'] = pos.xpath('./div/p[@class="s-place"]/text()').extract()[0]
            item['time'] = pos.xpath('./div[@class="c-list-search c-wid122 line-h44"]/text()').extract()[0]     
            yield item
        if self.offset < 150:
            self.offset += 1
            # 构建下一个要爬取的url
            url = self.url + '_p_' + str(self.offset) + '.html'
            print url
            # 发送请求,并调用parse进行数据的解析处理
            yield scrapy.Request(url,callback=self.parse)     

 

3.pipelines.py管道文件用于将数据存于本地

# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json
class ZhilianPipeline(object):
    def __init__(self):
        # 初始化是创建本地文件
        self.filename = open('position.json','w')
    def process_item(self, item, spider):
        将python数据通过dumps转换成json数据
        text = json.dumps(dict(item),ensure_ascii=False) + '\n'
        # 将数据写入文件
        self.filename.write(text.encode('utf-8'))
        return item
    def close_spider(self,spider):
        # 关闭文件
        self.filename.close()

 

4.settings.py文件

  说明1:在settings.py中首先要配置管道文件,如下图:

  

  说明2:USER_AGENT,起初我在settings中所使用的user-agent为:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36

  运行爬虫后,如下图:

  

  如上图所示,服务器对我要访问的url做了重定向,复制重定向后的url到浏览器如下图:

  

  显然,这个页面并没有我们想要的信息,这就是一种反扒策略

  为了解决这个问题,我就试着将USER_AGENT 更换为:Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.

   

  再次通过 scrapy crawl highpin启动爬虫,发现爬虫程序已可以正常爬取

5.启动爬虫 命令:scrapy crawl highpin

   

  数据文件内容

   

  

  

 

 

 

 

 

  

  

 

 

 

  

 

 

 

 

 

---恢复内容结束---

posted @ 2018-05-31 15:42  猴子吃果冻  阅读(592)  评论(0编辑  收藏  举报