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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM