前幾天,劉若英的《後來》電影版——《後來的我們》上映了,我身邊也有小夥伴去看了,問了之後,他們說其實這個電影對沒有多少故事的我們代入感不夠強,我沒去看,一是因爲單身狗一隻,去電影院看電影純屬找虐,另一個原因就是我事先看過這個電影在豆瓣上的評分,以及各種影評,所以綜合考慮還是等各大視頻網站上映了再在網站上看吧。那麼,去豆瓣網翻影評,一頁一頁太麻煩了,浪費時間,怎麼樣才能又快又準確的獲取影評呢?答案很簡單,幾段爬蟲代碼就完成了,究竟多簡單呢?我們一塊來看。
一、找到要爬的網頁,並且確定要爬取的數據在網頁源代碼中的位置
首先我們要進入豆瓣電影(我也不知道爲啥基本上所有的爬蟲入門都要拿豆瓣電影開刀哈哈哈),找到《後來的我們》影評部分
點進全部影評之後:
這就是我們要爬的目標網頁了,記下網址: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的渣渣(就係我)關於簡單靜態網絡爬蟲的一些理解,如果有什麼表述不當的或者有誤的,懇請路過的大佬批評指正。