爬蟲之selenium和PhantomJS

selenium

selenium是什麼?html

是Python的一個第三方庫,對外提供的接口能夠操做瀏覽器,而後讓瀏覽器完成自動化的操做

環境搭建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
使用簡介

導包web

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

使用chrome

driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
driver.get('http://www.baidu.com')
input_tag = driver.find_element_by_id('kw')  # 找到id=kw 的input標籤
assert '百度一下' in driver.title  # 頁面標題
print(driver.title)  # 打印當前頁面的標題title
input_tag.send_keys('python')  # input框輸入值'python'
input_tag.send_keys(Keys.ENTER)  # 按回車
print(driver.current_url)  # 當前頁面的url
print(driver.page_source)  # 當前頁面的response
print(browser.get_cookies())  # 當前頁面的瀏覽器本地cookie
# driver.close()  # 關閉瀏覽器

select下拉菜單選擇api

# dirver = Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
# dirver.get('http://www.cma.gov.cn/')
# print(dirver.page_source)
# select_tag = Select(dirver.find_element(By.NAME, 'province'))  # 獲取下拉菜單標籤
# select_tag.select_by_index(3)  # 索引選擇
# select_tag.select_by_value('河北')  # 按照下拉框的值選擇
# select_tag.select_by_visible_text('河北')  # 按照下拉框可視化文本選擇
# select_tag.deselect_all()  # 取消選中全部值

行爲鏈瀏覽器

# 行爲鏈
driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
driver.get('http://www.baidu.com')

input_tag = driver.find_element_by_id('kw')  # 找到id=kw 的input標籤
submit_tag = driver.find_element_by_id('su')  # 找到id=su 的submit提交標籤

actions = ActionChains(driver)  # 瀏覽器驅動傳進去實例化一個行爲鏈對象
actions.move_to_element(input_tag)  #移動到輸入框上
actions.send_keys_to_element(input_tag, 'python')  # 給輸入框輸入python
actions.move_to_element(submit_tag)  # 移動到提交元素上
actions.click(submit_tag)  # 點擊提交元素
actions.perform()  # 執行行爲鏈

cookie操做cookie

driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
driver.get('http://www.baidu.com')
[print(cookie) for cookie in driver.get_cookies()]  # 獲取全部瀏覽器上的cookie並展現
[driver.delete_cookie(cookie['domain']) for cookie in driver.get_cookies()]  # 刪除全部的cookie
driver.delete_all_cookies()  # 刪除瀏覽器上當前頁面的全部cookie

等待less

1. 隱式等待dom

driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
driver.get('http://www.baidu.com')

# driver.implicitly_wait(10)  # 在找元素的時候等待10秒   若是找不到再報錯

input_tag = driver.find_element_by_id('123')
input_tag.send_keys('python')  # input框輸入值'python'

2. 顯式等待函數

driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
driver.get('http://www.baidu.com')
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'somename'))
    )  # 等待10s 一直等待 id='somename'的標籤出現。 若是沒有再報錯。
finally:
    driver.quit()

js代碼執行和窗口切換

driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
driver.get('http://www.baidu.com')

driver.execute_script('window.open("http://www.cma.gov.cn/")')  # 執行js代碼
print(driver.current_url)  # https://www.baidu.com/

driver.switch_to_window(driver.window_handles[1])  # 相似於列表操做
print(driver.current_url)  # http://www.cma.gov.cn/

ip代理

driver = webdriver.Chrome(r'F:\Python\視屏\10爬蟲\chromedriver_win32\chromedriver.exe')
options = webdriver.ChromeOptions()  # 是指谷歌瀏覽器的選項信息
ip = 'http://125.123.136.226:9999'  # 代理ip
options.add_argument(f"--proxy-server={ip}")  # 使用代理ip
driver.get('http://httpbin.org/ip')

注意:若是是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()
相關文章
相關標籤/搜索