Python爬蟲學習筆記(二) — Selenium自動化+Katalon Recorder
2021/06/17更新破解Captcha驗證碼的方式
2021/01/24更新Selenium如何和pandas搭配擷取HTML表格資料:
import pandas as pd
import time
from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Chrome()
i = "DCD710S2"
base_url = str("https://www.lowes.com/search?searchTerm=" + str(i))
driver.get(base_url)
time.sleep(3)
html=driver.page_source
soup=BeautifulSoup(html,'html.parser')
div=soup.select_one("div#collapseSpecs")
table=pd.read_html(str(div))
frames = [table[0], table[1]]
result=pd.concat(frames,ignore_index=True)
print(result)
2021/01/24更新在無GUI介面的Server上執行Selenium(以aiForge為例):
基於這篇參考資料做修改
#安裝chromium-browser
sudo apt-get install chromium-browser
dpkg --configure -a
apt-get install -f
chromium-browser -version #記住版本號,待會要下載對應的driver#安裝Selenium和xvfb
pip install selenium
sudo apt-get install xvfb#下載chromedriver並解壓縮到/usr/bin
wget https://chromedriver.storage.googleapis.com/87.0.4280.88/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/bin/#程式碼關鍵點在於使用
#option.binary_location = '/usr/bin/chromium-browser'找到driver位置、headless模式、disable-gpu不使用GPU、no-sandbox無沙盒模式,這三個選項,其餘寫法與一般使用相同。from selenium import webdriver
option = webdriver.ChromeOptions()
option.binary_location = '/usr/bin/chromium-browser'
option.add_argument('--headless')
option.add_argument('--disable-gpu')
option.add_argument('--no-sandbox')
driver = webdriver.Chrome(chrome_options=option)driver.get('https://yanwei-liu.medium.com/')
print(driver.title)
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秒鐘,如果前一事件提早完成就直接進行下一個動作
WEB方法
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()
使用JavaScript
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);")
.get_attribute()&.text獲取屬性值與文字
driver.get_attribute('class') #顯示class的值
input = driver.find_element_by_class_name('zu-top-add-question')
print(input.text) #顯示input的文字
Cookies
# Go to the correct domaindriver.get("http://www.example.com")# And now output all the available cookies for the current URLdriver.get_cookies()
實作
自動使用Yahoo進行搜尋
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() #關閉連結
Selenium搭配BeautifulSoup進行爬蟲
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()
PhantomJS
####20191225更新,目前已被官方棄用####
下載http://phantomjs.org/download.html,並且加到環境變數後
修改以下程式,即可免開瀏覽器進行自動化爬蟲工作
把driver = webdriver.Firefox 改成driver = webdriver.PhantomJS()
Katalon Recorder