爬取《電影天堂》,保存評分大於7.0 的電影地址

臨近放假,無心看代碼,乾脆做點趣味的事情,爬蟲找幾部電影,打發旅途時間。(頭一次,爲自己編程^_^)

python爬蟲,基本參考  網絡爬蟲實戰:爬取並下載《電影天堂》3千多部動作片電影 這個博主的文章,但是碰到亂碼,也是按照該博主的blog提示解決了,然後這裏自己加了個過濾評分的。

# 我們用到的庫
#大體來自原博客 https://blog.csdn.net/wenxuhonghe/article/details/84897936
import requests
import bs4
import re
import pandas as pd


def get_data(url):
    '''
    功能:訪問 url 的網頁,獲取網頁內容並返回
    參數:
        url :目標網頁的 url
    返回:目標網頁的 html 內容
    '''
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
    }
 
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        #add:canok
        #下面這個,自動推測網站編碼,避免亂碼
        r.encoding = r.apparent_encoding
        return r.text
    
    except requests.HTTPError as e:
        print(e)
        print("HTTPError")
    except requests.RequestException as e:
        print(e)
    except:
        print("Unknown Error !")



def parse_data(html):
    '''
    功能:提取 html 頁面信息中的關鍵信息,並整合一個數組並返回
    參數:html 根據 url 獲取到的網頁內容
    返回:存儲有 html 中提取出的關鍵信息的數組
    '''
    bsobj = bs4.BeautifulSoup(html,'html.parser')
    info = []
    
    # 獲取電影列表
    tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})
    
    # 對電影列表中的每一部電影單獨處理
    for item in tbList:

        movie = []
        link = item.b.find_all('a')[1]

        # 獲取電影的名稱
        name = link["title"]

        # 獲取詳情頁面的 url
        url = 'https://www.dy2018.com' + link["href"]

       
        
        try:
            # 訪問電影的詳情頁面,查找電影下載的磁力鏈接
            temp = bs4.BeautifulSoup(get_data(url),'html.parser')
            tbody = temp.find_all('tbody')
            
            score = 0
            #add: canok  添加評分過濾:
            score_co = temp.find_all('span')
            for i in score_co:
                #print(i)
                if '評分:' in i:
                    #print('找到評分',i)
                    score = float(i.strong.text)
                    break
            if score < 7.0:
                print('score too low,skip',score,name)
                continue
            else:
                # 將數據存放到電影信息列表裏
                movie.append(name)
                movie.append(url)
                #print(name,url)

            # 下載鏈接有多個(也可能沒有),這裏將所有鏈接都放進來
            for i in tbody:
                download = i.a.text
                movie.append(download)
                #print(download)
            #print(movie)

            # 將此電影的信息加入到電影列表中
            info.append(movie)
            
        except Exception as e:
            print(e)
    
    return info

def save_data(data):
    '''
    功能:將 data 中的信息輸出到文件中/或數據庫中。
    參數:data 將要保存的數據  
    '''
    filename = './電影天堂.csv'
    
    dataframe = pd.DataFrame(data)
    dataframe.to_csv(filename,encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)



def main():
    # 循環爬取多頁數據
    for page in range(1, 2):
        print('正在爬取:第' + str(page) + '頁......')       
        # 根據之前分析的 URL 的組成結構,構造新的 url
        if page == 1:
            index = 'index'
        else:
            index = 'index_' + str(page)            
        url = 'https://www.dy2018.com/2/'+ index +'.html'
        # 依次調用網絡請求函數,網頁解析函數,數據存儲函數,爬取並保存該頁數據
        html = get_data(url)
        movies = parse_data(html)
        if movies:
            save_data(movies)
        #print(movies)
        break
        print('第' + str(page) + '頁完成!')

if __name__ == '__main__':
    print('爬蟲啓動成功!')
    main()
    print('爬蟲執行完畢!')

評分的標籤:

上面只抓了3頁,過濾小於7.0評分的資源。

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