Guest User

Untitled

a guest
Feb 27th, 2024
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.73 KB | None | 0 0
  1. import re
  2. import json
  3. import scrapy
  4. from urllib.parse import urlencode
  5.  
  6. class IndeedJobSpider(scrapy.Spider):
  7.     name = "indeed_jobs"
  8.     custom_settings = {
  9.         'FEEDS': { 'data/%(name)s_%(time)s.csv': { 'format': 'csv',}}
  10.         }
  11.  
  12.     def get_indeed_search_url(self, keyword, location, offset=0):
  13.         parameters = {"q": keyword, "l": location, "filter": 0, "start": offset}
  14.         return "https://www.indeed.com/jobs?" + urlencode(parameters)
  15.  
  16.  
  17.     def start_requests(self):
  18.         keyword_list = ['software engineer']
  19.         location_list = ['California']
  20.         for keyword in keyword_list:
  21.             for location in location_list:
  22.                 indeed_jobs_url = self.get_indeed_search_url(keyword, location)
  23.                 yield scrapy.Request(url=indeed_jobs_url, callback=self.parse_search_results, meta={'keyword': keyword, 'location': location, 'offset': 0})
  24.  
  25.     def parse_search_results(self, response):
  26.         location = response.meta['location']
  27.         keyword = response.meta['keyword']
  28.         offset = response.meta['offset']
  29.         script_tag  = re.findall(r'window.mosaic.providerData\["mosaic-provider-jobcards"\]=(\{.+?\});', response.text)
  30.         if script_tag is not None:
  31.             json_blob = json.loads(script_tag[0])
  32.  
  33.             ## Extract Jobs From Search Page
  34.             jobs_list = json_blob['metaData']['mosaicProviderJobCardsModel']['results']
  35.             for index, job in enumerate(jobs_list):
  36.                 if job.get('jobkey') is not None:
  37.                     job_url = 'https://www.indeed.com/m/basecamp/viewjob?viewtype=embedded&jk=' + job.get('jobkey')
  38.                     yield scrapy.Request(url=job_url,
  39.                             callback=self.parse_job,
  40.                             meta={
  41.                                 'keyword': keyword,
  42.                                 'location': location,
  43.                                 'page': round(offset / 10) + 1 if offset > 0 else 1,
  44.                                 'position': index,
  45.                                 'jobKey': job.get('jobkey'),
  46.                             })
  47.  
  48.            
  49.             # Paginate Through Jobs Pages
  50.             if offset == 0:
  51.                 meta_data = json_blob["metaData"]["mosaicProviderJobCardsModel"]["tierSummaries"]
  52.                 num_results = sum(category["jobCount"] for category in meta_data)
  53.                 if num_results > 1000:
  54.                     num_results = 50
  55.                
  56.                 for offset in range(10, num_results + 10, 10):
  57.                     url = self.get_indeed_search_url(keyword, location, offset)
  58.                     yield scrapy.Request(url=url, callback=self.parse_search_results, meta={'keyword': keyword, 'location': location, 'offset': offset})
  59.    
  60.     def parse_job(self, response):
  61.         location = response.meta['location']
  62.         keyword = response.meta['keyword']
  63.         page = response.meta['page']
  64.         position = response.meta['position']
  65.  
  66.        
  67.         script_tag  = re.findall(r"_initialData=(\{.+?\});", response.text)
  68.         if script_tag is not None:
  69.             json_blob = json.loads(script_tag[0])
  70.             job = json_blob["jobInfoWrapperModel"]["jobInfoModel"]['jobInfoHeaderModel']
  71.             sanitizedJobDescription= json_blob["jobInfoWrapperModel"]["jobInfoModel"]['sanitizedJobDescription']
  72.             yield {
  73.                 'keyword': keyword,
  74.                 'location': location,
  75.                 'page': page,
  76.                 'position': position,
  77.                 'company': job.get('companyName'),
  78.                 'jobkey': response.meta['jobKey'],
  79.                 'jobTitle': job.get('jobTitle'),
  80.                 'jobDescription': sanitizedJobDescription
  81.             }
  82.  
  83.  
  84.  
  85.  
Advertisement
Add Comment
Please, Sign In to add comment