1. 程式人生 > >Python爬蟲爬取智聯招聘職位資訊

Python爬蟲爬取智聯招聘職位資訊

目的:輸入要爬取的職位名稱,五個意向城市,爬取智聯招聘上的該資訊,並列印進表格中

#coding:utf-8
import urllib2
import re
import xlwt


class ZLZP(object):

    def __init__(self,workname,citys):
        # 記錄查詢工作名稱
self.workname = workname
        # 基礎URL地址
self.url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?'
# 工作名稱
args = 'kw=%s&jl='
%workname # 工作地點 for city in citys: # 判斷城市是否為最後一個 if city == citys[-1]: args += city else: args += city args += '%2B' # kw=python&jl=北京%2B上海%2B南京%2B廣州%2B深圳 # 拼接完整的url地址 self.url += args self.headers = { 'User-Agent'
:'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0' } # 根據頁碼獲取某一頁HTML原始碼 def get_page(self,pageNum): # 1.根據頁碼拼接完整的url地址 getUrl = self.url + '&p=%s'%pageNum # 2.建立request物件 request = urllib2.Request(getUrl,headers=self.headers) try: response = urllib2.urlopen(request) except
Exception ,e: print '獲取第%s頁資料失敗,原因%s'%(pageNum,e) return None else: return response.read() # 從html程式碼中提取總職位數 def get_total(self,html): # 1.準備正則表示式 pattern = re.compile(r'<span class="search_yx_tj.*?em>(.*?)</em>',re.S) # 2.根據正則表示式從原始碼中查詢資料 rs = re.search(pattern,html) # 3.記錄總職位數,計算總頁數 total = int(rs.group(1)) print '共搜尋到%s個相關職位資訊...'%total # 不能被60整除,總頁碼+1 if total%60 == 0: self.totalPage = total/60 else: self.totalPage = total/60+1 # 提取資料函式 def get_data(self,html): # 1.準備正則 # print html pattern = re.compile(r'<table.*?class="newlist.*?<td class="zwmc.*?<a.*?>(.*?)</a>.*?<td class="gsmc.*?_blank">(.*?)</a>.*?<td class="zwyx">(.*?)</td.*?<td class="gzdd">(.*?)</td>',re.S) # 2.從html原始碼中搜索 results = re.findall(pattern,html) # 3.去除資料中標籤 rs_data = [] for rs in results: remove_b = re.compile(r'<.*?>',re.S) name = re.sub(remove_b,'',rs[0]) rs_tp = (name,rs[1],rs[2],rs[3]) rs_data.append(rs_tp) return rs_data # 開始爬蟲函式 def start(self): # 1.獲取第一頁查詢職位的HTML原始碼 html = self.get_page(1) if html == None: return # 2.從html原始碼中提取總職位數 self.get_total(html) # 3.for迴圈迴圈總頁數次(迴圈10次) # 建立workbook物件 workbook = xlwt.Workbook(encoding='utf-8') print type(self.workname) # unicode 將一個str型別的字串轉換為unicode字元 # 中文編碼格式GBK, print type(unicode(self.workname,encoding='utf-8')) name = u'智聯表'+unicode(self.workname,encoding='utf-8') print type(name) sheet = workbook.add_sheet(name) sheet.write(0,0,'職位名稱') sheet.write(0,1,'公司名稱') sheet.write(0,2,'職位月薪') sheet.write(0,3,'工作地點') # count 記錄當前的行號 count = 1 for x in range(1,11): # 1.根據頁碼獲取該頁的HTML原始碼 print '正在寫入第%s頁資料....'%x html = self.get_page(x) if html == None: continue # 2.從html原始碼中提取資料 rs_data = self.get_data(html) # 3.寫入本地檔案 for rs in rs_data: sheet.write(count,0,rs[0]) sheet.write(count,1,rs[1]) sheet.write(count,2,rs[2]) sheet.write(count,3,rs[3]) count+=1 # 儲存檔案 print type(self.workname) filename = u'智聯%s職位資訊.xls'%unicode(self.workname,encoding='utf-8') workbook.save(filename) ''' Python3之前: 要儲存到本地的資料,保證是UTF-8編碼 要在Python中使用的字元,保證是Unicode型別的字元 unicode(self.workname,encoding='utf-8') 字串型別 str 輸入的文字內容、''或""包裹的文字 ''' if __name__ == '__main__': workname = raw_input('請輸入要查詢的工作名稱:') # 存放工作城市 citys = [] # 只要城市小於5個,繼續輸入城市 while len(citys) < 5: city = raw_input('請輸入意向城市,最多輸入5個,輸入0結束:') if city == '0': break citys.append(city) zlzp = ZLZP(workname,citys) zlzp.start()