1. 程式人生 > >優酷網站資訊爬取

優酷網站資訊爬取

類別指的是
這裡寫圖片描述

注意:
1.如果要使用此程式碼的話,記得更改printNameList函式下的儲存資訊的資料夾名稱
2.如果看不明白程式碼的話,程式碼裡面的所有註釋掉的print都可以開啟,以便讓你知道每句話是什麼意思。
3.因為我想要查詢每一年的各種類別下的名稱資訊,所以我都是按年份來查詢的,可以發現(用綜藝類別舉例),在它的頁面連結裡,每翻一頁,連結裡只有兩個地方會發生變化,一個是年份一個是頁碼會發生變化,所以自己的程式碼裡注意這一點,便可以爬取每一年份裡的所有資訊了。
4.另外,如何獲取每一年裡到底有多少頁呢,下面有一個函式findpage寫了。

import requests
import
os import datetime from bs4 import BeautifulSoup def getHTMLText(url): try: r=requests.get(url,timeout=30) r.raise_for_status() r.encoding=r.apparent_encoding return r.text except: return "" #該函式用來收集每頁的資料的資訊(這裡收集的是名字) def parsePage(namelist,html): soup = BeautifulSoup(html, 'html.parser'
) lis = soup.find_all('li',class_='title') for i in lis: namelist.append(i.a.string) #print(i.a.string) #print(len(lis)) #print("this is parsePage") #該函式是用來查詢每一個類別有多少頁 def findpage(html): soup = BeautifulSoup(html,'html.parser') lis=soup.find('ul',class_='yk-pages'
) lilist=[]#用來裝li標籤的 for li in lis: lilist.append(li) length=lilist[-2].string #因為[-1]是“下一頁,所以[-2]是當前最大頁,也就是每一個類別到底有多少頁” #print("頁碼數:"+lilist[-2].string) #print("this is findpage") return length #該函式是用來把所獲得的資訊按類別以及年份寫入.txt def printNameList(namelist,trueyear,show): if not os.path.exists(r'\Users\qiqi\Desktop\優酷爬取資訊'): os.mkdir(r'\Users\qiqi\Desktop\優酷爬取資訊') if not os.path.exists(r'\Users\qiqi\Desktop\優酷爬取資訊\{0}'.format(show)): os.mkdir(r'\Users\qiqi\Desktop\優酷爬取資訊\{0}'.format(show)) path=r'\Users\qiqi\Desktop\優酷爬取資訊\{0}\{1}.txt'.format(show,trueyear) list = open(path, 'w',encoding='utf-8') list.write(str(trueyear)+'年全部{0}節目'.format(show)+'\n') for i in range(len(namelist)): list.write(str(i+1)+". "+namelist[i]+'\n') list.close() #print("this is printNameList") return "" def main(): starttime = datetime.datetime.now() year=2018 print("有以下優酷類別您可以爬取:綜藝、音樂、動漫、體育、劇集、電影") category={'綜藝':'85','音樂':'95','動漫':'100','體育':'98','劇集':'97','電影':'96'} show=input("請輸入您要爬取的綜藝類別:") #print(category[show]) url1 = 'http://list.youku.com/category/show/c_' url2='_r_' url3 = '_s_1_d_1_p_' url4 = '.html?spm=a2h1n.8251845.0.0' num=int(input("請輸入您想要近幾年的東西(例如:輸入5是想要近5年的資料):")) while num>0: namelist = [] trueyear=year-num+1 #下面的三句話都是為了獲取每一個類別每一年有多少頁碼 turl=url1 + category[show] + url2 + str(trueyear) + url3 + str(1) + url4 thtml=getHTMLText(turl) length=int(findpage(thtml)) #print(str(trueyear)+"有"+str(length)+"頁") for i in range(1,length+1): url=url1 + category[show] + url2 + str(trueyear) + url3 + str(i) + url4 #print(url) #print("這是{0}年第{1}頁的內容".format(trueyear,i)) html=getHTMLText(url) parsePage(namelist,html) printNameList(namelist,trueyear,show) num=num-1 endtime = datetime.datetime.now() print("執行時間為:{}".format(endtime - starttime)) main()

執行過程
這裡寫圖片描述
結果
這裡寫圖片描述