python進行爬蟲

 

 使用python進行網絡爬蟲

非結構畫數據 轉爲 結構化數據。須要藉助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把內容剖析出來。

那咱們應該怎麼對新浪新聞的標題,時間,連接等取出來呢?

相關文章
相關標籤/搜索