拉勾網登陸後,選擇某城市,搜索任意關鍵字,採集崗位信息數據
起始參考網址:全國數據分析崗位招聘
前一篇是搜索關鍵詞網址發生變化的情況,接下來就處理搜索關鍵詞不發生變化情況下的數據爬取,就以上一篇提及的‘數據分析’作爲關鍵詞,進行相同字段數據的爬取
爬蟲邏輯:【登陸】-【訪問頁面 + 採集崗位信息 - 翻頁】
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,這也是“下一頁”按鈕設置的規律決定的
最終的輸出結果
進行登錄界面和跳轉到以“數據分析”爲關鍵字的招聘頁面
最後的數據爬取過程如下:(這裏選取前十頁進行數據爬取)