-
上次在導入與導出資料到本機與連線網路
這次在爬網 觀察網頁程式碼 並偽裝正常使用者爬取指定資料
-
requests模組
讀取網站
在url裡面添加指令(以字串增加或字典增加) 更改url 爬網站
偽裝瀏覽器爬取網站(以高鐵網站為例)
填入cookies資料(以八卦版為例)
import requests
requests.get(url碼) 回傳對應html碼
requests.get(url碼,params=自訂字典) url裡面添加字典
requests.post(url碼,data=自訂字典) 將表單資料放在封包進行傳送
headers變數名稱={'user-agent':'Mozilla/5.0'} 自定義標頭 偽裝瀏覽器
html變數名稱=requests.get(url,headers=headers變數名稱)
cookies變數名稱={'over18':'1'} 填入cookies
html變數名稱=requests.get(url,cookies=cookies變數名稱)
html變數名稱.text 文字檔案
html變數名稱.content 二進位檔案資料
html變數名稱.status_code 狀態碼
requests.codes.ok 用來搭配if判斷是否有成功連線
-
BeautifulSoup模組
網頁解析
觀察網頁程式碼 取得指定資料(以彩券網為例)
去Anaconda Prompt (你的環境) 輸入
pip install -U beautifulsoup4
安裝最新版BeautifulSoup模組
import requests 讀取url需要使用
from bs4 import BeautifulSoup
html變數名稱.encoding=編碼名稱 設定編碼方式
BeatifulSoup(html變數名稱.text,'html.parser') 使用python內建的
BeatifulSoup(html變數名稱.text,'lxml') 使用專門處理的
sp名稱.各種HTML標籤 (顯示內容需要.text)
sp名稱.title 網頁標題
sp名稱.h1 標題
...
sp名稱.find(條件) 找第一個
sp名稱.find_all(條件) 找全部
sp名稱.select(條件) 使用CSS選擇器 以串列回傳
以id讀取 前面加井號#
以class讀取 前面加點號.
python中變數名稱若碰巧為保留字 則在字後加底線_
變數.splitlines() 處理換行
如htmllist變數名稱=html變數名稱.text.splitlines() 搭配for if搜尋指定東西出現次數
-
re模組
正規表達式
以正規表達式搜尋資料(以自訂文章找信箱網址電話與中華電信網站找信箱為例)
import re
re.match(r正規式,資料str) 在資料中找符合正規式的資料(只找第一個字)
re.search(r正規式,資料str) 在資料中找符合正規式的資料(只找第一筆)
re.findall(r正規式,資料str) 在資料中找符合正規式的資料(找全部) 回傳符合的串列
r正規式 與 pattern
規則名稱 = re.compile(r正規式)
符合正規式的資料 = 規則名稱.match(資料str) 好像沒有看過...?
符合正規式的資料 = 規則名稱.search(資料str) 只找第一筆
符合正規式的資料 = 規則名稱.findall(資料str) 找全部 回傳符合的串列
符合正規式的資料.group() 符合的字串 沒有輸出None
符合正規式的資料.start() 符合的字串開始位置
符合正規式的資料.end() 符合的字串結束位置
符合正規式的資料.span() 符合的字串 (開始位置,結束位置)
搭配match/search
-
Selenium模組
瀏覽器自動化操作 WebDriver
去Anaconda Prompt (你的環境) 輸入
pip install selenium
安裝selenium 模組
程式操作瀏覽器chrome需要下載ChromeDriver
from selenium import webdriver
from time import sleep
(直接import time 就是time.sleep(數字) ) 可能類似c++函式姓氏
from selenium.webdriver.common.keys import Keys
driver名稱=webdriver.Chrome("chromedriver.exe的檔案位置")
driver名稱.get(url網址') 不需要requests模組
sleep(數字) 等待秒
driver名稱.maximize_window() 最大化視窗
?.get_window_position() 取得視窗左上角位置
?.set_window_position(x,y) 設定視窗左上角位置
?.get_window_size() 取得視窗寬度和高度
?.set_window_size(x,y) 設定視窗寬度和高度
?.refresh() 重新整理畫面
?.back() 返回上一頁
?.forward() 下一頁
?.clear() 清除輸入內容
driver名稱.close() 關閉瀏覽器
driver名稱.quit() 關閉瀏覽器 且退出驅動程式
driver名稱.find_element_by_class_name(...) 以類別名稱找
driver名稱.find_element_by_name(...) 以名稱找
driver名稱.find_element_by_tag_name('title') 以HTML標籤找
driver名稱.find_element_by_id('author')
tag名稱=driver名稱.find_elements_by_tag_name('img') 查圖片
tag名稱[i].get_attribute('src')
tag名稱[i].tag_name
tag名稱[i].text
多個同名 elements加S 回傳出串列 tag名稱[i] cf.不加S只找第一個
?.current_url 取得目前網址
?.page_source 讀取網頁原始碼
?.size 傳回元素大小(字典形式 {寬:???,高:???})
tag名稱=driver名稱.find_element_by_partial_link_text(...) 以部分連結文字找
tag名稱=driver名稱.find_element_by_link_text('認識大同')
tag名稱名稱.click() 模擬點擊
tag名稱.send_keys('王永慶') 模擬輸入資料
tag名稱.submit() 送出表單
tag名稱=driver名稱.find_element_by_tag_name('body')
tag名稱.send_keys(Keys.PAGE_DOWN)
tag名稱.send_keys(Keys.END)
tag名稱.send_keys(Keys.PAGE_UP)
tag名稱.send_keys(Keys.HOME)
tag名稱=driver名稱.find_element_by_css_selector(...) 以CSS選擇器找
tag名稱=driver名稱.find_element_by_xpath(...) 以xml的路徑找