天天看點

入坑爬蟲(七)selenium爬取某網站招聘資訊

#1 什麼是selenium

Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,Selenium 可以直接運作在浏覽器上,它支援所有主流的浏覽器(包括PhantomJS這些無界面的浏覽器),可以接收指令,讓浏覽器自動加載頁面,擷取需要的資料,甚至頁面截屏.

#2 PhantomJS的介紹

PhantomJS 是一個基于Webkit的“無界面”(headless)浏覽器,它會把網站加載到記憶體并執行頁面上的 JavaScript

下載下傳位址:http://phantomjs.org/download.html
           

#3 Chromedriver的介紹

Chromedriver 也是一個能夠被selenium驅動的浏覽器,但是和PhantomJS的差別在于它是有界面的

下載下傳位址:https://npm.taobao.org/mirrors/chromedriver
           

#4 driver的安裝

最簡單的安裝方式是:直接将上面下載下傳好的驅動,放到python的安裝路徑下.(如果會配置環境變量的小夥伴也可以自己調整)

#5 chromedriver安裝示例

----- Windows 下安裝方式
chromedriver_win32.zip : 版本 ChromeDriver v2.32 (2017-08-30)
(支援 Chrome v59-61)

1. 解壓 chromedriver_win32.zip
2. 将 chromedriver 移動到 Python安裝目錄下
(其實放哪都可以,但是需要配環境變量,放Python安裝目錄下省事)


注意:Chromedriver和電腦上的chrome版本有對應關系,建議使用最新的Chromedriver版本并且更新chrome浏覽器到最新版
           

映射表:

入坑爬蟲(七)selenium爬取某網站招聘資訊

#selenium的基本使用

1 加載網頁:

selenium通過控制浏覽器,是以對應的擷取的資料都是elements中的内容

from selenium import webdriver 
# 指定driver的絕對路徑
# driver = webdriver.PhantomJS() 
driver = webdriver.Chrome()
# 向一個url發起請求
driver.get("https://www.baidu.com")
# 把網頁儲存為圖檔
driver.save_screenshot("baidu.png")
# 退出模拟浏覽器
driver.quit() # 一定要退出!不退出會有殘留程序!
           

2 定位和操作:

以百度搜尋為例

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_id('su').click()

time.sleep(6)
driver.quit()
           

3 檢視請求資訊:

driver.page_source # 檢視網頁源碼
driver.get_cookies() # # 擷取目前浏覽器的全部cookies
driver.current_url # 擷取目前頁面的url
           

4 退出

driver.close() #退出目前頁面
driver.quit()  #退出浏覽器

           

小結

selenium的導包:from selenium import webdriver

selenium建立driver對象:webdriver.PhantomJS()

selenium請求資料:driver.get(“http://www.baidu.com/”)

selenium檢視資料: driver.page_source

關閉無界面浏覽器: driver.quit()

根據id定位元素: driver.find_element_by_id(“kw”)

操作點選事件: click()

給輸入框指派:send_keys()

案例:爬取某網站招聘資訊

from selenium import webdriver
import time

class Lagou(object):

    def __init__(self, name, password):
        opt = webdriver.ChromeOptions()
        opt.add_argument('headless')
        self.driver = webdriver.Chrome()# chrome_options=opt
        self.emal = name
        self.password = password

    def Login(self):

        self.driver.get('https://passport.lagou.com/login/login.html')
        name = self.driver.find_element_by_xpath('/html/body/section/div[1]/div[2]/form/div[1]/input')
        name.send_keys(self.name)
        pwd = self.driver.find_element_by_xpath('/html/body/section/div[1]/div[2]/form/div[2]/input')
        pwd.send_keys(self.password)
        self.driver.find_element_by_xpath('/html/body/section/div[1]/div[2]/form/div[5]/input').click()
        time.sleep(2)
        soso = self.driver.find_element_by_xpath('//*[@id="search_input"]')
        soso.send_keys('爬蟲')
        self.driver.find_element_by_xpath('//*[@id="search_button"]').click()


    def get_url(self):
        data_list = self.driver.find_elements_by_xpath('//*[@id="s_position_list"]/ul/li/div[1]/div[1]/div[1]/a')
        url_list = list()
        for data in data_list:
            url = data.get_attribute('href')
            url_list.append(url)
        return url_list

    def page_next(self):
        js = 'scrollTo(0,4000)'
        self.driver.execute_script(js)
        self.driver.find_element_by_xpath('//*[@id="s_position_list"]/div[2]/div/span[6]').click()


    def parse_data(self, url):

        f = self.driver.find_element_by_xpath
        self.driver.get(url)
        work_list = list()
        temp = dict()
        temp['company'] = f('/html/body/div[2]/div/div[1]/div/div[1]').text
        temp['work'] = f('/html/body/div[2]/div/div[1]/div/span').text
        temp['require'] = f('/html/body/div[2]/div/div[1]/dd/p[1]').text
        temp['welfare'] = f('//*[@id="job_detail"]/dd[1]/p').text
        temp['work_req'] = f('//*[@id="job_detail"]/dd[2]').text.replace('\n', '')
        temp['add'] = f('//*[@id="job_detail"]/dd[3]/div[1]').text
        work_list.append(temp)
        print(work_list)
        return work_list

    def save_data(self):
        pass
        
    def run(self):
        self.Login()
        time.sleep(3)
        count = 0
        while True:
            count += 1
            time.sleep(3)
            url_list = self.get_url()
            time.sleep(3)
            for url in url_list:
                self.parse_data(url)
            self.page_next()

if __name__ == '__main__':

    lagou = Lagou('使用者名','密碼')
    lagou.run()