1. 程式人生 > >爬蟲第三課:互聯網中網頁的解析

爬蟲第三課:互聯網中網頁的解析

iso 來看 指向 應該 pri tro conn 路徑 獲取

基本步驟

這節課們們的目的就是使用Requests模塊+BeautifulSoup模塊爬取網站上的信息

首先爬取一個網站主要分兩步

1、第一步我們要了解服務器與本地交換機制,選擇正確的辦法我們才能獲取正確的信息。

2、我們需要了解一些解析真實網頁獲取信息的一些辦法,還有一些思路

服務器與本地交換機制

  我們先講解一下服務器與本地的交換機制,首先我們先了解一個這樣運作的常識,我們在平常瀏覽網頁的時候,實際上我們使用瀏覽器點擊每一個頁面,都是向網站所在的服務器發起一個請求,我們稱之為Request,而這個服務器接到請求之後呢,會給我們一個回信,我們稱之為Reaponse,正是這種行為一個Request一個Response,請求與回應,實際上呢 這種方式就被成為HTTP協議,也就是說我們客戶端與服務器進行會話的一種方式。

技術分享圖片

Request

在向服務器請求的時候,一個Request的行為實際上包含了不同的方法,在HTTP 1.0的時代,實際上只有GET、POST、HEAD三種方法。

技術分享圖片

然後到了HTTP 1.1之後,也就是現在不叫普及的協議之後,又增添了PUT、OPTIONS、CONNECT、TRSCE、DELETE總共加起來現在是有8中方法。

技術分享圖片

我們在這裏並不會展開細致的講解,你聽到這裏的時候可能會感到比較困惑,為什麽一種請求還有這麽多種方法,實際在這裏來講我們要了解的不需要這麽多,我們只需要知道我們向服務器去請求的時候GET和POST是最常用的兩種方法。

技術分享圖片

  簡單的來說99%的網頁都可以使用這兩種方法達成瀏覽,實際上他們的功能有很多地方很相像,但是卻有著不同的作用,比如我們去點擊一個頁面,點擊一個按鈕的時候實際上是一個GET,然後再比如我們進行發微博,這種行為就是一種POST行為,但是具體的一些細節我們不展開。

  我們使用爬蟲抓取頁面實際上也是模仿的這兩種方式,而對於我們使用爬蟲來講,知道一個GET方法實際上90%以上的網站我們就都能夠順利的爬取到了,所以說接下來的Request這部分我們將著重展開,GET的使用方法,使用GET的request的請求,最簡單來講包含這些信息,使用它的方法在最左端的get,請求網址的指向與page_one.html,我們知道這是一個網頁,使用什麽樣的協議,就是HTTP 1.1,以及他的這個主網址在哪裏,相當與是host後面的後綴形成了你要請求的這個網頁鏈接,這是一個請求,最簡單的要發送的信息包含在內,當然使用request的話我們還可以去向服務器發送更多信息,比如說你是誰,你在哪兒,你是處於什麽狀態,還有你甚至是用什麽瀏覽器,這些信息全部可以通過request已經發送,你發送不同的這些信息給瀏覽器瀏覽器會給你反饋不同的結果,比如說我們日常生活中,在使用手機瀏覽器和使用PC端瀏覽器所看到的頁面結構內容是不一樣的,這就是因為我們再使用不同瀏覽器向網頁進行請求的時候,服務器識別了我們請求的客戶端到底是什麽,然後決定給我們要發送什麽形態的網頁,開的網頁,這就是在一個簡單的request中,加上了不同的信息呈現不同的結果。

技術分享圖片

Response

  response,是網站回應給我們的信息,而簡單的來說,我們在之前的學習中爬取的是一個本地的網頁,爬取的是一個本地的網頁,這些網頁如果在網絡環境中,實際上是在我們向網站提出一個request,之後然後服務器會把我們請求的這個網頁以response的形式去發送給我們,我們會得到了一些基本信息比如說,狀態碼,告訴我如果是200的話那麽意味著我的一次請求成功, 如果我的請求失敗應該返回給我403或404。如果請求成功之後,後續應該會把網頁中的元素陸陸續續地加載,這也就是我們這節的依據,再一次request的請求之後我們把網站返回給我們的這個網頁進行解析,分析它,去抓取我們想要的數據。

技術分享圖片

  剛才那簡單的敘述了一下request 和 response的原理,那麽接下來我們打開瀏覽器來看一些這種比較抽象的概念是如何在真實的網絡環境中發生的,我們首先打開一個網頁,右鍵點擊檢查(或者按F12)進入到開發者模式,我們可以看到網頁的源代碼已經加載出來了,這時候我們去監視這個網絡行為,點擊下圖中選項欄中的Network,然後點擊刷新網頁,網頁被重新加載。

技術分享圖片

這時候我們我們可以看到網頁中的加載的信息都已經顯示在這裏。

技術分享圖片

這時候我們點擊途中的第一個網頁,在headers中,request和response的信息全部記載在這個監視器中,我們點擊Request Headers,在這裏我們可以看到網頁請求的方式以及一些其他的特定的信息都已顯示在這裏。下圖中我們可以看到這個網頁的cookie。技術分享圖片

下圖是Request中的User-Agent是我們使用代理的名稱,以及地址host。

技術分享圖片

接下來我們再看選項欄中Response中的信息,實際上response的主體信息就是我們這個網頁的本身,這邊我麽可以看到response加載的網頁源碼和我們之前使用檢查打開看到的網頁源碼是一致的。

技術分享圖片

進行網頁中信息爬取

這個就是Request和Response這種交互行為在瀏覽器中的演示,那麽接下來我們就是通過利用一種與服務器的交互行為來爬去我們想要的這個數據信息,在我們寫查詢代碼之前,我們先來看一下我們要爬去的網頁,篩選一下我們需要的元素。我們需要的元素是圖片信息,以及圖片名稱,酒店個數。

技術分享圖片

1.使用Request向服務器請求獲取網頁內容

技術分享圖片

2.使用BeautifulSoup解析頁面

技術分享圖片

3.描述要爬取元素的位置

首先是我們需要的標題,我們根據上節課學習的方法拿到一個標題的CSS Selector,去掉特殊的路徑(學習過Html就應該明白),找到所有標題,我們定位一個元素就找到它唯一性的特征。

技術分享圖片

查找圖片的時候,我們為了找到我們需要的圖片,我們可以指定圖片的高和寬來查找圖片

技術分享圖片

酒店個數

技術分享圖片

4.整理並篩選所需信息

技術分享圖片

但是我們輸出之後發現我們拿到的圖片地址是錯誤的,這個是因為網站采取了反爬蟲的手段,使用js代碼控制了圖片,我們以後再講解怎麽拿到正確圖片的方法。

接下來就是代碼展示

from bs4 import BeautifulSoup
import requests


url = https://www.tripadvisor.cn/TravelersChoice-Landmarks

wb_data=requests.get(url)

soup = BeautifulSoup(wb_data.text,lxml)

titles = soup.select(div.winnerLayer > div.winnerName > div.mainName.extra > a)

imgs = soup.select("img[width=‘472px‘]")

hotelsnum = soup.select(div.lodging > div.lodgbdy > ul > li > a )

for title,img,hotelnum in zip(titles,imgs,hotelsnum):
    data = {
        title : title.get_text(),
        img:img.get(src),
        hotelnum:hotelnum.get_text(),
    }
    print(data)    

今天的爬蟲就講到這裏,重點就是我們先把服務器與本地交換機制了解清楚,然後進行網頁信息爬取練習。

爬蟲第三課:互聯網中網頁的解析