爬蟲之selenium和PhantomJS
阿新 • • 發佈:2019-01-10
---恢復內容開始---
selenium
selenium是什麼?
是Python的一個第三方庫,對外提供的介面可以操作瀏覽器,然後讓瀏覽器完成自動化的操作
環境搭建
1.安裝: pip install selenium 2.獲取對應的驅動:以谷歌為例 2.1.檢視谷歌瀏覽器幫助中的關於Google Chrome 檢視版本 2.2對映表地址: # 檢視對應的驅動
http://blog.csdn.net/huilan_same/article/details/51896672 2.3谷歌瀏覽器驅動下載地址: # 根據對映表下載對應驅動
http://chromedriver.storage.googleapis.com/index.html
注意:如果是Anaconda3的jupyter的情況,不能直接下載到本地的cpython直譯器 要在Anaconda3\Scripts中指定下載
示例:先執行下看下結果
from time import sleep from selenium import webdriver # 後面是你的瀏覽器驅動位置,記得前面加r'','r'是防止字元轉義的 driver = webdriver.Chrome(r'F:\Python\10爬蟲\包\chromedriver_win32\chromedriver.exe') # 用get開啟百度頁面 driver.get("http://www.baidu.com") # 查詢頁面的“設定”選項,並進行點選 driver.find_elements_by_link_text('設定')[0].click() sleep(2) # # 開啟設定後找到“搜尋設定”選項,設定為每頁顯示50條 driver.find_elements_by_link_text('搜尋設定')[0].click() sleep(2) # 選中每頁顯示50條 m = driver.find_element_by_id('nr') sleep(2) m.find_element_by_xpath('//*[@id="nr"]/option[3]').click() m.find_element_by_xpath('.//option[3]').click() sleep(2) # 點選儲存設定 driver.find_elements_by_class_name("prefpanelgo")[0].click() sleep(2) # 處理彈出的警告頁面 確定accept() 和 取消dismiss() driver.switch_to_alert().accept() sleep(2) # 找到百度的輸入框,並輸入 美女 driver.find_element_by_id('kw').send_keys('美女') sleep(2) # 點選搜尋按鈕 driver.find_element_by_id('su').click() sleep(2) # 在開啟的頁面中找到“Selenium - 開源中國社群”,並開啟這個頁面 driver.find_elements_by_link_text('美女_百度圖片')[0].click() sleep(3) # 關閉瀏覽器 driver.quit()
程式碼介紹:
#導包 from selenium import webdriver #建立瀏覽器物件,通過該物件可以操作瀏覽器 browser = webdriver.Chrome('驅動路徑') #使用瀏覽器發起指定請求 browser.get(url) #使用下面的方法,查詢指定的元素進行操作即可 find_element_by_id 根據id找節點 find_elements_by_name 根據name找 find_elements_by_xpath 根據xpath查詢 find_elements_by_tag_name 根據標籤名找 find_elements_by_class_name 根據class名字查詢
phantomJs
PhantomJS是一款無介面的瀏覽器,其自動化操作流程和上述操作谷歌瀏覽器是一致的。由於是無介面的,為了能夠展示自動化操作流程,PhantomJS為使用者提供了一個截圖的功能,使用save_screenshot函式實現。
示例:
from time import sleep from selenium import webdriver # 後面是你的瀏覽器驅動位置,記得前面加r'','r'是防止字元轉義的 driver = webdriver.Chrome(r'F:\Python\10爬蟲\包\chromedriver_win32\chromedriver.exe') # 用get開啟百度頁面 driver.get("http://www.baidu.com") # 查詢頁面的“設定”選項,並進行點選 driver.find_elements_by_link_text('設定')[0].click() sleep(2) # # 開啟設定後找到“搜尋設定”選項,設定為每頁顯示50條 driver.find_elements_by_link_text('搜尋設定')[0].click() sleep(2) # 選中每頁顯示50條 m = driver.find_element_by_id('nr') sleep(2) m.find_element_by_xpath('//*[@id="nr"]/option[3]').click() m.find_element_by_xpath('.//option[3]').click() sleep(2) # 點選儲存設定 driver.find_elements_by_class_name("prefpanelgo")[0].click() sleep(2) # 處理彈出的警告頁面 確定accept() 和 取消dismiss() driver.switch_to_alert().accept() sleep(2) # 找到百度的輸入框,並輸入 美女 driver.find_element_by_id('kw').send_keys('美女') sleep(2) # 點選搜尋按鈕 driver.find_element_by_id('su').click() sleep(2) # 在開啟的頁面中找到“Selenium - 開源中國社群”,並開啟這個頁面 driver.find_elements_by_link_text('美女_百度圖片')[0].click() sleep(3) # 關閉瀏覽器 driver.quit()
谷歌無介面使用
# selenium 對 無頭谷歌 的呼叫 ######################################################### #固定格式 from selenium import webdriver import time from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') ######################################################### path = r'F:\Python\視屏\10爬蟲\包\chromedriver_win32\chromedriver.exe' bro = webdriver.Chrome(executable_path=path,chrome_options=chrome_options) # 此時 屬於無介面的呼叫谷歌瀏覽器 # 請求的傳送 bro.get(url='https://www.baidu.com') #根據find系列的函式定位到指定的標籤 baidu_input = bro.find_element_by_id('kw') baidu_input.send_keys('python') # 百度搜索框輸入 python time.sleep(0.5) bro.find_element_by_id('su').click() # 找到百度一下 time.sleep(1) response = bro.find_element_by_xpath('//*[@id="1"]/h3/a[1]').click() time.sleep(6) bro.quit()
重點:selenium+phantomjs 就是爬蟲終極解決方案:有些網站上的內容資訊是通過動態載入js形成的,所以使用普通爬蟲程式無法回去動態載入的js內容。例如豆瓣電影中的電影資訊是通過下拉操作動態載入更多的電影資訊。
#需求:爬取豆瓣電影動態加載出的電影詳情資料
from time import sleep from selenium import webdriver # 後面是你的瀏覽器驅動位置,記得前面加r'','r'是防止字元轉義的 driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\包\chromedriver_win32\chromedriver.exe') url = 'https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=' # 豆瓣的url driver.get(url=url) # 呼叫瀏覽器訪問豆瓣 js = 'window.scrollTo(0,document.body.scrollHeight)' # 滾動下拉當前螢幕對應畫素的js程式碼 driver.execute_script(js) # 下拉滾動第一次 sleep(2) driver.execute_script(js) # 下拉滾動第二次 sleep(2) driver.execute_script(js) # 下拉滾動第三次 sleep(2) page_text = driver.page_source # 類似requests.get(url).text # print(page_text) with open('./douban.html','w',encoding='utf-8') as fp: fp.write(page_text) bro.quit()
qq空間登入爬取
from time import sleep from selenium import webdriver from lxml import etree #登入qq空間 bro = webdriver.Chrome(executable_path=r'F:\Python\視屏\10爬蟲\包\chromedriver_win32\chromedriver.exe') url = 'https://qzone.qq.com/' #請求的傳送 bro.get(url=url) sleep(1) #定位到指定的iframe # 使用的元件巢狀 點位元件 bro.switch_to.frame('login_frame') bro.find_element_by_id('switcher_plogin').click() # 定位切換賬號密碼登入 sleep(1) userName = bro.find_element_by_id('u') # 賬號輸入框 userName.send_keys('qq賬號') passWord = bro.find_element_by_id('p') # 密碼輸入欄 passWord.send_keys('qq密碼.') sleep(1) bro.find_element_by_id('login_button').click() # 點選登入 sleep(1) js = 'window.scrollTo(0,document.body.scrollHeight)' # 向下滾動的js程式碼 bro.execute_script(js) # 1次 sleep(3) bro.execute_script(js) # 2次 sleep(3) bro.execute_script(js) # 3次 sleep(3) bro.execute_script(js) # 3次 sleep(3) bro.execute_script(js) # 3次 sleep(3) page_text = bro.page_source # 獲取頁面的response.text的內容 print(page_text) sleep(5) #解析 tree = etree.HTML(page_text) # DOM數 div_list = tree.xpath('//div[@class="f-info qz_info_cut"] | //div[@class="f-info"]') # 獲取 說說 或者其他轉發dom節點 for div in div_list: text = div.xpath('.//text()') # 得到每一個節點的文字內容 text = "".join(text) print(text) bro.quit()