拉勾網登陸後,選擇某城市,搜索任意關鍵字,採集崗位信息數據
起始參考網址:拉勾網
爬蟲邏輯:【登陸】-【分頁網頁url採集】-【訪問頁面 + 採集崗位信息】
這裏按照“數據挖掘”爲關鍵字搜索(注意拉勾網針對不同搜索的關鍵字網址的結構是不一樣的,比如搜索“數據挖掘”和“數據分析”)
比如:以數據挖掘爲關鍵字的搜索(網址會發生變化的)
以“數據分析”爲關鍵字的搜索(網頁是不會發生變化的)
1)函數式編程
函數1:login(u,username,password) → 【登陸】
u:起始網址
username:用戶名
password:密碼
函數2:get_urls(n) → 【分頁網頁url採集】
這裏按照“數據挖掘”關鍵字
https://www.lagou.com/shanghai-zhaopin/shujuwajue/2/?filterOption=2
https://www.lagou.com/shanghai-zhaopin/shujuwajue/3/?filterOption=3
https://www.lagou.com/shanghai-zhaopin/shujuwajue/4/?filterOption=4
https://www.lagou.com/shanghai-zhaopin/shujuwajue/5/?filterOption=5
n:頁數參數
結果:得到一個分頁網頁的list
函數3:get_data(ui,table) → 【訪問頁面 + 採集崗位信息】
ui:數據頁面網址
table:mongo集合對象
2)採集字段
崗位名稱、發佈時間、薪資、經驗要求、學歷要求、企業、行業、融資情況、企業規模,如下
實戰講解
步驟一、前期準備
import re
import time
import pymongo
from selenium import webdriver
if __name__ == '__main__':
browser = webdriver.Chrome()
browser.get("https://www.lagou.com/")
該部分的功能是導入相關的庫,和調用各個瀏覽器進入拉勾網界面,彈出如下窗口
步驟二、進行登錄
這裏選取全國站,然後進行個人信息登錄,過程即是找到各個位置對應的xpath路徑,然後click,在需要填寫用戶名和密碼的地方要先清空裏面的內容,然後輸入自己的信息,如下
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('xxx')
pass_word.send_keys('xxx')
#輸入個人信息
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)
#點擊登錄按鈕並返回當前頁面的網址
輸出的結果爲:https://www.lagou.com/(並會彈出驗證碼,這時候可以使用人工點擊的方式,也可以調用api)
步驟三、封裝第一個函數
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')
這一部分注意用戶名和密碼對象與傳遞的參數不要使用完全相同的字符,否則系統無法識別,運行上述代碼後會跳出個圖片驗證碼的界面,手動選擇即可
步驟四、獲取要爬取的url,直接封裝第二個函數
通過翻頁發現,這些網頁有明顯的規律,因此可以直接進行封裝函數,如下
def get_urls(n):
lst = []
for i in range(1,n+1):
ui = f'https://www.lagou.com/shanghai-zhaopin/shujuwajue/{i}/?filterOption={i}'
lst.append(ui)
return lst
urllst = get_urls(10)
print(urllst)
輸出結果爲:(經測試每個網址都可以正常打開)
[‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/1/?filterOption=1’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/2/?filterOption=2’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/3/?filterOption=3’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/4/?filterOption=4’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/5/?filterOption=5’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/6/?filterOption=6’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/7/?filterOption=7’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/8/?filterOption=8’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/9/?filterOption=9’,
‘https://www.lagou.com/shanghai-zhaopin/shujuwajue/10/?filterOption=10’]
步驟五、進行相關字段內容的獲取並定義第三個函數
首先進行一各字段內容的試錯,選取一個頁的網址,打開後查找崗位名稱(也可以是其他的字段)對應的xpath信息,可是所有的招聘內容都被放在了【ul】標籤裏面,然後具體的每個招聘信息都是在【li】標籤裏面,因此要獲得崗位字段的內容,可以先定位到【li】標籤(當然可以直接定位到崗位字段的標籤,屬於第二種方式)
browser.get(urllst[0])
ul = browser.find_element_by_xpath('//*[@id="s_position_list"]/ul')
lis = ul.find_elements_by_tag_name('li')
for li in lis:
dic = {}
dic['崗位名稱'] = li.find_element_by_tag_name('h3').text
print(dic)
輸出的結果爲:
那麼如果直接採用第二種方式進行爬取數據,所有的信息都是在【li】標籤下,因此,每個招聘的崗位對應的【li】標籤的序號不同,而每頁的招聘數據都是15條,故可以使用如下代碼獲取崗位名稱的信息,如下
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
print(dic)
輸出結果如下:(和上面的一樣,接下來的操作是按照第一種方式進行其他內容的獲取,當然也可以按照第二種方式繼續)
接着就是獲取其它字段的信息了,重點在於info1和info2中的信息獲取
for li in lis:
dic = {}
dic['崗位名稱'] = li.find_element_by_tag_name('h3').text
dic['發佈時間'] = li.find_element_by_class_name('format-time').text
dic['公司名稱'] = li.find_element_by_class_name('company_name').text
info1 = re.split(r'[ /]+',li.find_element_by_class_name('li_b_l').text)
dic['薪酬'] = info1[0]
dic['經驗水平'] = info1[1]
dic['學歷要求'] = info1[2]
info2 = li.find_element_by_class_name('industry').text.split(' / ')
dic['企業類型'] = info2[0]
dic['融資情況'] = info2[1]
dic['公司規模'] = info2[2]
print(dic)
輸出的結果爲:(截取部分)
接下來就可以配置數據庫和進行第三個函數的封裝了,首先是進行數據庫的設置(數據庫的創建與命名以及保存數據的集合)
myclient = pymongo.MongoClient('https://localhost:27017/')
db = myclient['拉勾網數據(1)']
datatable = db['data']
三行代碼配置好數據庫的問題,接着就是封裝第三個函數
def get_datas(u,table):
browser.get(u)
ul = browser.find_element_by_xpath('//*[@id="s_position_list"]/ul')
lis = ul.find_elements_by_tag_name('li')
n = 0
for li in lis:
dic = {}
dic['崗位名稱'] = li.find_element_by_tag_name('h3').text
dic['發佈時間'] = li.find_element_by_class_name('format-time').text
dic['公司名稱'] = li.find_element_by_class_name('company_name').text
info1 = re.split(r'[ /]+',li.find_element_by_class_name('li_b_l').text)
dic['薪酬'] = info1[0]
dic['經驗水平'] = info1[1]
dic['學歷要求'] = info1[2]
info2 = li.find_element_by_class_name('industry').text.split(' / ')
dic['企業類型'] = info2[0]
dic['融資情況'] = info2[1]
dic['公司規模'] = info2[2]
table.insert_one(dic)
n += 1
return n
接着就是程序的運行函數和錯誤異常處理以及輸出可視化的過程了
data_count = 0
error_lst = []
for u in urllst:
try:
data_count += get_datas(u,datatable)
sleep_time = random.randint(1,5)
print(f'已爬取並收集{data_count}條數據')
print('休眠時間中......',sleep_time)
time.sleep(sleep_time)
except:
error_lst.append(u)
print('數據爬取失敗,該網址爲:',u)
最終的運行及輸出結果如下
數據庫中的數據如下:(部分截圖)