Python進行拉勾網資料爬取框架與思路
爬取內容
用互動式的方式輸入想查詢的職位並迴圈輸出職位簡要資訊,為了方便閱讀,本文使用到的變數並不是以目標變數的英文來命名,而是為了方便而取的變數名,各位大牛請諒解。(因貴網站爬取一定量資料後需要登陸,所以只能爬取前幾頁內容,本文僅供新手參考)
需要用到的第三方庫
from selenium import webdriver
import time
設定Google驅動的路徑
selenium需要用到的谷歌瀏覽器驅動driver可在官方自行下載官方驅動下載網址,找到與自己谷歌瀏覽器對應的前兩位數字版本後,下載好後解壓,複製於當前使用的編輯器python的目錄下的Scripts資料夾中,並在環境變數的系統變數中新增設定此路徑即可。
例如:
lj = r'C:\Users\1111\AppData\Local\Programs\Python\Python36\Scripts'
為了方便理解,如上的命名不規範,請讀者諒解。
用selenium開啟瀏覽器驅動
def turnChrome():
print('正在開啟瀏覽器')
lj = r'C:\Users\1111\AppData\Local\Programs\Python\Python36\Scripts'#路徑變數lj
driver = webdriver.Chrome(executable_path=(lj+"\chromedriver")) #啟動瀏覽器
time.sleep(1)
return driver
目標爬取網站
def driverturn(driver):
driver.get('https://www.lagou.com')
排除干擾項(*)
(1)讀者可先開啟目標爬取網站,使用右鍵檢查的copy中的Xpath路徑擷取下目標量,如開啟網頁後一步一步點選輸入框並查詢,而後點選確定等,詳情可理解如下:
driver.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a').click() #點選'全國'按鈕
driver.find_element_by_xpath('//*[@id="search_input"]').send_keys(jobname) #輸入內容
time.sleep(1)
driver.find_element_by_xpath('//*[@id="search_button"]').click() #查詢
(2)而後是干擾項:
例如網站有廣告紅包需要點選等,對你進行了阻礙無法讓爬蟲執行,那麼可以如下解決:
try:
driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click() #點掉紅包
except:
pass
因為爬取時查詢的資料不同,有些時候會出現干擾項而有些時候並不會,所以當你加入了干擾項排除後如不加入try except模組則會報錯,如加入後邏輯就是干擾項出現時就自動進行取消,如沒有干擾項則跳過,此外,貴網站的廣告紅包xpath經常會變化,例如:
一週前是:
driver.find_element_by_xpath("/html/body/div[8]/div/div[2]").click()
一週後則是:
driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click()
body中的div標籤不同導致爬蟲無法進行,讀者第一次如遇到無法進行爬蟲可先將紅包的xpath重新進行爬取,再繼續嘗試。
還有一個是彈框詢問你是否感興趣的干擾項也可如上進行排除,例如:
try:
driver.find_element_by_xpath('//*[@id="main_container"]/div[1]/div[4]/div/div/div[2]/button').click()
except:
pass
整理後進行放入方法
def ganrao(driver,jobname): #進行干擾項排除
driver.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a').click() #點選全國
driver.find_element_by_xpath('//*[@id="search_input"]').send_keys(jobname) #輸入
time.sleep(1)
driver.find_element_by_xpath('//*[@id="search_button"]').click() #查詢
try:
driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click() #點掉紅包
except:
pass
try:
driver.find_element_by_xpath('//*[@id="main_container"]/div[1]/div[4]/div/div/div[2]/button').click()
except:
pass
進行爬取
自行開啟查詢後,可看到一整頁的職位資訊,然後選其中一個進行右鍵xpath索取,然後小編髮現一頁有16個數據,可用for迴圈進行逐個爬取,如下:
def Paqu(driver,yeshu):
CPname = [] #公司名
Jobname = [] #職位名
XZJY = [] #薪資經驗
Address = [] #地址
for num in range(yeshu):
time.sleep(1)
for i in range(1, 16): # //*[@id="s_position_list"]/ul/li[1]/div[1]/div[2]/div[1]/a
a = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[2]/div[1]/a'.format(i))
b = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/h3'.format(i))
c = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[2]/div'.format(i))
d = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/span/em'.format(i))
CPname.append(a.text)
Jobname.append(b.text)
XZJY.append(c.text)
Address.append(d.text)
if yeshu-num == 1:
print('爬取結束')
else:
driver.find_element_by_class_name("pager_next").click()
driver.quit()
return CPname,Jobname,XZJY,Address
如上中式英語的變數方便理解,如有不適請見諒。
存入文字
拿到四個資料的列表後,可進行資料清洗的儲存工作了:
def Save(CPname,Jobname,XZJY,Address):
with open('職位原始記錄.txt','w+',encoding='utf-8') as f:
#l1 = ['ID','公司名','職位名','薪資','經驗','學歷','地址']
for i in range(len(CPname)):
k = str(XZJY[i]).replace(" / "," ").split(' ')
l2 = [str(i+1),CPname[i],Jobname[i],k[0],k[1],k[2],Address[i]]
#dabao = str(dict(zip(l1,l2))).replace("'",'"')
f.write(str(l2).replace('[','').replace(']','')+'\n')
print(l2)
可以清洗成自己想要的樣子,這個讀者自行編寫。
全部原始碼
#coding=utf-8
from selenium import webdriver
import time
import sqlite3
def turnChrome():
print('正在開啟瀏覽器')
lj = r'C:\Users\38376\AppData\Local\Programs\Python\Python36\Scripts'
driver = webdriver.Chrome(executable_path=(lj+"\chromedriver")) #啟動瀏覽器
time.sleep(1)
return driver
def driverturn(driver):
driver.get('https://www.lagou.com')
def ganrao(driver,jobname): #進行干擾項排除
driver.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a').click() #點選全國
driver.find_element_by_xpath('//*[@id="search_input"]').send_keys(jobname) #輸入
time.sleep(1)
driver.find_element_by_xpath('//*[@id="search_button"]').click() #查詢
try:
driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click() #點掉紅包
except:
pass
try:
driver.find_element_by_xpath('//*[@id="main_container"]/div[1]/div[4]/div/div/div[2]/button').click()
except:
pass
def Paqu(driver,yeshu):
CPname = []
Jobname = []
XZJY = []
Address = []
for num in range(yeshu):
time.sleep(1)
for i in range(1, 16): # //*[@id="s_position_list"]/ul/li[1]/div[1]/div[2]/div[1]/a
a = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[2]/div[1]/a'.format(i))
b = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/h3'.format(i))
c = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[2]/div'.format(i))
d = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/span/em'.format(i))
CPname.append(a.text)
Jobname.append(b.text)
XZJY.append(c.text)
Address.append(d.text)
if yeshu-num == 1:
print('爬取結束')
else:
driver.find_element_by_class_name("pager_next").click()
driver.quit()
return CPname,Jobname,XZJY,Address
def Save(CPname,Jobname,XZJY,Address):
with open('職位原始記錄.txt','w+',encoding='utf-8') as f:
#l1 = ['ID','公司名','職位名','薪資','經驗','學歷','地址']
for i in range(len(CPname)):
k