爬取內容
用互動式的方式輸入想查詢的職位并回圈輸出職位簡要資訊,為了方便閱讀,本文使用到的變數并不是以目標變數的英文來命名,而是為了方便而取的變數名,各位大牛請諒解,(因貴網站爬取一定量資料后需要登陸,所以只能爬取前幾頁內容,本文僅供新手參考)
需要用到的第三方庫
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 = 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)
if __name__=='__main__':
jobname = input('請輸入你想查詢的職位名:')
yeshu = int(input('你想查詢多少頁,最高30頁:'))
driver = turnChrome()
driverturn(driver)
ganrao(driver,jobname)
CPname,Jobname,XZJY,Address = Paqu(driver,yeshu)
Save(CPname,Jobname,XZJY,Address)
如有單看原始碼有不理解的地方可以看看上面的小步驟中說明喔!
期待點贊和收藏
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231006.html
標籤:python
