Python爬蟲基礎總結

這篇文章給大家簡單總結一下Python爬蟲基礎,畢竟很多時候要自己爬數據,目錄如下:

  1. Python爬蟲簡介
  2. 基礎知識
  3. requests庫
  4. 提交請求
  5. 響應內容
  6. BeautifulSoup
  7. BeautifulSoup使用方法
  8. Selenium+PhantomJS

Python爬蟲簡介

爬蟲是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。通過使用爬蟲計算我們可以輕鬆快速的獲取我們所需要的信息,python作為腳本語言可以通過少量的代碼即可編寫網路爬蟲。在為大家介紹編寫爬蟲腳本的常用工具庫之前先為大家介紹一些前端的基礎知識。

基礎知識

網頁前端的三要素是HTML+CSS+JavaScript,其中HTML中有網頁大量的信息,因此爬蟲主要是抓取和解析網頁的HTML。

HTML是用來描述超文本的一門標記語言,我們日常中所看到的網頁界面只不過是瀏覽器通過將特定格式的字元串進行解析使我們看到一個可視化的具有一定格式的界面,但是其實質上就是一堆格式化的字元串。我們爬蟲所要提取的內容就是根據需求篩選出特定的目的信息。CSS也被稱為樣式文件,其作用就是規定顯示的諸如邊界顏色等格式。

JavaScript作為一門腳本語言在網頁前端起到的是邏輯控制的功能,比如動態的顯示數據進行非同步請求或者表單驗證等等。

Cookies是伺服器返回給瀏覽器的一組信息,目的是為了可以追蹤識別用戶。Session保存在伺服器內存中用於跟蹤會話,它和cookie的生存周期不一樣,當會話結束後Session的生存周期就結束了,但是Cooikes有著更長的生存周期,因此我們經常通過保存cookies使得我們的爬蟲保存登錄狀態。

requests庫

爬蟲的策略有很多種,比較常用的就是使用requests爬取,然後交給BeautifulSoup庫進行解析。這種策略可以抓取絕大部分的網頁,但無法抓取js渲染的網頁,因為Python只能通過HTTP請求獲取到HTML、CSS、JS原始代碼而已。

提交請求

HTTP請求類型有:GET、POST、PUT、DELETE、HEAD以及OPTIONS六種,我們一般會用到的只有GET和POST這兩種。我們可以通過以下代碼即可爬取網頁的HTML

>>> import requests # 導入requests>>> response = requests.get(https://www.baidu.com)

當然以上是最簡單的網路請求,我們還可以通過params關鍵字傳入更多的參數提交更複雜的請求

>>> params = {wd:requests}>>> response = requests.get(https://www.baidu.com/s,params = params)

如上所示實際上我們訪問的URL為baidu.com/s?,用瀏覽器打開這個網頁你會發現我們在百度上搜索requests關鍵字,因為get方法是通過URL訪問網頁,get方法會把傳給params的參數組裝成新的url進行訪問。

有些時候我們希望給我們的請求定製請求頭,這是我們可以通過傳入一個字典給headers參數即可,類似的,像是cookies和proxy(代理伺服器)等參數均是接受一個字典作為參數。

>>> headers = {user-agent: my-app/0.0.1}>>> response = requests.get(url, headers=headers)

除此以外,我們還可以傳入timeout參數告訴 requests 在經過以 timeout 參數設定的秒數時間之後停止等待響應。

post方法主要用於提交網頁表單,他通過傳入data參數提交數據,例子如下

>>> response = requests.post(url, data=data) #data為要提交的信息

Post方法使用起來比較複雜,首先你需要找到真正的請求伺服器,並且根據它的請求主體編寫請求。

響應內容

get和post方法返回response對象,它是網頁的響應內容,並且我們可以根據它返回的內容用合適的方法對它進行解析。例如

>>> response.text # 解析為文本>>> response.content # 解析為二進位>>> response.json() # 解析為json格式

並且在解析為文本的時候我們還可以指定字元編碼來解析,通常使用網頁指定的編碼

>>> response.encoding = response.apparent_encoding

但是我們的請求不一定總會成功有些時候可能會出點差錯,我們可以通過response.stauts_code獲取伺服器返回的狀態碼,狀態碼200為響應成功。如果網頁沒能正確的響應,我們可以response.raise_for_status()拋出異常。

BeautifulSoup

BeautifulSoup是一個用於解析網頁的第三方庫,它提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。並且它自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式。

現在Beautiful Soup已成為和lxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。

>>> from bs4 import BeautifulSoup>>> Soup = BeautifulSoup("<html>data</html>")

下表列出了主要的解析器,以及它們的優缺點:

推薦使用lxml作為解析器,因為效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必須安裝lxml或html5lib, 因為那些Python版本的標準庫中內置的HTML解析方法不夠穩定.

BeautifulSoup使用方法

由於我們只是使用BeautifulSoup對爬取的網頁進行解析,因此我們只需掌握如何查找我們想要的內容即可,其中find_all是我們最常用的方法,我們通過傳遞不同的過濾器,使得find_all以不同的方式來查找我們想要的內容。例如以下代碼查找文檔中所有的標籤並以列表的形式返回

Soup.find_all(b)

有些時候我們並不希望完全匹配,這是我們可以使用正則表達式。我們使用以下的代碼就可以匹配以b開頭的表情

Soup.find_all(re.compile("^b"))

我們還可以傳入一個函數進行查找,例如一下代碼可以返回含有class但不含id屬性的標籤。

def has_class_but_no_id(tag): return tag.has_attr(class) and not tag.has_attr(id)Soup.find_all(has_class_but_no_id)

更一般的,find_all()函數的參數如下

find_all( name , attrs , recursive , text , **kwargs )

name是標籤的名字,kwargs可以傳入描述標籤的屬性。例如一下代碼查找了標籤名為a,含有屬性id且值為』link2』的標籤。

soup.find_all(a,id=link2)

需要注意的是,class是python中的保留字,所以我們可以通過 class_ 參數搜索有指定CSS類名的tag。

我們還可以指定text參數按照標籤的文本進行查找,並且在我們不需要全部結果的時候,我們可以通過設定limit參數限制返回的數量以減少搜索的時間。

如果你熟悉CSS選擇器的話,你還可以使用Soup.select()方法。

Selenium+PhantomJS

Selenium是一個用於Web應用程序測試的工具,同時我們可以使用它來模擬真實瀏覽器對URL進行訪問從而對網頁進行爬取。Selenium的往往要配合PhantomJS使用,PhantomJS是一個無界面的,可腳本編程的WebKit瀏覽器引擎。Selenium+PhantomJS可以抓取那些使用JS載入數據的網頁。你可以試著使用requests去抓取B站首頁,你會發現,你抓取不到那些具體的視頻名稱及鏈接,但是我們可以通過以下代碼抓取

from selenium import webdriverdriver = webdriver.PhantomJS()driver.get(https://www.bilibili.com)html = driver.page_source

在獲取完全載入的網頁源碼後,你可以使用BeautifulSoup對網頁進行進一步的解析。

有些時候網頁的一些內容需要瀏覽器執行特定操作的時候才會更新。常刷微博的朋友應該知道,將滾動條拖到底部,瀏覽器才會繼續刷出新的微博,我們可以讓我們的瀏覽器執行一段腳本實現這麼一種操作。

js="var q=document.documentElement.scrollTop=10000"driver.execute_script(js)

如果說有需要執行特定的點擊或者輸入操作的話,我們可以先查找這些元素再調用其他方法。Selenium提供了很多的方法用來選取元素,例如通過類名、id等屬性等等,但最快速的方法是使用CSS選擇器進行選取

driver.find_element_by_class_name() # 通過類名 driver.find_element_by_id() # 通過id driver.find_element_by_css_selector() # 通過css選擇器

具體的使用方法,可以在w3school查看

最後在爬取之前,我們需要配置我們的無頭瀏覽器,否則很容易被伺服器識別出機器人,

from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesdcap = dict(DesiredCapabilities.PHANTOMJS)dcap["phantomjs.page.settings.userAgent"] = user_agent # user_agent太長就不打出來了,在瀏覽器>開發者工具>網路的具體請求中可以查到,dcap["phantomjs.page.settings.loadImages"] = False# 不載入圖片,提高爬取速度driver = webdriver.PhantomJS(phantomjs_driver_path, desired_capabilities=dcap)# 打開的時候傳入配置信息

推薦閱讀:

集智:負基礎也能學會的機器學習(三)
2018AI學習清單丨150個最好的機器學習和Python教程
「伊人」何處,宛在雲中央:用 Datalab 在雲上部署互動式編程環境
十分種讀懂KNN
數據嗨客 | 第6期:不平衡數據處理

TAG:爬蟲計算機網路 | Python | 機器學習 |