前往
大廳
主題

AI跨領域數據科學 課程紀錄 d16~17 資料探勘 (2) 資料收集與分析

傳說中的巴哈魔法師~ | 2022-03-25 21:22:14 | 巴幣 0 | 人氣 153

-
上次在導入與導出資料到本機與連線網路
這次在爬網 觀察網頁程式碼 並偽裝正常使用者爬取指定資料
-
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的路徑找  

創作回應

傳說中的巴哈魔法師~
累了 明天再說 雖然明天也會上6小時也會有明天的份zz
2022-03-26 00:22:07
傳說中的巴哈魔法師~
幹咧我決定明天開始不做筆記全部截圖給他截下去 包準不會錯= = 不用像現在筆記要除錯 自己想哪邊出錯zz
2022-03-26 00:37:18
傳說中的巴哈魔法師~
已補完
2022-03-29 02:29:48

更多創作