【python爬蟲專項(27)】拉勾網數據採集(關鍵詞網址不發生變化)

拉勾網登陸後,選擇某城市,搜索任意關鍵字,採集崗位信息數據

起始參考網址:全國數據分析崗位招聘
在這裏插入圖片描述
前一篇是搜索關鍵詞網址發生變化的情況,接下來就處理搜索關鍵詞不發生變化情況下的數據爬取,就以上一篇提及的‘數據分析’作爲關鍵詞,進行相同字段數據的爬取

爬蟲邏輯:【登陸】-【訪問頁面 + 採集崗位信息 - 翻頁】

1)函數式編程

函數1:login(u,username,password) → 【登陸】
         u:起始網址
         username:用戶名
         password:密碼

函數2:get_data(ui,table,page_n) → 【訪問頁面 + 採集崗位信息 - 翻頁
         ui:數據頁面網址
         table:mongo集合對象
         page_n:翻頁次數

2)上一篇文章是以第一種方式獲取字段的內容,那麼這一篇就使用第二種方式

區別在於方法一是找到了字段內容所在的【li】標籤,然後再【li】標籤內部查找對應標籤的信息,方法二是直接在全局的範圍裏面,直接通過xpath定位,然後進行遍歷輸出

前期準備和封裝第一個函數都是和之前的一樣

import re 
import time
import random
import pymongo
from selenium import webdriver


def login(u,username,password):
    browser.get(u)
    browser.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a').click()
    #選擇全國站
    browser.find_element_by_xpath('//*[@id="lg_tbar"]/div/div[2]/ul/li[3]/a').click()
    #點擊登錄按鈕
    user_name = browser.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[2]/div[3]/div[1]/div/div[1]/form/div[1]/div/input')
    #用戶名
    pass_word = browser.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[2]/div[3]/div[1]/div/div[1]/form/div[2]/div/input')
    
    user_name.clear()
    pass_word.clear()
    #清空裏面的內容
    
    user_name.send_keys(username)
    pass_word.send_keys(password)
    #輸入個人信息
    
    browser.find_element_by_xpath('/html/body/div[2]/div[1]/div/div/div[2]/div[3]/div[2]/div[2]/div[2]').click()
    print(browser.current_url)
    #點擊登錄按鈕並返回當前頁面的網址

if __name__ == '__main__':

    browser = webdriver.Chrome()
    login('https://www.lagou.com/', 'xxx','xxx')

這裏完成拉勾網賬號的登錄,和封裝第一個函數

相應字段內容的獲取和時間問題

前一個函數的功能,只是會進入到登錄之後的拉勾網界面,這時候,可以將頁面跳轉到“數據分析”爲關鍵的頁面上,可以執行如下代碼,爲了防止瀏覽器未反應過來,這一部分要給系統一個反應時間(包含了之前的手動輸入驗證碼的時間,建議是15s)

time.sleep(15)
browser.get('https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/p-city_0?px=default#filterBox')
#跳轉到‘數據分析’搜索的界面
browser.find_element_by_xpath('/html/body/div[6]/div/div[2]').click()
#這一步是因爲會彈出來一個廣告,因此需要過濾掉

然後就是進入了以"數據分析"爲關鍵字的招聘信息的界面,這時候先選擇第一頁的內容進行爬蟲試錯,如下:

dic = {}
dic['崗位名稱'] = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[1]/a/h3').text
dic['發佈時間'] = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[1]/span').text
dic['公司名稱'] = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[1]/div[1]/div[2]/div[1]/a').text
info1 = re.split(r'[ /]+', browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[2]/div').text)
dic['薪酬'] = info1[0]
dic['經驗水平'] = info1[1]
dic['學歷要求'] = info1[2]
info2 = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[1]/div[1]/div[2]/div[2]').text.split(' / ')
dic['企業類型'] = info2[0]
dic['融資情況'] = info2[1]
dic['公司規模'] = info2[2]
print(dic)

輸出的結果是:
在這裏插入圖片描述
進行數據驗證,可以確定是需要爬取的數據:
在這裏插入圖片描述
接下來就可以配置數據庫和進行第二個函數的封裝了,首先是進行數據庫的設置(數據庫的創建與命名以及保存數據的集合)

myclient = pymongo.MongoClient('https://localhost:27017/')
db = myclient['拉勾網數據(2)']
datatable = db['data']

三行代碼配置好數據庫的問題,接着就是封裝第三個函數,就是遍歷輸出加上翻頁的功能(模仿人的操作)

def get_data(page_num,table):
    count = 0
    for j in range(page_num):     
        for i in range(1,16):
            dic = {}
            dic['崗位名稱'] = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[{i}]/div[1]/div[1]/div[1]/a/h3').text
            dic['發佈時間'] = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[{i}]/div[1]/div[1]/div[1]/span').text
            dic['公司名稱'] = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[{i}]/div[1]/div[2]/div[1]/a').text
            info1 = re.split(r'[ /]+', browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[{i}]/div[1]/div[1]/div[2]/div').text)
            dic['薪酬'] = info1[0]
            dic['經驗水平'] = info1[1]
            dic['學歷要求'] = info1[2]
            info2 = browser.find_element_by_xpath(f'//*[@id="s_position_list"]/ul/li[{i}]/div[1]/div[2]/div[2]').text.split(' / ')
            dic['企業類型'] = info2[0]
            dic['融資情況'] = info2[1]
            dic['公司規模'] = info2[2]
            table.insert_one(dic)
            print(dic)
            count += 1
       browser.find_element_by_xpath('//*[@id="s_position_list"]/div[2]/div/span[6]'.click()
       print(n)
       
get_data(3,datatable)

運行結果是,程序可以正常運行,也會把數據存放到數據庫,經過檢查覈對發現,並不是我們所要爬取的前三頁數據,只是爬取了第一頁後,瀏覽器翻頁翻到了最後一頁(第30頁),因此嘗試着將3改成10 ,最後輸出的數據全是第30頁的招聘信息
在這裏插入圖片描述
究其原因,發現,原來“下一頁”這個按鈕的出現的位置有一定的差異,自然就導致其對應的標籤位置有所改變,由上面直接輸出30頁,可以推測第一頁的位置和最後一頁的位置是相同的,下面就開始查找

//*[@id="s_position_list"]/div[2]/div/span[6] #第一頁
//*[@id="s_position_list"]/div[2]/div/span[7] #第二頁
//*[@id="s_position_list"]/div[2]/div/span[8] #第三頁
//*[@id="s_position_list"]/div[2]/div/span[9] #第四頁
//*[@id="s_position_list"]/div[2]/div/span[9] #第五頁
//*[@id="s_position_list"]/div[2]/div/span[9] #第二十七頁
//*[@id="s_position_list"]/div[2]/div/span[8] #第二十八頁
//*[@id="s_position_list"]/div[2]/div/span[7] #第二十九頁 這一頁翻完就是最後一頁了 
//*[@id="s_position_list"]/div[2]/div/span[6] #第三十頁

看一下,“下一頁”按鈕的佈置情況:

1)第一頁中,“下一頁”按鈕的位置
在這裏插入圖片描述
2)第三十頁中,“下一頁”按鈕的位置(可以看出是與第一頁相同的)
在這裏插入圖片描述
3)第二頁中,“下一頁”按鈕的位置(多一個按鈕)
在這裏插入圖片描述
4)第三頁中,“下一頁”按鈕的位置(又多一個按鈕)
在這裏插入圖片描述
5)第四頁中,“下一頁”按鈕的位置(又多一個按鈕)
在這裏插入圖片描述
6)第五頁中,“下一頁”按鈕的位置(和第4塊的一致了,之後的都是一致的)
在這裏插入圖片描述
7)第二十八頁中,“下一頁”按鈕的位置(開始少了一塊)
在這裏插入圖片描述
8)第二十九頁中,“下一頁”按鈕的位置(又少一個按鈕)
在這裏插入圖片描述
9)就是第三十頁,和第一頁的位置一樣,因此就可以看出規律,從第一頁至第四頁逐漸加一,最後四頁逐漸減一

最終的修改代碼爲:

if j < 3:
    browser.find_element_by_xpath('//*[@id="s_position_list"]/div[2]/div/span[{}]'.format(6+j)).click()
    sleeptime = 5
    print('程序正在休息......',sleeptime)
    time.sleep(sleeptime)
else:
    browser.find_element_by_xpath(f'//*[@id="s_position_list"]/div[2]/div/span[{9}]').click()
    sleeptime = 5
    print('程序正在休息......',sleeptime)
    time.sleep(sleeptime) 

這裏的停止時間一定需要給夠,不然頁面沒有及時刷新成功,就會導致系統報錯,因爲每一頁的“下一頁”翻頁按鈕都和程序的下一步執行有關係,注意爬取的頁數這裏設置,如果要設置爬取的頁數多少的話不可以超過27,這也是“下一頁”按鈕設置的規律決定的

最終的輸出結果

進行登錄界面和跳轉到以“數據分析”爲關鍵字的招聘頁面
在這裏插入圖片描述
最後的數據爬取過程如下:(這裏選取前十頁進行數據爬取)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章