Python爬蟲小白教程(二)—— 爬取豆瓣評分TOP250電影

文章目錄
前言
安裝bs4庫
網站分析
獲取頁面
爬取頁面
頁面分析
其他頁面
前言
經過上篇博客Python爬蟲小白教程(一)—— 靜態網頁抓取後我們已經知道如何抓取一個靜態的頁面了,現在就讓我們爬取豆瓣評分TOP250的電影實戰一下。

安裝bs4庫
除了Requests庫之外,我們還需要BeautifulSoup庫來解析爬取到的頁面。在cmd中輸入:

pip install bs4
1
或者在Anaconda Prompt中輸入:

conda install bs4
1
網站分析
打開豆瓣電影TOP250 的網站,使用Chrome中的“檢查”功能查看該網頁的請求頭,如下圖所示。

按照教程一中的方法提取請求頭:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'Host':'movie.douban.com'
}
1
2
3
4
發現第一頁只有25個電影,點擊下方第二頁後URL變爲https://movie.douban.com/top250?start=25&filter=
,點擊第三頁後URL變爲https://movie.douban.com/top250?start=50&filter=,由此我們可以發現URL的規律。又發現將URL後面的&filter=刪除後仍可以打開網頁,故爲了簡便將URL改爲https://movie.douban.com/top250?start=25。

獲取頁面
爲了模塊化我們在此將獲取頁面的代碼封裝到一個函數中,如下。

import requests
from bs4 import BeautifulSoup

def get_page(url,params=None,headers=None):

    response = requests.get(url, headers=headers, params=params)
    print(response.url)
    page = BeautifulSoup(response.text, 'lxml')
    print("響應狀態碼:", response.status_code)
    
    return page
1
2
3
4
5
6
7
8
9
10
11
BeautifulSoup(response.text, 'lxml')中的lxml參數是一種常用的解析頁面的方法。

爬取頁面
運行下面的代碼,即可得到第一頁的網頁代碼。

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Host':'movie.douban.com'
    }
page = get_page('https://movie.douban.com/top250', headers=headers)
print(page)
1
2
3
4
5
6
輸出如下

爬取成功後我們進行下一步的頁面分析。

頁面分析
Chrome中有一個很快捷的方法讓我們找到想要獲取的元素在網頁代碼中的位置。如下圖所示,點擊左上角的按鈕,點擊後用鼠標點擊想要獲取的元素。


然後系統將會爲我們自動定位到該元素的代碼。

分析此電影以及其他電影名字的位置,可見它們都在<div class="hb">中,然後我們用page的find_all函數來找到代碼中所有calss爲hb的div,並將其保存到div_list中。

div_list = page.find_all('div',class_='hd')
print(div_list)
1
2
輸出如下:

然後我們分析其中一個div。

print(div_list[0])
1
輸出爲:

<div class="hd">
<a class="" href="https://movie.douban.com/subject/1292052/">
<span class="title">肖申克的救贖</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飛(港)  /  刺激1995(臺)</span>
</a>
<span class="playable">[可播放]</span>
</div>
1
2
3
4
5
6
7
8
電影名字就在第一個span中,因此僅需要

div_list[0].a.span
1
便可以將第一個span中的內容輸出來,輸出爲
<span class="title">肖申克的救贖</span>
使用.text獲取裏面的文字,再使用strip()去除空格,即

div_list[0].a.span.text.strip()
1
現在的輸出是

'肖申克的救贖'
1
至此我們已經獲得一個電影的名字,其餘的使用循環即可,並將其保存到名爲title_list的列表中,代碼如下:

title_list = []

for div in div_list:
    title = div.a.span.text.strip()
    title_list.append(title)
1
2
3
4
5
至此我們已經獲得第一個頁面的所有電影名字。

其他頁面
根據前面網站分析的步驟我們可以知道只要將傳入Requests中get的參數params改變一下即可獲得其他頁面的網頁,下面用一個循環獲取其他的頁面。

for i in range(11):
    params = {"start":(i*25)}
    page = get_page('https://movie.douban.com/top250',params=params,headers=headers)
1
2
3
綜上,所有代碼如下:

import time
import requests
from bs4 import BeautifulSoup

# 定義獲取頁面的函數
def get_page(url,params=None,headers=None):

    response = requests.get(url, headers=headers, params=params)
    page = BeautifulSoup(response.text, 'lxml')
    print(response.url)
    print("響應狀態碼:", response.status_code)
    
    return page


title_list = [] # 電影名列表
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Host':'movie.douban.com'
    }
for i in range(11):
    params = {"start":(i*25)}
    page = get_page('https://movie.douban.com/top250',params=params,headers=headers)
    
    div_list = page.find_all('div',class_='hd')
    
    for div in div_list:
        title = div.a.span.text.strip()
        title_list.append(title)
    # 每次爬完後休眠1秒鐘,防止爬取速度太快被封ip
    time.sleep(1)

title_list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
輸出如下:

使用

print(len(title_list))
1
可知title_list長度爲250,可見我們已經成功獲取到豆瓣評分TOP250 的所有電影名。
————————————————
版權聲明:本文爲CSDN博主「YonminMa」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44547562/article/details/103533502

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