Python學習筆記——從Web抓取信息

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容