python scrapy爬取智联招聘全站的公司和职位信息(二)

从网页中提取相关信息

**公司页面**: 公司的url,公司名称,规模,行业,在招岗位数量,邀面试数

1. 在scrapy shell中调试

在terminal/CMD中输入
scrapy shell

2019-04-08 22:32:43 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    
[s]   item       {}
[s]   settings   
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser

出现以上信息时,继续输入

headers = {
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
resp = scrapy.Request(url='https://jobs.zhaopin.com/CC120752053J00179220206.htm',headers=headers)
fetch(resp)
2019-04-08 22:33:56 [scrapy.core.engine] INFO: Spider opened
2019-04-08 22:33:57 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)

出现上述字样后,输入response即可查看到连接状态

In [4]: response
Out[4]: <200 https://jobs.zhaopin.com/CC120752053J00179220206.htm>

2. 在职位页面提取数据

接上文,我们需要的数据是这些内容
职业页面: 职位的url,职位标题,工资,地区,学历,招聘人数
python scrapy爬取智联招聘全站的公司和职位信息(二)_第1张图片
上图展示了,我们需要的信息与信息所在的位置
开始在scrapy shell中查找相关数据

  1. 更新时间 update_time

       <span class="summary-plane__time"><i class="iconfont icon-update-time">i>更新于  4月4日span>
    

    可以通过直接找到summary-plane__timed得出

    In [5]: response.css('.summary-plane__time::text').get()
    Out[5]: '更新于  4月4日'
    
  2. job_title

    <h3 class="summary-plane__title">西南分公司信息技术岗h3>
    

    可以直接通过summary-plane__title得出

    In [4]: response.css('h3.summary-plane__title::text').get()
    Out[4]: '西南分公司信息技术岗'
    
  3. salary

    <span class="summary-plane__salary">6千-8千span>
    

    可以直接通过summary-plane__title得出

    In [5]: response.css('.summary-plane__salary::text').get()
    Out[5]: '6千-8千'
    
  4. job_area

    <li><a href="//www.zhaopin.com/chengdu/" target="_blank">成都a><span>高新西区span>li>
    

    通过xpath找到summary-plane__info下的第一个li标签,

    In [12]: response.xpath('//*[@class="summary-plane__info"]/li[1]').get()
    Out[12]: '
  5. 成都高新西区
  6. '

    先这样提取,后续使用正则提取出具体的地址

  7. experience
    接下来4个字段需要修改下li[]里面的数字即可

    In [13]: response.xpath('//*[@class="summary-plane__info"]/li[2]/text()').get()
    Out[13]: '3-5年'
    
  8. education

    In [14]: response.xpath('//*[@class="summary-plane__info"]/li[3]/text()').get()
    Out[14]: '本科'
    
  9. recruit_nums

    In [15]: response.xpath('//*[@class="summary-plane__info"]/li[4]/text()').get()
    Out[15]: '招1人'
    
  10. jobs_url

    In [16]: response.url
    Out[16]: 'https://jobs.zhaopin.com/CC120752053J00179220206.htm'
    

3. 在公司页面提取数据

接上文,我们需要的数据是这些内容
公司页面: 公司的url,公司名称,规模,行业,在招岗位数量,邀面试数
python scrapy爬取智联招聘全站的公司和职位信息(二)_第2张图片
python scrapy爬取智联招聘全站的公司和职位信息(二)_第3张图片
上图展示了,我们需要的信息与信息所在的位置

  1. company_url

    In [21]: response.url
    Out[21]: 'http://company.zhaopin.com/CC120752053.htm'
    
  2. company_title

    In [22]: response.css('.overview__title h1::text').get()
    Out[22]: '中泰证券股份有限公司'
    
  3. company_scale

    In [24]: response.css('.overview__detail-size span::text').get()
    Out[24]: '1000-9999人'
    
  4. company_industry

    In [23]: response.css('.overview__detail-industry span::text').get()
    Out[23]: '基金、证券、期货、投资'
    
  5. recruit_info

    In [25]: response.css('.com-interview__item span::text').get()
    Out[25]: '312'
    
  6. invite_nums
    而我们查找邀请数量时,却发现邀请数量显示为 –

    In [36]: response.css('.com-interview__item').getall()
    Out[36]:
    ['
  7. 312 在招职位
  8. '
    , '']

    我们可以发现,在span中数值为 --,并不是网页上显示的48

    <span class="com-interview__item__num">--span> 
    

    因为共邀数量是由js加载的
    python scrapy爬取智联招聘全站的公司和职位信息(二)_第4张图片
    可以看到在这里返回了一个json文件,其中的data就是我们要找的48
    接下来,我们看下这个request请求的内容
    python scrapy爬取智联招聘全站的公司和职位信息(二)_第5张图片
    经过验证请求头为
    https://fe-api.zhaopin.com/c/i/company/interview?rootCompanyId=12075205&companyId=12075205
    其中companyId 正好是我们公司url后面数字,这里可以使用正则提取出url中的数字

    import re
    company_id = re.match('[1-9]\d+[1-9]', company_url)
    

    得到company_id后,拼接url并访问

    invite_api = 'https://fe-api.zhaopin.com/c/i/company/interview?rootCompanyId={0}&companyId={1}'.format(
                company_id, company_id)
    headers = {
                'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    rs = requests.get(url=invite_api, header=headers).text 
    

    随后再从re总取出我们需要的48

    json.loads(rs)['data']['data']
    
    [Running] python -u "/Users/so/Desktop/test3.py"
    48
    

你可能感兴趣的:(爬虫)