1. 程式人生 > >爬取豆瓣電影排行(T250)的資訊

爬取豆瓣電影排行(T250)的資訊

1.分析

針對所爬去的Url進行分析:

分析網址'?'符號後的引數,第一個引數'start=0',這個代表頁數,‘=0’時代表第一頁,‘=25’代表第二頁,以此類推。

1.1頁面分析

明確要爬取的元素 :排名、名字、導演、評語、評分

1.2 頁面程式碼分析

2.網站資訊爬取

2.1 獲取每部分電影資訊

def get_html(web_url):
    header = {
        "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) 
    AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
    html = requests.get(url=web_url,headers= header).text
    soup = BeautifulSoup(html,'lxml')
    data = soup.find('ol').find_all('li') #擷取需要的內容
    return data

【程式碼說明】

requests.get()函式,會根據引數中url的連結,返回response物件

.text會將response物件轉換成str型別

find_all()函式,會將html文字中的ol標籤下的每一個li標籤中的內容篩選出來

2.2 篩選資訊儲存進入文字

def get_info(all_move):

    f = open("./douban.txt", "a",encoding='UTF-8')

    for info in all_move:
        #排名
        nums = info.find('em')
        num = nums.get_text()

        #名字
        names = info.find("span")  # 名字比較簡單 直接獲取第一個span就是
        name = names.get_text()

        #導演
        charactors = info.find("p")  # 這段資訊中有太多非法符號你需要替換掉
        charactor = charactors.get_text().replace(" ", "").replace("\n", "")  # 使資訊排列規律
        charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
            "\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")

        #評語
        remarks = info.find_all("span", {"class": "inq"})
        if remarks:  # 這個判斷是因為有的電影沒有評語,你需要做判斷
            remark = remarks[0].get_text().replace("\u22ef", "")
        else:
            remark = "此影片沒有評價"
        print(remarks)

        #評分
        scores = info.find_all("span", {"class": "rating_num"})
        score = scores[0].get_text()

        f.write(num + '、')
        f.write(name + "\n")
        f.write(charactor + "\n")
        f.write(remark + "\n")
        # f.write(score)
        f.write("\n\n")

    f.close()  # 記得關閉檔案

注意爬取元素的時候,會有非法符號(因為這些符號的存在,會影響你寫入文字中),所以需要將符號用replace函式替換.

【Tips】注意寫資料時將格式改為“UTF-8”,不然所寫資訊為亂碼

3.全部程式碼(如下)

#coding:utf-8
from bs4 import BeautifulSoup
import requests
import os

def get_html(web_url):
    header = {
        "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
    html = requests.get(url=web_url,headers= header).text
    soup = BeautifulSoup(html,'lxml')
    data = soup.find('ol').find_all('li') #擷取需要的內容
    return data

def get_info(all_move):

    f = open("./douban.txt", "a",encoding='UTF-8')

    for info in all_move:
        #排名
        nums = info.find('em')
        num = nums.get_text()

        #名字
        names = info.find("span")  # 名字比較簡單 直接獲取第一個span就是
        name = names.get_text()

        #導演
        charactors = info.find("p")  # 這段資訊中有太多非法符號你需要替換掉
        charactor = charactors.get_text().replace(" ", "").replace("\n", "")  # 使資訊排列規律
        charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
            "\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")

        #評語
        remarks = info.find_all("span", {"class": "inq"})
        if remarks:  # 這個判斷是因為有的電影沒有評語,你需要做判斷
            remark = remarks[0].get_text().replace("\u22ef", "")
        else:
            remark = "此影片沒有評價"
        print(remarks)

        #評分
        scores = info.find_all("span", {"class": "rating_num"})
        score = scores[0].get_text()

        f.write(num + '、')
        f.write(name + "\n")
        f.write(charactor + "\n")
        f.write(remark + "\n")
        # f.write(score)
        f.write("\n\n")

    f.close()  # 記得關閉檔案


if __name__ == "__main__":
    File_Path = os.getcwd()[:-4] + 'Test\\'  # 獲取到當前檔案的目錄,並檢查是否有report資料夾,如果不存在則自動新建report檔案
    if not os.path.exists(File_Path):
        os.makedirs(File_Path)

    page = 0  # 初始化頁數,TOP一共有250部   每頁25部
    while page <= 225:
        web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
        all_move = get_html(web_url)  # 返回每一頁的網頁
        get_info(all_move)  # 匹配對應資訊存入本地
        page += 25

【結果展示】

Wimb