Python爬蟲學習筆記(二) — Selenium自動化+Katalon Recorder

2020/06/08更新爬蟲等待機制:

2020/01/13更新在GCE執行Selenium:

2020/04/03更新讀取資料的屬性:

Selenium
#使用.get_attribute()可以抓取隱藏的內容(讀出元素內部HTML)
#可先用xpath搭配get_attribute()抓內部HTML,再將程式改寫用內部HTML抓資料
#使用.text可以直接讀取文字#.find_element_by_xpath("//a[contains(text(),'深石')]")
找出XPATH中,包含某一個字串的元素節點

2019/12/24更新在Selenium中的XPath用for迴圈:

https://stackoverflow.com/questions/55057864/looping-through-xpath-selenium-pythonfor i in range (1,100):
Teamname= driver.find_element_by_xpath("//*[@id='tab-3959-3']/div/div[%d]" %(i))
將原本的數字:比如說div[2],直接改成[%d],然後空一格,再加上%(i)
就可以完成for迴圈的功能(i即 for i in range....中的i)

入門

pip install seleniumChrome驅動程式https://sites.google.com/a/chromium.org/chromedriver/downloads/下載驅動程式,並將檔案存放於有設定環境變數的路徑當中。Firefox驅動程式https://github.com/mozilla/geckodriver/releases下載驅動程式,並將檔案存放於有設定環境變數的路徑當中。#20191224更新另一方法(先設定上述驅動程式所下載到的路徑,再加入參數到selenium)driver_path = C:\XXX\pathToYourDriver\xxx.exe
driver = webdriver.Chrome(driver_path,options=options)
import time
time.sleep(5)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
#關閉瀏覽器跳出訊息
prefs = {
'profile.default_content_setting_values' :
{
'notifications' : 2
}
}
options.add_experimental_option('prefs',prefs)
options.add_argument("--headless") #不開啟實體瀏覽器背景執行
options.add_argument("--start-maximized") #最大化視窗
options.add_argument("--incognito") #開啟無痕模式
driver = webdriver.Firefox(firefox_options=options)
driver.get("http://www.google.com/")
driver.quit() #關閉所有視窗(.close()關閉單一視窗)
#火狐瀏覽器firefoxOptions.set_preference(“dom.webnotifications.serviceworker.enabled”, false) #取消跳出訊息框firefoxOptions.set_preference(“dom.webnotifications.enabled”, false) #取消跳出訊息框
browser.set_window_size(480, 800)#視窗大小設定browser.maximize_window() #視窗最大化
browser.minimize_window() #視窗最小化
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name() #html標籤
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath() #個人認為最好用
#/html開頭為絕對路徑;//為相對路徑
find_element_by_css_selector()
#find_element及find_elements的差別
find_element:傳第一個符合條件的WebElement
find_elements:傳回所有符合條件的WebElement
time.sleep(n)
#Time模組中的sleep,必須足足等待n秒鐘,稱為顯性等待
implicitly_wait(n)
#Selenium模組中的隱性等待,最多等n秒鐘,如果前一事件提早完成就直接進行下一個動作
size=driver.find_element_by_id("kw").size     #顯示元素尺寸
text=driver.find_element_by_id("cp").text #顯示元素文字
click=driver.find_element_by_id("xx").click() #點擊
submit=driver.find_element_by_id("re").submit() #提交表單
driver.forward()     #上一頁
driver.back() #下一頁
driver.refresh() #重新整理
driver.page_source #網頁原始碼
driver.current_url #顯示幕前網址
driver.title #網頁標題
.context_click()     #右擊
.double_click() #雙擊
.drag_and_drop() #拖動
.move_to_element() #鼠標懸停在一個元素上
.click_and_hold() #按下鼠標左鍵在一個元素上
#注意:使用Keys方法要先引入以下這一行
from selenium.webdriver.common.keys import Keys
.send_keys(str) 輸入字串
.send_keys(Keys.BACK_SPACE) (BackSpace)删除键
.send_keys(Keys.SPACE) (Space)空格键
.send_keys(Keys.TAB) (Tab)
.send_keys(Keys.ESCAPE) (Esc)
.send_keys(Keys.ENTER) (Enter)
.send_keys(Keys.CONTROL,'a') (Ctrl+A)
.send_keys(Keys.CONTROL,'c') (Ctrl+C)
.send_keys(Keys.PAGE_DOWN) (PageDown)移動至下方頁面
.send_keys(Keys.END) (END)移動到最底端
.send_keys(Keys.END) (HOME)移動到最上端
from selenium import webdriver                       
import time
url='https://search.books.com.tw/search/query/cat/1/key/python/qsub/001/sort/5'
browser = webdriver.Firefox()
browser.get(url) browser.set_window_size(1200,4500) browser.get(url) # Load page browser.save_screenshot('books.png') browser.close()
driver.execute_script("填寫你的JS代碼")#例如使用JS移動到網頁最下方:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
#移動到下方:
driver.execute_script("window.scrollBy(0, 1000);")
#移動到上方:
driver.execute_script("window.scrollBy(0, -1000);")
driver.get_attribute('class') #顯示class的值
input = driver.find_element_by_class_name('zu-top-add-question')
print(input.text) #顯示input的文字
# Go to the correct domaindriver.get("http://www.example.com")# And now output all the available cookies for the current URLdriver.get_cookies()

實作

from selenium import webdriver

url ='https://tw.yahoo.com/'

#打開瀏覽器,確保你已經有chromedriver在你的目錄下
browser=webdriver.Firefox()
#在瀏覽器打上網址連入
browser.get(url)

#這時候就可以分析網頁裡面的元素
element = browser.find_element_by_id('UHSearchBox')
element.send_keys('Hello World')

sumbit = browser.find_element_by_id('UHSearchWeb').click()
from selenium import webdriver 
driver = webdriver.Firefox()
driver.get("https://www.ptt.cc/bbs/Beauty/M.1545599121.A.D4A.html") #開啟連結
elem = driver.find_element_by_link_text("https://i.imgur.com/xZFUVex.jpg")
print(elem.text)

driver.close() #關閉連結
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

url ='https://tw.yahoo.com/'

#今天講個特別的,我們可以不讓瀏覽器執行在前景,而是在背景執行(不讓我們肉眼看得見)
#如以下宣告 options
options = webdriver.ChromeOptions()
options.add_argument('--headless')

#打開瀏覽器,確保你已經有chromedriver在你的目錄下
# 然後將options加入Chrome方法裡面,至於driver請用executable_path宣告進入
browser=webdriver.Chrome(chrome_options=options, executable_path='./chromedriver')
#在瀏覽器打上網址連入
browser.get(url)

#這時候就可以分析網頁裡面的元素
element = browser.find_element_by_id('UHSearchBox')
element.send_keys('Hello World')

sumbit = browser.find_element_by_id('UHSearchWeb').click()

# 等待目標表格'id 為 web'的div出現
element = WebDriverWait(browser, 5).until(
expected_conditions.presence_of_element_located((By.ID, 'web'))
)

#然後就是beautifulsoup的範疇了,將browser.page_source放進去分析
soup=BeautifulSoup(browser.page_source,"html.parser")
links = soup.select('div#web h3')

for link in links:
print(link.get_text())

browser.quit()

####20191225更新,目前已被官方棄用####

下載http://phantomjs.org/download.html,並且加到環境變數後

修改以下程式,即可免開瀏覽器進行自動化爬蟲工作

把driver = webdriver.Firefox 改成driver = webdriver.PhantomJS()
Image for post
Image for post
本圖片截於高级爬虫: 让 Selenium 控制你的浏览器帮你爬

Written by

Machine Learning / Deep Learning / Python / Flutter cakeresume.com/yanwei-liu

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store