Python學(xué)習(xí)筆記——從Web抓取信息

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是己,一起剝皮案震驚了整個濱河市又兵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卒废,老刑警劉巖沛厨,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摔认,居然都是意外死亡俄烁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門级野,熙熙樓的掌柜王于貴愁眉苦臉地迎上來页屠,“玉大人,你說我怎么就攤上這事蓖柔〕狡螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵况鸣,是天一觀的道長牢贸。 經(jīng)常有香客問我,道長镐捧,這世上最難降的妖魔是什么潜索? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任臭增,我火速辦了婚禮,結(jié)果婚禮上竹习,老公的妹妹穿的比我還像新娘誊抛。我一直安慰自己,他們只是感情好整陌,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布拗窃。 她就那樣靜靜地躺著,像睡著了一般泌辫。 火紅的嫁衣襯著肌膚如雪随夸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天震放,我揣著相機與錄音宾毒,去河邊找鬼。 笑死殿遂,一個胖子當(dāng)著我的面吹牛诈铛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勉躺,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼觅丰!你這毒婦竟也來了饵溅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妇萄,失蹤者是張志新(化名)和其女友劉穎蜕企,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冠句,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡轻掩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了懦底。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唇牧。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖聚唐,靈堂內(nèi)的尸體忽然破棺而出丐重,到底是詐尸還是另有隱情,我是刑警寧澤杆查,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布扮惦,位于F島的核電站,受9級特大地震影響亲桦,放射性物質(zhì)發(fā)生泄漏崖蜜。R本人自食惡果不足惜浊仆,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豫领。 院中可真熱鬧抡柿,春花似錦、人聲如沸氏堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼠锈。三九已至闪檬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間购笆,已是汗流浹背粗悯。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留同欠,地道東北人样傍。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像铺遂,于是被迫代替她去往敵國和親衫哥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容