優酷網站資訊爬取
阿新 • • 發佈:2019-01-24
類別指的是
注意:
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()
執行過程
結果