非結構畫數據 轉爲 結構化數據。須要藉助ETL(數據抽取,轉換,存儲)進行。css
非結構化數據蘊含着豐富的價值。須要藉助ETL進行轉換成結構化數據,才能變成有價值的數據。好比下邊的網頁,信息是非結構化的,咱們須要把他們轉爲結構化的數據,纔會變成有價值的信息。html
再例如搜索引擎,就是利用網絡爬蟲技術,去各個網站爬蟲數據,而後作成索引,而後供咱們查找。爲何今天的爬蟲技術這麼熱呢?由於咱們須要的數據好多都不在本身的數據庫上,因此只能經過網絡爬蟲的技術去網絡上爬取。python
通常網絡爬蟲架構以下:web
首先咱們要有一個網頁連接器,而後去網站的服務器進行請求,而後服務器給咱們反應。咱們能夠又鍵鼠標,而後選擇檢查數據庫
而後選擇Network選項,而後點擊左上角的刷新按鈕,發現左下角有67個請求。服務器
這些功能本來是給網頁開發人員使用的,但network也能夠給咱們輕鬆使用,分析獲得什麼樣的請求,獲得了什麼迴應。websocket
咱們點擊左上角的漏斗行的按鈕,發現獲得不少信息。網絡
XHR:網站迴應的內容架構
JS:和網頁互動socket
CSS:網站的化妝品,呈現顏色等
Img:圖片
Media:多媒體資料,如視頻
Font:文字
Doc:網頁資料
WS:是websocket
Manifest:宣告
Other:其餘
咱們的新聞內容通常就是放在了Doc裏邊了,點擊Doc按鈕,選擇第一個頁面的Response。
經過比較咱們的網站內容和html,發現很像,那麼這些資料頗有可能就是咱們須要的資料。
如何觀察一個網頁,而後把有用的內容抓取下來?
首先咱們能夠用開發人員工具,右鍵選擇檢查,而後選擇Doc,在選擇第一個連接。
爲何能夠在Doc裏邊找到呢?由於每個網站都須要被搜索引擎爬蟲到的需求,百分之九十的都會在Doc裏邊找到。如何判斷這個連接就是咱們須要抓取的內容呢?咱們能夠經過比較html內容和網頁內容來判斷。
咱們選擇Headers內容:
什麼是get方法呢?
咱們能夠把get方法想象成一個明信片,咱們經過get方法來訪問服務器,當服務器收到咱們的get以後,知道了咱們的來意,就能夠把相應的迴應返回給咱們。
經過pip安裝套件:
pip insatll requests
pip install BeautifulSoup4
使用Request進行操做,(不實用Urllib2,由於它用起來很是的麻煩)。
回到新浪頁面,既然能夠用get獲得這個頁面,那麼就用這個網址進行獲取這個頁面。
import requests res=requests.get('https://news.sina.cn/gn/?from=wap') print(res)
import requests res=requests.get('https://news.sina.cn/gn/?from=wap') print(res.text)
亂碼是由於解碼的問題,python誤認爲是其餘的編碼方式,
能夠用encoding查看編碼形式
import requests res=requests.get('https://news.sina.cn/gn/?from=wap') print(res.encoding)
修改代碼以下:
import requests res=requests.get('https://news.sina.cn/gn/?from=wap') res.encoding='utf-8' print(res.text)
此時不會再亂碼了
可是如今的信息依然存在html中,如何把這些信息轉成結構化信息呢?
咱們可使用DOM的方法,即Document Object Model,這是一組API,能夠用來和網頁元素進行互動,
咱們能夠看到這麼一棵樹,最上邊是html,而後下邊是body。
# import requests # # res=requests.get('https://news.sina.cn/gn/?from=wap') # res.encoding='utf-8' # print(res.text) from bs4 import BeautifulSoup html_samp=" \ <html> \ <body> \ <h1 id='title'>hello world</h1> \ <a href='#' class ='link'>this is link1</a> \ <a href='# link2' class='link'>this is link2</a> \ </body> \ </html>" soup=BeautifulSoup(html_samp) print(soup.text)
運行獲得:
輸出了內容,可是有一個警告,由於咱們沒有指定一個剖析器,此時程序會給咱們一個默認的。咱們也能夠指定一個剖析器,避免這個警告。
改寫語句:
soup=BeautifulSoup(html_samp,'html.parser')
咱們要抓取的內容也許是在特殊的標籤之中,那麼如何從特殊的標籤和節點之中找到咱們須要的數據呢?
咱們能夠用select方法,把含有特定標籤的數據取出來
from bs4 import BeautifulSoup html_samp=" \ <html> \ <body> \ <h1 id='title'>hello world</h1> \ <a href='#' class ='link'>this is link1</a> \ <a href='# link2' class='link'>this is link2</a> \ </body> \ </html>" soup=BeautifulSoup(html_samp,'html.parser') header=soup.select('h1') #由於soup中可能會有不少的h1標籤,因此上邊的header是一個list,因此header[0]表示第一個h1標籤 print(header[0])
輸出爲:
若是要輸出其中的內容的畫,能夠用header[0].text獲得其中的內容。
css是網頁化妝品,當咱們取用裏邊的詞,當裏邊的id爲title時,必需要加上‘#’,才能夠存取,若是爲class的話,必需要加上‘.’才能夠存取。
from bs4 import BeautifulSoup html_samp=" \ <html> \ <body> \ <h1 id='title'>hello world</h1> \ <a href='#' class ='link'>this is link1</a> \ <a href='# link2' class='link'>this is link2</a> \ </body> \ </html>" soup=BeautifulSoup(html_samp,'html.parser') #爲title的要加上'#' alink=soup.select('#title') print(alink) #爲class的,要加上'.' for link in soup.select('.link'): print(link)
最後,還有一個需求,在網頁的連接上,咱們會用a tag去聯繫到不一樣的網頁,a tag裏邊有一個特殊的屬性href,使用href才能夠聯繫到其餘的網頁。
from bs4 import BeautifulSoup html_samp=" \ <html> \ <body> \ <h1 id='title'>hello world</h1> \ <a href='#' class ='link'>this is link1</a> \ <a href='# link2' class='link'>this is link2</a> \ </body> \ </html>" soup=BeautifulSoup(html_samp,'html.parser') alinks=soup.select('a') for link in alinks: print(link) #之因此咱們會用link['href']這樣的寫法,是由於其中的存取是使用了字典的形式 print(link['href'])
咱們已經知道,1.使用requests.get取得頁面內容;使用beautifulsoup4把內容剖析出來。
那咱們應該怎麼對新浪新聞的標題,時間,連接等取出來呢?