91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

爬取前程無憂python職位信息的方法步驟

發布時間:2020-06-29 11:50:03 來源:億速云 閱讀:469 作者:清晨 欄目:編程語言

這篇文章將為大家詳細講解有關爬取前程無憂python職位信息的方法步驟,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

爬取前程無憂python職位信息的步驟:

1、分析網頁,查找需要的數據所在位置

網站地址:
https://search.51job.com/list/000000,000000,0000,00,9,99,%2520,2,1.html

(1)進入該網站,輸入關鍵詞“python”,如下:

爬取前程無憂python職位信息的方法步驟

可以發現輸入關鍵字后鏈接也對應出現了“python”關鍵字,根據這個規律可以實現進入任意搜索關鍵詞的網頁。

(2)緊接著檢查網頁源代碼,看看網頁數據是否在源代碼內:

爬取前程無憂python職位信息的方法步驟

可以發現職位的詳情網址、職位名稱、薪資等信息都顯示在網頁源代碼內,確定改數據為靜態數據,可以使用xpath解析語法來獲取。職位的詳情頁也可以根據此方法來判斷是否存在網頁源代碼,結果也是存在的。

(3)我們點擊第二頁后發現網址也對應發生改變:

第一頁:

https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,1.html

第二頁:

https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,2.html

可以發現鏈接的倒數第一個數字發生了變化,由1變成2,由此可以判斷這個位置的數字是控制頁數的。接下來可以實現代碼了。

2、導入需要使用到的模塊,編寫爬取函數以及存儲函數

(1)爬蟲使用到的模塊:

import requests                             # 網絡請求庫
from lxml import etree                      # 解析模塊
import time                                 # 時間模塊
import csv                                  # csv模塊
import urllib3                              # urllib3,主要用來關掉警告信息
from requests.adapters import HTTPAdapter   # HTTPAdapter,主要用來重新請求

(2)__init__初始化函方法:

    def __init__(self):
        self.keyword = input("請輸入搜索關鍵詞:")
        self.url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,{},2,{}.html'  # 網頁url
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}      # 設置請求頭
        self.requests = requests.Session()                           # 創建csv對象,用于保存會話
        self.requests.mount('http://', HTTPAdapter(max_retries=3))   # 增加http請求次數,這里是因為有時候我們這邊網絡不好,導致請求出不來,或者對方沒響應給我們,導致報錯。添加這段代碼可以重新請求
        self.requests.mount('https://', HTTPAdapter(max_retries=3))  # 增加https請求次數,這里是因為有時候我們這邊網絡不好,導致請求出不來,或者對方沒響應給我們,導致報錯。添加這段代碼可以重新請求
        self.header = ['position', 'company', 'wages', 'place', 'education','work_experience', 'release_date', 'limit_people', 'address', 'company_type', 'company_size', 'industry', 'point_information']  # csv頭部信息
        self.fp = open('python招聘職位.csv', 'a', encoding='utf-8', newline='')  # 創建保存csv的句柄
        self.writer = csv.DictWriter(self.fp, self.header)                       # 創建writer,用于后面寫入數據
        self.writer.writeheader()                                                # 保寫入csv頭部信息
        urllib3.disable_warnings()                                               # 下面的請求中移除了ssl認證會生成警告信息,所以這里取消警告輸出

(3)下面單獨實現一個可以獲取總頁數的方法:

def get_end_page(self):  # 該函數可以獲取最后一頁的頁數
        response = self.requests.get(self.url.format(self.keyword, str(1)), headers=self.headers, timeout=4, verify=False)
        text = response.content.decode('gb18030')  # 使用gb18030解碼幾乎適用所有網頁,不適用的網頁只有個別,是從其他網站加載的,解析方式不一樣,直接忽略掉。
        html = etree.HTML(text)
        txt = "".join(html.xpath("//div[@class='dw_page']//div[@class='p_in']/span[1]/text()"))  # 獲取包含總頁數的一段字符串txt
        end_page = int(txt.split('頁', 1)[0][1:])  # 從字符串txt提取總頁數
        return end_page

(4)獲取詳情頁信息的方法:

def parse_url(self, url):
        response = self.requests.get(url=url, headers=self.headers, timeout=5, verify=False)
        try:  # 這里可能會出現解碼錯誤,因為有個別很少的特殊網頁結構,另類來的,不用管
            text = response.content.decode('gb18030')
        except Exception as e:
            print("特殊網頁字節解碼錯誤:{},結束執行該函數,解析下一個詳情url".format(e))
            return  # 直接結束函數,不解析
        html = etree.HTML(text)
        try:      # 如果職位名獲取不到會異常,因為這個詳情url的網頁形式也很特殊,很少會出現這種url,所以就return結束函數,進入下一個詳情url
            position = html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/h2/@title")[0]             # 職位名
        except:
            return
        company = "".join(html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/p[1]/a[1]//text()"))        # 公司名
        wages = "".join(html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/strong/text()"))      # 工資
        informations = html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/p[2]/text()")           # 獲取地點經驗學歷等信息
        informations = [i.strip() for i in informations]  # 將元素兩邊去除空格
        place = informations[0]                                                                            # 工作地點
        education = "".join([i for i in informations if i in '本科大專應屆生在校生碩士'])                   # 通過列表推導式獲取學歷
        work_experience = "".join([i for i in informations if '經驗' in i ])                               # 獲取工作經驗
        release_date = "".join([i for i in informations if '發布' in i])                                   # 獲取發布時間
        limit_people = "".join([i for i in informations if '招' in i])                                     # 獲取招聘人數
        address = "".join(html.xpath("//div[@class='tCompany_main']/div[2]/div[@class='bmsg inbox']/p/text()"))  # 上班地址
        company_type = "".join(html.xpath("//div[@class='tCompany_sidebar']/div[1]/div[2]/p[1]/@title"))   # 公司類型
        company_size = "".join(html.xpath("//div[@class='tCompany_sidebar']/div[1]/div[2]/p[2]/@title"))   # 公司規模
        industry = "".join(html.xpath("//div[@class='tCompany_sidebar']/div[1]/div[2]/p[3]/@title"))       # 所屬行業
        point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]//text()')
        point_information = "".join([i.strip() for i in point_information if i != '\xa0\xa0\xa0\xa0']).replace("\xa0", "")   # 職位信息
        if len(point_information) == 0:       # 有一些詳情url的職位信息的html標簽有點區別,所以判斷一下,長度為0就換下面的解析語法
            point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/text()')
            point_information = "".join([i.strip() for i in point_information])
        if len(point_information) == 0:       # 有一些詳情url的職位信息的html標簽有點區別,所以判斷一下,長度為0就換下面的解析語法
            point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]//tbody//text()')
            point_information = "".join([i.strip() for i in point_information])
        if len(point_information) == 0:       # 有一些詳情url的職位信息的html標簽有點區別,所以判斷一下,長度為0就換下面的解析語法
            point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/ol//text()')
            point_information = "".join([i.strip() for i in point_information])
        item = {'position':position, 'company':company, 'wages':wages, 'place':place, 'education':education, 'work_experience':work_experience, 'release_date':release_date, 'limit_people':limit_people, 'address':address, 'company_type':company_type, 'company_size':company_size, 'industry':industry,'point_information':point_information}  # 把解析到的數據放入字典中
        self.writer.writerow(item)  # 保存數據

(5)完整代碼:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
#
# @Version : 1.0
# @Time    : xxx
# @Author  : xx
# @File    : 51job.py
import requests                             # 網絡請求庫
from lxml import etree                      # 解析模塊
import time                                 # 時間模塊
import csv                                  # csv模塊
import urllib3                              # urllib3,主要用來關掉警告信息
from requests.adapters import HTTPAdapter   # HTTPAdapter,主要用來重新請求
class PositionSpider(object):
    def __init__(self):
        self.keyword = input("請輸入搜索關鍵詞:")
        self.url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,{},2,{}.html'  # 網頁url
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}      # 設置請求頭
        self.requests = requests.Session()                           # 創建csv對象,用于保存會話
        self.requests.mount('http://', HTTPAdapter(max_retries=3))   # 增加http請求次數,這里是因為有時候我們這邊網絡不好,導致請求出不來,或者對方沒響應給我們,導致報錯。添加這段代碼可以重新請求
        self.requests.mount('https://', HTTPAdapter(max_retries=3))  # 增加https請求次數,這里是因為有時候我們這邊網絡不好,導致請求出不來,或者對方沒響應給我們,導致報錯。添加這段代碼可以重新請求
        self.header = ['position', 'company', 'wages', 'place', 'education','work_experience', 'release_date', 'limit_people', 'address', 'company_type', 'company_size', 'industry', 'point_information']  # csv頭部信息
        self.fp = open('python招聘職位.csv', 'a', encoding='utf-8', newline='')  # 創建保存csv的句柄
        self.writer = csv.DictWriter(self.fp, self.header)                       # 創建writer,用于后面寫入數據
        self.writer.writeheader()                                                # 保寫入csv頭部信息
        urllib3.disable_warnings()                                               # 下面的請求中移除了ssl認證會生成警告信息,所以這里取消警告輸出
    def get_end_page(self):  # 該函數可以獲取最后一頁的頁數
        response = self.requests.get(self.url.format(self.keyword, str(1)), headers=self.headers, timeout=4, verify=False)
        text = response.content.decode('gb18030')  # 使用gb18030解碼幾乎適用所有網頁,不適用的網頁只有個別,是從其他網站加載的,解析方式不一樣,直接忽略掉。
        html = etree.HTML(text)
        txt = "".join(html.xpath("//div[@class='dw_page']//div[@class='p_in']/span[1]/text()"))  # 獲取包含總頁數的一段字符串txt
        end_page = int(txt.split('頁', 1)[0][1:])  # 從字符串txt提取總頁數
        return end_page
    def get_url(self, count):
        num = 0                  # 用于判斷是請求響應失敗,還是頁數到底了
        while True:              # 這里設置while是因為有時候請求太快,響應跟不上,會獲取不到數據。也可以使用睡眠的方法。
            num += 1
            response = self.requests.get(url=self.url.format(self.keyword, count), headers=self.headers, timeout=4, verify=False)   # 發起get請求
            text = response.content.decode('gb18030')
            html = etree.HTML(text)
            detail_urls = html.xpath("//div[@class='dw_table']/div[@class='el']//p/span/a/@href")  # 使用xpath語法提取該頁所有詳情url
            if len(detail_urls) == 0:  # 列表長度為零就重新請求,這一步是因為有時候發送請求過快,對方服務器跟不上我們速度,導致返回數據為空,所以下面睡眠一下,重新請求
                time.sleep(2)          # 睡眠一下
                continue
            else:
                break
        return detail_urls         # 返回列表,將詳情url給下一個函數進行解析獲取數據
    def parse_url(self, url):
        response = self.requests.get(url=url, headers=self.headers, timeout=5, verify=False)
        try:  # 這里可能會出現解碼錯誤,因為有個別很少的特殊網頁結構,另類來的,不用管
            text = response.content.decode('gb18030')
        except Exception as e:
            print("特殊網頁字節解碼錯誤:{},結束執行該函數,解析下一個詳情url".format(e))
            return  # 直接結束函數,不解析
        html = etree.HTML(text)
        try:      # 如果職位名獲取不到會異常,因為這個詳情url的網頁形式也很特殊,很少會出現這種url,所以就return結束函數,進入下一個詳情url
            position = html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/h2/@title")[0]             # 職位名
        except:
            return
        company = "".join(html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/p[1]/a[1]//text()"))        # 公司名
        wages = "".join(html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/strong/text()"))      # 工資
        informations = html.xpath("//div[@class='tHeader tHjob']//div[@class='cn']/p[2]/text()")           # 獲取地點經驗學歷等信息
        informations = [i.strip() for i in informations]  # 將元素兩邊去除空格
        place = informations[0]                                                                            # 工作地點
        education = "".join([i for i in informations if i in '本科大專應屆生在校生碩士'])                   # 通過列表推導式獲取學歷
        work_experience = "".join([i for i in informations if '經驗' in i ])                               # 獲取工作經驗
        release_date = "".join([i for i in informations if '發布' in i])                                   # 獲取發布時間
        limit_people = "".join([i for i in informations if '招' in i])                                     # 獲取招聘人數
        address = "".join(html.xpath("//div[@class='tCompany_main']/div[2]/div[@class='bmsg inbox']/p/text()"))  # 上班地址
        company_type = "".join(html.xpath("//div[@class='tCompany_sidebar']/div[1]/div[2]/p[1]/@title"))   # 公司類型
        company_size = "".join(html.xpath("//div[@class='tCompany_sidebar']/div[1]/div[2]/p[2]/@title"))   # 公司規模
        industry = "".join(html.xpath("//div[@class='tCompany_sidebar']/div[1]/div[2]/p[3]/@title"))       # 所屬行業
        point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]//text()')
        point_information = "".join([i.strip() for i in point_information if i != '\xa0\xa0\xa0\xa0']).replace("\xa0", "")   # 職位信息
        if len(point_information) == 0:       # 有一些詳情url的職位信息的html標簽有點區別,所以判斷一下,長度為0就換下面的解析語法
            point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/text()')
            point_information = "".join([i.strip() for i in point_information])
        if len(point_information) == 0:       # 有一些詳情url的職位信息的html標簽有點區別,所以判斷一下,長度為0就換下面的解析語法
            point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]//tbody//text()')
            point_information = "".join([i.strip() for i in point_information])
        if len(point_information) == 0:       # 有一些詳情url的職位信息的html標簽有點區別,所以判斷一下,長度為0就換下面的解析語法
            point_information = html.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/ol//text()')
            point_information = "".join([i.strip() for i in point_information])
        item = {'position':position, 'company':company, 'wages':wages, 'place':place, 'education':education, 'work_experience':work_experience, 'release_date':release_date, 'limit_people':limit_people, 'address':address, 'company_type':company_type, 'company_size':company_size, 'industry':industry,'point_information':point_information}  # 把解析到的數據放入字典中
        self.writer.writerow(item)  # 保存數據
if __name__ == '__main__':
    print("爬蟲開始")
    spider = PositionSpider()                # 創建類的對象spider
    end_page = spider.get_end_page()         # 獲取該職位的總頁數
    print("總頁數:{}".format(str(end_page)))
    for count in range(1, end_page+1):        # 遍歷總頁數
        detail_urls = spider.get_url(count)  # 獲取詳情url方法,接收列表
        for detail_url in detail_urls:       # 遍歷獲取的詳情url
            time.sleep(0.2)                  # 稍微睡眠一下
            spider.parse_url(detail_url)     # 解析詳情頁獲取數據
        print("已爬取第{}頁".format(count))
    spider.fp.close()    # 關閉句柄
    print("爬取結束")

采集結果:

爬取前程無憂python職位信息的方法步驟

關于爬取前程無憂python職位信息的方法步驟就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿合奇县| 遂昌县| 花莲市| 灵寿县| 长岛县| 增城市| 洪江市| 景德镇市| 永康市| 吴江市| 满洲里市| 巴马| 绵阳市| 桐庐县| 扎赉特旗| 通山县| 乌海市| 昌都县| 凌源市| 清远市| 平谷区| 滕州市| 龙山县| 嘉禾县| 裕民县| 桦甸市| 永清县| 临沂市| 夏津县| 湖口县| 海淀区| 沧州市| 马边| 华坪县| 封开县| 雅安市| 惠水县| 绥阳县| 含山县| 东港市| 大悟县|