selelinum+PhantomJS 爬取拉鉤網職位

使用selenium+PhantomJS爬取拉鉤網職位信息,保存在csv文件至本地磁盤css

拉鉤網的職位頁面,點擊下一頁,職位信息加載,可是瀏覽器的url的不變,說明數據不是發送get請求獲得的。html

咱們不去尋找它的API。這裏使用另外一種方式:使用PhantomJS模擬瀏覽,經過單擊頁面獲取下一頁。web

這裏的PhantomJS是一個沒有界面的瀏覽器。chrome

 1 from selenium import webdriver
 2 import time
 3 import random
 4 
 5 from selenium.webdriver.common.by import By
 6 from selenium.webdriver.support import expected_conditions as EC
 7 from selenium.webdriver.support.ui import WebDriverWait
 8 
 9 '''
10 使用selenium+PhantomJS爬取拉鉤網職位信息,保存到csv文件至本地磁盤
11 須要加請求頭
12 '''
13 
14 
15 '''
16 phantomjs.page.customHeaders.   :自定義請求頭的固定寫法
17 如:定義代理:phantomjs.page.customHeaders.User-Agent
18 '''
19 dc = {
20     'phantomjs.page.customHeaders.User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
21 }
22 
23 # 建立瀏覽器對象
24 browser = webdriver.PhantomJS(executable_path=r'E:\PycharmProjects\pachong\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\phantomjs.exe',desired_capabilities=dc)
25 
26 # 發送請求
27 browser.get('https://www.lagou.com/jobs/list_?labelWords=&fromSearch=true&suginput=')
28 time.sleep(2)
29 
30 # 保存網頁截圖
31 browser.save_screenshot('lagou.png')
32 
33 # 實例化wait對象 設置等待超時時間爲20秒
34 wait = WebDriverWait(browser,20)
35 
36 # # 建立csv文件
37 f = open('lagou.csv','w',encoding='utf-8')
38 
39 while True:
40     # 獲取數據
41     job_list = browser.find_elements_by_css_selector('.item_con_list li')
42     for job in job_list:
43         pname = job.find_element_by_tag_name('h3').text
44         ptime = job.find_element_by_class_name('format-time').text
45         company = job.find_element_by_css_selector('.company_name a').text
46         money = job.find_element_by_class_name('money').text
47         exp = job.find_element_by_class_name('li_b_l').text.split(' ')[1] #這裏的text不取div裏面的標籤的內容,只取div中的內容。類名爲li_b_l的div有兩個,經驗屬於第二個,還有一個工做要求的
48         location = job.find_element_by_tag_name('em').text
49         reqtags = job.find_elements_by_css_selector('.li_b_l span') #div的類是li_b_l,裏面含有不少span標籤.會把工資的那一個也包含進來,後面須要處理
50         reqtags = ' '.join([reqtag.text for reqtag in reqtags][1:]) #每一個條目的第一項是工資的那個,這裏使用列表的切片去掉。
51 
52         # 將數據放入一個列表,便於後面csv文件格式處理,使用,隔開每一項
53         data = [pname,ptime,company,money,exp,location,reqtags]
54         # print(data)
55         f.write(','.join(data) + '\n')
56 
57         print(data)
58     if 'pager_next pager_next_disabled' not in browser.page_source:
59         # 獲取下一頁按鈕
60         wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'pager_next '))) #原網頁中的類的最後有一個空格
61         # 點擊進入下一頁
62         browser.find_element_by_class_name('pager_next ').click()
63         time.sleep(3 + random.random()*1) #時間須要延長一點,時間過短,頁面沒有加載完成,獲取數據會報錯
64     else:
65         break
66 
67 # 關閉文件
68 f.close()

 


selelinum+PhantomJS 爬取拉鉤網職位2

上面的代碼中,使用selenium中的方法提取網頁中的數據,有部分功能很差用,延時比較厲害。這裏使用bs4提取網頁中的數據,速度較快。windows

 1 from selenium import webdriver
 2 import time
 3 import re
 4 import random
 5 from selenium.webdriver.common.by import By
 6 from selenium.webdriver.support import expected_conditions as EC
 7 from selenium.webdriver.support.ui import WebDriverWait
 8 from bs4 import BeautifulSoup
 9 '''
10 selenium+Chrome 抓取拉鉤網職位
11 使用xpath bs4解析。
12 '''
13 
14 browser = webdriver.Chrome(executable_path=r'E:\PycharmProjects\pachong\chromedriver.exe')
15 browser.get('https://www.lagou.com/jobs/list_?labelWords=&fromSearch=true&suginput=')
16 time.sleep(2)
17 f = open('lagou2.csv',mode='w',encoding='utf-8')
18 
19 #設置等待超時時間爲20秒
20 wait = WebDriverWait(browser,20)
21 
22 
23 # #使用Chrome驅動的提供的方法查找網頁元素,在這裏使用列表的分頁,有延時
24 # while True:
25 #     # 獲取數據
26 #     job_list = browser.find_elements_by_css_selector('.item_con_list li')
27 #     for job in job_list:
28 #         pname = job.find_element_by_tag_name('h3').text
29 #         ptime = job.find_element_by_class_name('format-time').text
30 #         company = job.find_element_by_css_selector('.company_name a').text
31 #         money = job.find_element_by_class_name('money').text
32 #         exp = job.find_element_by_class_name('li_b_l').text.split(' ')[1] #這裏的text不取div裏面的標籤的內容,只取div中的內容。類名爲li_b_l的div有兩個,經驗屬於第二個,還有一個工做要求的
33 #         location = job.find_element_by_tag_name('em').text
34 #         reqtags = job.find_elements_by_css_selector('.li_b_l span') #div的類是li_b_l,裏面含有不少span標籤.會把工資的那一個也包含進來,後面須要處理
35 #         reqtags = ' '.join([reqtag.text for reqtag in reqtags][1:]) #每一個條目的第一項是工資的那個,這裏使用列表的切片去掉。
36 #
37 #         # 將數據放入一個列表,便於後面csv文件格式處理,使用,隔開每一項
38 #         data = [pname,ptime,company,money,exp,location,reqtags]
39 #         # print(data)
40 #         f.write(','.join(data) + '\n')
41 #
42 #         print(data)
43 #     if 'pager_next pager_next_disabled' not in browser.page_source:
44 #         # 獲取下一頁按鈕
45 #         wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'pager_next '))) #原網頁中的類的最後有一個空格
46 #         # 點擊進入下一頁
47 #         browser.find_element_by_class_name('pager_next ').click()
48 #         time.sleep(3 + random.random()*1) #時間須要延長一點,時間過短,頁面沒有加載完成,獲取數據會報錯
49 #     else:
50 #         break
51 
52 
53 
54 while True:
55     # 獲取數據
56 
57     wait.until(EC.presence_of_element_located((By.CLASS_NAME,'item_con_list'))) #等待職位信息加載
58 
59     html = browser.page_source
60     html = BeautifulSoup(html,'lxml')
61     job_list = html.select('ul[class="item_con_list"] li')
62 
63     for job in job_list:
64         pname = job.h3.text
65         ptime = job.select('span[class="format-time"]')[0].text
66         company = job.select('div[class="company_name"] a')[0].text
67         money = job.select('span[class="money"]')[0].text
68         exp = job.select('div[class="li_b_l"]')[0].text
69         exp = re.split('\s',exp)[2] #使用正則切割 \s匹配全部空白,這裏主要匹配 空格 和 \n。第三項是工做經驗
70 
71         location = job.select('span[class="add"] em')[0].text
72 
73         tags = job.select('div[class="li_b_l"] span') #tags 匹配出匹配出兩部分,一部分是薪資,一部分是工做要求,後面進行過濾後只要工做要求
74         tag_list = [tag.text for tag in tags[1:]] #這裏過濾掉薪資數據,只留下工做要求
75 
76         # print(tag_list)
77         tags = ' '.join(tag_list)
78         data = [pname,ptime,company,money,exp,location,tags]
79         print(data)
80 
81         f.write(','.join(data) + '\n')
82 
83     if 'pager_next_disabled' not in browser.page_source:
84         # 獲取下一頁
85         wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'pager_next')))
86         browser.find_element_by_class_name('pager_next').click()
87         time.sleep(1+random.random()) #延時過短可能加載未完成。抓取頁面數據程序會報錯,在開頭檢測職位加載等待,這裏時間能夠少一點。
88     else:
89         break
90 
91 f.close()
相關文章
相關標籤/搜索