下面的代码可以获取优酷网址下的所有类别的名称信息
优酷网址为http://list.youku.com/category/video/
<http://list.youku.com/category/video/>
类别指的是
注意:
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_encodingreturn 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()
运行过程
结果
热门工具 换一换