scrapy使用之爬取智聯招聘

23375 ワード

智聯招聘は動的にファイルをロードしてデータを取得するので、最初に解析したurlはホームページのアドレスではなく、jsonファイルで、jsonファイルを探す方法です.各仕事の具体的なウェブサイトを見ることで法則を知る.https://job.zhaopin.com/XXXXX.htmで、XXXXはjsonファイルのnumberに対応する値です.手順:
  • jsonファイルを解析し、すべてのnumberに対応する値
  • を得る.
  • 新しいウェブサイト
  • をパッチで入手
  • はウェブサイトに入って、自分の欲しい内容を得てウェブサイトに入って、自分の欲しい内容のソースコードを得ます:
  • # -*- coding: utf-8 -*-
    import scrapy
    from  scrapy import Request
    import json
    
    from JobScrapy.items import Job
    
    
    class ZhilianSpider(scrapy.Spider):
        name = 'zhilian'
        #allowed_domains = ['www.zhaopin.com']
        #start_urls = ['https://jobs.zhaopin.com/156244110251133.htm']
        start_urls = ['https://fe-api.zhaopin.com/c/i/sou?start=0&pageSize=60&cityId=489&industry=10100']
        def parse(self,response):
            js=json.loads(response.body)
            #print(js['data'])
            res=js['data']['results']
            for i in res:
                num=i['number']
                # https: // jobs.zhaopin.com / CZ486770730J00164642602.htm
                url='https://jobs.zhaopin.com/'+str(num)+'.htm'
                yield Request(url=url, callback=self.parse_job)
            for i in range(1,2):
                url='https://fe-api.zhaopin.com/c/i/sou?start='+str(i*60)+'0&pageSize=60&cityId=489&industry=10100'
                yield Request(url=url,callback=self.parse)
        def parse_job(self, response):
            #print(response.text)
            job_name=response.css('.l.info-h3::text').extract_first('')
            salary=response.css('.l.info-money strong::text').extract_first('')
            company=response.css('.company.l a::text').extract_first('')
            address=response.css('.info-three.l span a::text').extract_first('')
            all=response.css('.info-three.l span::text').extract()
            expericnce=all[0]
            gradute=all[1]
            num=all[2]
            # light=response.css('.pos-info-tit').extract()
            position=response.css('.pos-ul p::text').extract()
            if position==[]:
                position=response.css('.pos-ul p span::text').extract()
            address_extract=response.css('.add-txt::text').extract_first('')
            company_intro=response.css('.intro-content::text').extract()
            company_area=response.css('.promulgator-ul.cl li strong a::text').extract_first('')
            company_type=response.css('.promulgator-ul.cl li strong::text').extract()
            # print('  ',job_name)
            # print('  ',salary)
            # print('  ',company)
            # print('  ',gradute)
            # print('  ',address)
            # print('    ',company_type)
            # print('    ',str(position))
            # print('    ',address_extract)
            # print('    ',str(company_intro))
            # print('    ',company_area)
            job=Job()
            job['job_name']=job_name
            job['salary']=salary
            job['company'] =company
            job['address'] =address
            job['expericnce'] =expericnce
            job['gradute'] =gradute
            job['num'] = num
            job['position'] =position
            job['address_extract'] =address_extract
            job['company_intro'] =company_intro
            job['company_area'] =company_area
            job['company_type'] =company_type
            yield  job
    

    得られたデータをcsvファイルに保存する:items.py
    class Job(scrapy.Item):
        job_name = scrapy.Field()
        salary = scrapy.Field()
        company = scrapy.Field()
        address = scrapy.Field()
        position=scrapy.Field()
        address_extract = scrapy.Field()
        company_intro = scrapy.Field()
        company_area = scrapy.Field()
        company_type =scrapy.Field()
        expericnce=scrapy.Field()
        gradute=scrapy.Field()
        num=scrapy.Field()
    

    pipeline.pyファイル
    class Pipeline_ToCSV(object):
    
        def __init__(self):
            # csv     ,      
            store_file = os.path.dirname(__file__) + '/spiders/job.csv'
            #   (  )  
            self.file = open(store_file, 'w+',newline='')
            # csv  
            self.writer = csv.writer(self.file)
    
        def process_item(self, item, spider):
            self.writer.writerow((item['job_name'],item['salary'],item['company'],item['address'],item['position'],item['address_extract'],item['company_intro'],item['company_area'],item['company_type'],item['expericnce'],item['gradute'],item['num']))
            return item
    
        def close_spider(self, spider):
            #               
            self.file.close()
    

    setting.py
    ROBOTSTXT_OBEY = False
    ITEM_PIPELINES = {
       'JobScrapy.pipelines.JobscrapyPipeline': 300,
        'JobScrapy.pipelines.Pipeline_ToCSV':100
    }
    

    main.py:プログラムエントリ
    import os
    import sys
    from scrapy.cmdline `import` execute
    data=os.path.abspath(__file__)#    
    dir_file=os.path.dirname(data)#   
    sys.path.append(dir_file)
    execute(['scrapy','crawl','zhilian'])
    

    問題があれば、すぐに指定してください.ありがとうございます.