1. 操作瀏覽器
1.1 打開瀏覽器并加載網頁
import webbrowser
webbrowser.open('https://github.com/ChelseaMah')
1.2 用selenium模塊控制瀏覽器
導入有點特殊,需要用
from selenium import webdriver
來使用selenium的webdriver,而不是Python自帶的。
1.2.1 啟動瀏覽器
from selenium import webdriver
browser = webdriver.Safari()
browser.get('https://github.com/ChelseaMah')
1.2.2 在頁面中尋找元素
WebDriver對象有很多方法在頁面中尋找元素,分為findelement和findelements方法。
findelemen 返回一個WebElement對象,是匹配查詢的第一個元素。
findelements 返回一個列表,包含所有匹配元素。
方法 | return |
---|---|
browser.find_element_by_class_name(name) browser.find_elements_by_class_name(name) |
使用CSS類name的元素 |
browser.find_element_by_css_selector(selector) browser.find_elements_by_css_selector(selector) |
匹配CSSselector的元素 |
browser.find_element_by_id(id) browser.find_elements_by_id(id) |
匹配id屬性值的元素 |
browser.find_element_by_link_text(text) browser.find_elements_by_link_text(text) |
完全匹配提供的text的<a>元素 |
browser.find_element_by_partial_link_text(text) browser.find_elements_by_partial_link_text(text) |
包含提供的text的<a>元素 |
browser.find_element_by_name(name) browser.find_elements_by_name(name) |
匹配name屬性值的元素 |
browser.find_element_by_tag_name(name) browser.find_elements_by_tag_name(name) |
匹配標簽name的元素(大小寫無關,<a>元素匹配'a'和'A') |
1.2.3 WebElement的屬性和方法:
屬性或方法 | 描述 |
---|---|
tag_name | 標簽名,例如'a'表示<a>元素 |
get_attribute(name) | 該元素name屬性的值 |
text | 該元素內的文本,例如<span>hello</span>中的'hello' |
clear() | 對于文本字段或文本區域元素,清除其中輸入的文本 |
is_displayed() | 如果該元素可見,返回True,否則返回False |
is_enabled() | 對于輸入元素,如果該元素啟用,返回True,否則返回False |
is_selected() | 對于復選框或單選框元素,如果該元素被選中,選擇True,否則返回False |
location | 一個字典,包含鍵'x'和'y',表示該元素在頁面上的位置 |
1.2.4 頁面點擊
- findelement或findelements方法找到該WebElement對象
- 調用該元素的click()方法。
from selenium import webdriver
browser = webdriver.Safari()
browser.get('https://github.com/ChelseaMah')
publicElement = browser.find_element_by_link_text('Public')
publicElement.click()
1.2.5 填寫并提交表單
from selenium import webdriver
browser = webdriver.Safari()
browser.get('http://gmail.com')
emailElem = browser.find_element_by_id('Email')
emailElem.send_keys('not_my_real_email@gmail.com')
passwordElem = browser.find_element_by_id('Passwd')
passwordElem.send_keys('12345')
passwordElem.submit()
在任何元素上調用submit(),都等同于該元素所在表單的submit。
1.2.6 發送特殊鍵
針對不能用字符串值輸入的鍵盤擊鍵,如Shift、F1、Home等,使用send_keys()方法時,傳入selenium.webdriver.common.keys模塊的常量:
屬性 | 含義 |
---|---|
Keys.DOWN,Keys.UP,Keys.LEFT,Keys.RIGHT | 鍵盤箭頭鍵 |
Keys.ENTER,Keys.RETURN | 回車和換行鍵 |
Keys.HOME,Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP | Home鍵、End鍵、PageUp鍵和PageDown鍵 |
Keys.ESCAPE,Keys.BACK_SPACE,Keys.DELETE | Esc、Backspace和字母鍵 |
Keys.F1,Keys.F2,...,Keys.F12 | 鍵盤頂部的F1到F12鍵Keys.TABTab鍵 |
1.2.7 點擊瀏覽器按鈕
- browe.back() 點擊"返回"
- browe.forword() 點擊"前進"
- browe.refresh() 點擊"刷新"
2. resquests模塊完成網絡請求、文件下載
2.1 請求網絡數據
import bs4,requests
# res的類型為requests.models.Response
res = requests.get("https://github.com/ChelseaMah")
# 回去狀態碼
if res.status_code = requests.code.ok:
# 獲取網頁請求內容
content = bs4.BeautifulSoup(res.text)
print (content)
2.2 檢查錯誤
在Response對象上調用raise_for_status()方法。如果下載文件出錯,將拋出異常。如果下載成功,就什么也不做。
import bs4,requests
# res的類型為requests.models.Response
res = requests.get("https://github.com/ChelseaMah")
try:
res.raise_for_status()
# 回去狀態碼
if res.status_code = requests.code.ok:
# 獲取網頁請求內容
content = bs4.BeautifulSoup(res.text)
print (content)
except requests.exceptions.HTTPError as e:
print('網絡請求失敗, msg' + str(s))
2.3 將下載的文件保存到硬盤
從Web寫入本地文件時,可以用標準的open()函數和write()方法。 但必須用“寫二進制”模式打開該文件,即向函數傳入字符串'wb',作為open()的第二參數。 即使該頁面是純文本的,你也需要寫入二進制數據,而不是文本數據,目的是為了保存該文本中的“Unicode編碼”。
import bs4,requests
try:
res = requests.get('https://github.com/ChelseaMah/algorithm_practice/blob/master/src/group2/group.md')
res.raise_for_status()
playFile = open('group.md', 'wb')
for chunk in res.iter_content(100000):
playFile.write(chunk)
playFile.close()
except requests.exceptions.HTTPError as e:
print('網絡請求失敗, msg' + str(s))
3. HTML解析
用BeautifulSoup模塊解析HTML
3.1 創建BeautifulSoup對象
bs4.BeautifulSoup(htmlStr/file)返回一個BeautifulSoup對象,htmlStr中包含將要解析的HTML。也可以向bs4.BeautifulSoup()傳遞一個File對象,從硬盤加載一個HTML文件。
從網絡獲取html
res = requests.get('https://github.com/ChelseaMah')
res.raise_for_status()
b4s = bs4.BeautifulSoup(res.text)
讀取本地文件
file = open('example.html')
b4s = bs4.BeautifulSoup(file)
有了BeautifulSoup以后就可以利用它的方法,定位HTML文檔中特定的部分。
3.2 select() 方法 獲取元素數據
CSS選擇器例子
方法 | 匹配 |
---|---|
soup.select('div') | 所有<div>的元素 |
soup.select('#author') | 帶有id屬性為author的元素 |
soup.select('.notice') | 所有使用CSSclass屬性名為notice的元素 |
soup.select('divspan') | 所有在<div>元素之內的<span>元素 |
soup.select('div>span') | 所有直接在<div>元素之內的<span>元素,中間沒有其他元素 |
soup.select('input[name]') | 所有名為<input>,并有一個name屬性,其值無所謂的元素 |
soup.select('input[type="button"]') | 所有名為<input>,并有一個type屬性,其值為button的元素 |
不同的選擇器模式可以組合起來,形成復雜的匹配。例如,soup.select('p#author')將匹配所有id屬性為author的元素,只要它也在一個<p>元素之內。
select()方法將返回一個Tag對象的列表。每個Tag表示BeautifulSoup對象中的HTML的每次匹配。
Tag值可以傳遞給str()函數,顯示它們代表的HTML標簽。
Tag值也可以有attrs屬性,它將該Tag的所有HTML屬性作為一個字典。
>>> import bs4
>>> exampleFile = open(' example. html')
>>> exampleSoup = bs4.BeautifulSoup(exampleFile.read())
>>> elems = exampleSoup.select('#author')
>>> type(elems)
< class 'list'>
>>> len(elems)
1
>>> type(elems[ 0])
< class 'bs4.element.Tag'>
>>> elems[0].getText()
'Al Sweigart'
>>> str(elems[ 0])
'<span id="author">Al Sweigart</span>'
>>> elems[ 0].attrs
{'id': 'author'}
>>> spanElem = exampleSoup.select('span')[0]
>>> spanElem.get('id')
'author'
>>> spanElem.get('some_nonexistent_addr') == None
True