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

1. 操作瀏覽器

1.1 打開瀏覽器并加載網(wǎng)頁(yè)

import webbrowser
webbrowser.open('https://github.com/ChelseaMah')

1.2 用selenium模塊控制瀏覽器

導(dǎo)入有點(diǎn)特殊,需要用
from selenium import webdriver
來(lái)使用selenium的webdriver,而不是Python自帶的。

1.2.1 啟動(dòng)瀏覽器
from selenium import webdriver
browser = webdriver.Safari()
browser.get('https://github.com/ChelseaMah')
1.2.2 在頁(yè)面中尋找元素

WebDriver對(duì)象有很多方法在頁(yè)面中尋找元素,分為findelement和findelements方法。
findelemen 返回一個(gè)WebElement對(duì)象,是匹配查詢的第一個(gè)元素。
findelements 返回一個(gè)列表,包含所有匹配元素。

方法 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的元素(大小寫無(wú)關(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() 對(duì)于文本字段或文本區(qū)域元素,清除其中輸入的文本
is_displayed() 如果該元素可見,返回True,否則返回False
is_enabled() 對(duì)于輸入元素,如果該元素啟用,返回True,否則返回False
is_selected() 對(duì)于復(fù)選框或單選框元素,如果該元素被選中,選擇True,否則返回False
location 一個(gè)字典,包含鍵'x'和'y',表示該元素在頁(yè)面上的位置
1.2.4 頁(yè)面點(diǎn)擊
  • findelement或findelements方法找到該WebElement對(duì)象
  • 調(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ā)送特殊鍵

針對(duì)不能用字符串值輸入的鍵盤擊鍵,如Shift、F1、Home等,使用send_keys()方法時(shí),傳入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 點(diǎn)擊瀏覽器按鈕
  • browe.back() 點(diǎn)擊"返回"
  • browe.forword() 點(diǎn)擊"前進(jìn)"
  • browe.refresh() 點(diǎn)擊"刷新"

2. resquests模塊完成網(wǎng)絡(luò)請(qǐng)求、文件下載

2.1 請(qǐng)求網(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)頁(yè)請(qǐng)求內(nèi)容
    content = bs4.BeautifulSoup(res.text)
    print (content)

2.2 檢查錯(cuò)誤

在Response對(duì)象上調(diào)用raise_for_status()方法。如果下載文件出錯(cuò),將拋出異常。如果下載成功,就什么也不做。

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)頁(yè)請(qǐng)求內(nèi)容
        content = bs4.BeautifulSoup(res.text)
        print (content)
except requests.exceptions.HTTPError as e:
    print('網(wǎng)絡(luò)請(qǐng)求失敗, msg' + str(s))

2.3 將下載的文件保存到硬盤

從Web寫入本地文件時(shí),可以用標(biāo)準(zhǔn)的open()函數(shù)和write()方法。 但必須用“寫二進(jìn)制”模式打開該文件,即向函數(shù)傳入字符串'wb',作為open()的第二參數(shù)。 即使該頁(yè)面是純文本的,你也需要寫入二進(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ò)請(qǐng)求失敗, msg' + str(s))

3. HTML解析

用BeautifulSoup模塊解析HTML

3.1 創(chuàng)建BeautifulSoup對(duì)象

bs4.BeautifulSoup(htmlStr/file)返回一個(gè)BeautifulSoup對(duì)象,htmlStr中包含將要解析的HTML。也可以向bs4.BeautifulSoup()傳遞一個(gè)File對(duì)象,從硬盤加載一個(gè)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() 方法 獲取元素?cái)?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>,并有一個(gè)name屬性,其值無(wú)所謂的元素
soup.select('input[type="button"]') 所有名為<input>,并有一個(gè)type屬性,其值為button的元素

不同的選擇器模式可以組合起來(lái),形成復(fù)雜的匹配。例如,soup.select('p#author')將匹配所有id屬性為author的元素,只要它也在一個(gè)<p>元素之內(nèi)。

select()方法將返回一個(gè)Tag對(duì)象的列表。每個(gè)Tag表示BeautifulSoup對(duì)象中的HTML的每次匹配。
Tag值可以傳遞給str()函數(shù),顯示它們代表的HTML標(biāo)簽。
Tag值也可以有attrs屬性,它將該Tag的所有HTML屬性作為一個(gè)字典。

>>> 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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容