1. 操作瀏覽器
1.1 打開瀏覽器并加載網(wǎng)頁
import webbrowser
webbrowser.open('https://github.com/ChelseaMah')
1.2 用selenium模塊控制瀏覽器
導(dǎo)入有點特殊,需要用
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) |
匹配標(biāo)簽name的元素(大小寫無關(guān),<a>元素匹配'a'和'A') |
1.2.3 WebElement的屬性和方法:
屬性或方法 | 描述 |
---|---|
tag_name | 標(biāo)簽名僵驰,例如'a'表示<a>元素 |
get_attribute(name) | 該元素name屬性的值 |
text | 該元素內(nèi)的文本喷斋,例如<span>hello</span>中的'hello' |
clear() | 對于文本字段或文本區(qū)域元素唁毒,清除其中輸入的文本 |
is_displayed() | 如果該元素可見,返回True星爪,否則返回False |
is_enabled() | 對于輸入元素浆西,如果該元素啟用,返回True顽腾,否則返回False |
is_selected() | 對于復(fù)選框或單選框元素近零,如果該元素被選中,選擇True抄肖,否則返回False |
location | 一個字典秒赤,包含鍵'x'和'y',表示該元素在頁面上的位置 |
1.2.4 頁面點擊
- findelement或findelements方法找到該WebElement對象
- 調(diào)用該元素的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()
在任何元素上調(diào)用submit(),都等同于該元素所在表單的submit陈瘦。
1.2.6 發(fā)送特殊鍵
針對不能用字符串值輸入的鍵盤擊鍵幌甘,如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() 點擊"前進(jìn)"
- browe.refresh() 點擊"刷新"
2. resquests模塊完成網(wǎng)絡(luò)請求咖驮、文件下載
2.1 請求網(wǎng)絡(luò)數(shù)據(jù)
import bs4,requests
# res的類型為requests.models.Response
res = requests.get("https://github.com/ChelseaMah")
# 回去狀態(tài)碼
if res.status_code = requests.code.ok:
# 獲取網(wǎng)頁請求內(nèi)容
content = bs4.BeautifulSoup(res.text)
print (content)
2.2 檢查錯誤
在Response對象上調(diào)用raise_for_status()方法边器。如果下載文件出錯,將拋出異常托修。如果下載成功忘巧,就什么也不做。
import bs4,requests
# res的類型為requests.models.Response
res = requests.get("https://github.com/ChelseaMah")
try:
res.raise_for_status()
# 回去狀態(tài)碼
if res.status_code = requests.code.ok:
# 獲取網(wǎng)頁請求內(nèi)容
content = bs4.BeautifulSoup(res.text)
print (content)
except requests.exceptions.HTTPError as e:
print('網(wǎng)絡(luò)請求失敗, msg' + str(s))
2.3 將下載的文件保存到硬盤
從Web寫入本地文件時睦刃,可以用標(biāo)準(zhǔn)的open()函數(shù)和write()方法砚嘴。 但必須用“寫二進(jìn)制”模式打開該文件,即向函數(shù)傳入字符串'wb'涩拙,作為open()的第二參數(shù)际长。 即使該頁面是純文本的,你也需要寫入二進(jìn)制數(shù)據(jù)兴泥,而不是文本數(shù)據(jù)工育,目的是為了保存該文本中的“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('網(wǎng)絡(luò)請求失敗, msg' + str(s))
3. HTML解析
用BeautifulSoup模塊解析HTML
3.1 創(chuàng)建BeautifulSoup對象
bs4.BeautifulSoup(htmlStr/file)返回一個BeautifulSoup對象搓彻,htmlStr中包含將要解析的HTML翅娶。也可以向bs4.BeautifulSoup()傳遞一個File對象文留,從硬盤加載一個HTML文件。
從網(wǎng)絡(luò)獲取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() 方法 獲取元素數(shù)據(jù)
CSS選擇器例子
方法 | 匹配 |
---|---|
soup.select('div') | 所有<div>的元素 |
soup.select('#author') | 帶有id屬性為author的元素 |
soup.select('.notice') | 所有使用CSSclass屬性名為notice的元素 |
soup.select('divspan') | 所有在<div>元素之內(nèi)的<span>元素 |
soup.select('div>span') | 所有直接在<div>元素之內(nèi)的<span>元素,中間沒有其他元素 |
soup.select('input[name]') | 所有名為<input>蜕提,并有一個name屬性森书,其值無所謂的元素 |
soup.select('input[type="button"]') | 所有名為<input>,并有一個type屬性谎势,其值為button的元素 |
不同的選擇器模式可以組合起來凛膏,形成復(fù)雜的匹配。例如脏榆,soup.select('p#author')將匹配所有id屬性為author的元素猖毫,只要它也在一個<p>元素之內(nèi)。
select()方法將返回一個Tag對象的列表须喂。每個Tag表示BeautifulSoup對象中的HTML的每次匹配吁断。
Tag值可以傳遞給str()函數(shù),顯示它們代表的HTML標(biāo)簽坞生。
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