實現一個簡單的Python網絡爬蟲,爬取靜態網頁的數據——以《後來的我們》影評爲例

前幾天,劉若英的《後來》電影版——《後來的我們》上映了,我身邊也有小夥伴去看了,問了之後,他們說其實這個電影對沒有多少故事的我們代入感不夠強,我沒去看,一是因爲單身狗一隻,去電影院看電影純屬找虐,另一個原因就是我事先看過這個電影在豆瓣上的評分,以及各種影評,所以綜合考慮還是等各大視頻網站上映了再在網站上看吧。那麼,去豆瓣網翻影評,一頁一頁太麻煩了,浪費時間,怎麼樣才能又快又準確的獲取影評呢?答案很簡單,幾段爬蟲代碼就完成了,究竟多簡單呢?我們一塊來看。

一、找到要爬的網頁,並且確定要爬取的數據在網頁源代碼中的位置

首先我們要進入豆瓣電影(我也不知道爲啥基本上所有的爬蟲入門都要拿豆瓣電影開刀哈哈哈),找到《後來的我們》影評部分

點進全部影評之後:

這就是我們要爬的目標網頁了,記下網址:https://movie.douban.com/subject/26683723/comments?status=P

接下來是找到影評在網頁源代碼中的位置:

1、在該網頁單擊鼠標右鍵>檢查,就出現了下面的情況:


2、在檢查窗口移動鼠標,放在不同的代碼段上,網頁上就會有不同的區域被選中,經過不斷查找,我們發現存放影評的文字都存放在<p class=""> </p>標籤當中,那麼影評的位置就這樣確定下來了,接下來就交給Python吧!


二、用Python寫一段爬蟲代碼

我們要用到的是Python語言,所以要用的開發工具是PyCharm

1、file>new project,新建一個Python項目,然後file > new >Python file


先上代碼:

#需要調用的requests 庫和 BeautifulSoup庫中的bs4工具
import requests
from bs4 import BeautifulSoup
num=0#定義條數的初始值
#定義一個變量url,爲需要爬取數據我網頁網址
url = 'https://movie.douban.com/subject/26683723/comments?status=P'
#獲取這個網頁的源代碼,存放在req中,{}中爲不同瀏覽器的不同User-Agent屬性,針對不同瀏覽器可以自行百度
req = requests.get(url,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
#生成一個Beautifulsoup對象,用以後邊的查找工作
soup = BeautifulSoup(req.text,'lxml')
#找到所有p標籤中的內容並存放在xml這樣一個類似於數組隊列的對象中
xml = soup.find_all('p',class_='')
#利用循環將xml[]中存放的每一條打印出來

for i in range(len(xml)):#表示從0到xml的len()長度
    msg = xml[i].string
    if not msg is None:
        num += 1
        print('第', num, '條', msg)

運行之後,就是如下效果:


爬蟲是如此的神奇。

三、優化

簡單的爬蟲效果就是以上內容了,那麼是不是每次只能獲取那20條影評呢?能不能實現自動翻頁,把所有的數據都爬下來?

答案是肯定的。不過首先我們要找到上下頁網址之間存在的聯繫,這樣我們就能實現自動翻頁了。

首先是影評的第一頁:https://movie.douban.com/subject/26683723/comments?status=P

點擊後頁之後,第二頁:

https://movie.douban.com/subject/26683723/comments?start=20&limit=20&sort=new_score&status=P&percent_type=

再點擊後頁,第三頁:

https://movie.douban.com/subject/26683723/comments?start=40&limit=20&sort=new_score&status=P&percent_type=

當我們點擊首頁,第一頁:

https://movie.douban.com/subject/26683723/comments?start=0&limit=20&sort=new_score&status=P&percent_type=

對比發現:它們的區別在於start=後邊的數字不同,都是20的整倍數(原因是每頁都只有20條影評)

所以只要實現start=後邊的字符串的改變,即可實現對不同頁面進行爬取。

具體方法如下:

#需要調用的requests 庫和 BeautifulSoup庫中的bs4工具
import requests
from bs4 import BeautifulSoup
num=0#定義條數的初始值
#通過循環實現對不同頁碼的網頁的數據爬取
for page in range(10):#以10頁爲例
    value = page * 20#考慮到start=後邊的都是20的整倍數
    #定義一個變量url,爲需要爬取數據我網頁網址(要將url由'https://movie.douban.com/subject/26683723/comments?status=P'換成'https://movie.douban.com/subject/26683723/comments?start=0&limit=20&sort=new_score&status=P&percent_type=')
    #利用Python中字符串替換的方法:在要替換的地方用%s代替,在語句後%+要替換的內容
    url = 'https://movie.douban.com/subject/26683723/comments?start=%s&limit=20&sort=new_score&status=P&percent_type=' %str(value)#str轉型
    #獲取這個網頁的源代碼,存放在req中,{}中爲不同瀏覽器的不同User-Agent屬性,針對不同瀏覽器可以自行百度
    req = requests.get(url,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
    #生成一個Beautifulsoup對象,用以後邊的查找工作
    soup = BeautifulSoup(req.text,'lxml')
    #找到所有p標籤中的內容並存放在xml這樣一個類似於數組隊列的對象中
    xml = soup.find_all('p',class_='')
    #利用循環將xml[]中存放的每一條打印出來

    for i in range(len(xml)):#表示從0到xml的len()長度
        msg = xml[i].string
        if not msg is None:
            num += 1
            print('第', num, '條', msg)

點擊運行,就是以下效果:


當然,很多網站都會有反爬機制,當短時間內同一個IP多次對服務器進行訪問時,服務器會暫時中斷對該IP的服務,這樣我們就不能得到想要的結果,所以一個辦法就是增加延時,當然還有其他很多辦法,因爲我也只是個小白,只會這麼多。下邊是加上延時之後代碼:

#需要調用的requests 庫和 BeautifulSoup庫中的bs4工具
import requests
from bs4 import BeautifulSoup
import time
num=0#定義條數的初始值
#通過循環實現對不同頁碼的網頁的數據爬取
for page in range(10):#以10頁爲例
    time.sleep(1)       #延時1秒
    value = page * 20#考慮到start=後邊的都是20的整倍數
    #定義一個變量url,爲需要爬取數據我網頁網址(要將url由'https://movie.douban.com/subject/26683723/comments?status=P'換成'https://movie.douban.com/subject/26683723/comments?start=0&limit=20&sort=new_score&status=P&percent_type=')
    #利用Python中字符串替換的方法:在要替換的地方用%s代替,在語句後%+要替換的內容
    url = 'https://movie.douban.com/subject/26683723/comments?start=%s&limit=20&sort=new_score&status=P&percent_type=' %str(value)#str轉型
    #獲取這個網頁的源代碼,存放在req中,{}中爲不同瀏覽器的不同User-Agent屬性,針對不同瀏覽器可以自行百度
    req = requests.get(url,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
    #生成一個Beautifulsoup對象,用以後邊的查找工作
    soup = BeautifulSoup(req.text,'lxml')
    #找到所有p標籤中的內容並存放在xml這樣一個類似於數組隊列的對象中
    xml = soup.find_all('p',class_='')
    #利用循環將xml[]中存放的每一條打印出來

    for i in range(len(xml)):#表示從0到xml的len()長度
        msg = xml[i].string
        if not msg is None:
            num += 1
            print('第', num, '條', msg)

小結

主要有以下步驟:先找到目標網頁,分析網頁源碼,確定所需數據的位置,編寫Python代碼,調用Python強大的工具就可以實現了。

以上就是剛入門Python的渣渣(就係我)關於簡單靜態網絡爬蟲的一些理解,如果有什麼表述不當的或者有誤的,懇請路過的大佬批評指正。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章