任务描述
需要收集目前国产电视剧的相关数据,预判一个电视剧的评分走向。
任务说明
收集数据,至少包含评分、电视剧名称、主演信息等三个信息。之后将数据存储到一个csv表中。表头如下:title、rating、stars,命名为tv_rating.csv。
初步分析
对比豆瓣和中国电视剧网可以看出,电视剧网有页数显示,页面的URL的page参数会发生变化。这样只需要抓取一个页面,然后用一个循环来不断执行该方法。
数据获取
网页下载有两种方法,一种用urllib3直接下载,另一种对于动态网页,需要使用selenium模拟浏览器技术下载。 所以下载网页第一步就是判断需要用那种方式。
单个页面下载
首先通过第一张方法下载网页,得到需要的数据,说明不是动态网页,可以用第一种方法获取。
import urllib3
def download_content(url):
http = urllib3.PoolManager()
response = http.request("GET", url)
response_data = response.data
html_content = response_data.decode()
return html_content
def save_to_file(filename, content):
fo = open(filename, "w", encoding= "utf-8")
fo.write(content)
fo.close()
url="http://dianshiju.tv/search.php?page=1&searchtype=5&order=commend&tid=1&area=&year=&letter=&state=&money=&ver=&jq=&yuyan=%E5%9B%BD%E8%AF%AD"
html_conten=download_content(url)
save_to_file("htmls/tv1.html",html_conten)
多个页面下载
可以用time模块的sleep方法来使程序暂停固定的时间。
import time
for i in range(2, 100):
a_url = url.replace("page=1", "page=" + str(i))
print("begin download:", a_url)
html_content = download_content(a_url)
file_name = "htmls/tv" + str(i) + ".html"
save_to_file(file_name, html_content)
time.sleep(1)
到此所有数据都下载到本地了,接下来要做的就是编写代码提取出信息。
初步分析
要使用BeautifulSoup来提取数据,首先应该分析想要的内容周围的标签结构,然后根据标签的层级关系来设计如何获取信息。 可以看到在一个class为myui-vodlist_box的div标签内部,基本包含了我们所需要的信息。 所以获取数据的思路为:
- 获取所有class=myui-vodlist_box的div标签对象
- 针对每一个标签对象,尝试:查找h4标签,获取电视剧名称;查找class=“pic-tag pic-tag-top”的span标签,获取评分;查找p标签,并获得演员信息。
提取单个html界面信息
from bs4 import BeautifulSoup
def create_doc_from_filename(filename):
fo = open(filename, "r", encoding='utf-8')
html_content = fo.read()
fo.close()
doc = BeautifulSoup(html_content)
return doc
doc = create_doc_from_filename("htmls/tv2.html")
box_list = doc.find_all("div", class_ = "myui-vodlist_box")
for box in box_list:
title_label = box.find_all("h4")[0]
rating_label = box.find_all("span", class_ = "pic-tag pic-tag-top")[0]
stars_label = box.find_all("p")[0]
title = title_label.text.strip()
rating = rating_label.text.strip()
stars = stars_label.text.strip()
print(title, rating, stars)
提取多个页面信息并保存到csv文件中
def get_tv_from_html(html_file_name):
doc = create_doc_from_filename(html_file_name)
box_list = doc.find_all("div", class_="myui-vodlist__box")
for box in box_list:
title_label = box.find_all("h4")[0]
rating_label = box.find_all("span", class_="pic-tag pic-tag-top")[0]
stars_label = box.find_all("p")[0]
title = title_label.text.strip()
rating = rating_label.text.strip()
stars = stars_label.text.strip()
print(title, rating, stars)
get_tv_from_html("htmls/tv2.html")
import csv
def write_dict_list_to_csv(dict_list, filename, headers):
fo = open(filename, "w", newline='', encoding='utf_8_sig')
writer = csv.DictWriter(fo, headers)
writer.writeheader()
writer.writerows(dict_list)
fo.close()
all_tv_dict = []
def get_tv_from_html(html_file_name):
doc = create_doc_from_filename(html_file_name)
box_list = doc.find_all("div", class_="myui-vodlist__box")
tv_list = []
for box in box_list:
title_label = box.find_all("h4")[0]
rating_label = box.find_all("span", class_="pic-tag pic-tag-top")[0]
stars_label = box.find_all("p")[0]
title = title_label.text.strip()
rating = rating_label.text.strip()
stars = stars_label.text.strip()
tv_dict = {}
tv_dict["title"] = title
tv_dict["rating"] = rating
tv_dict["stars"] = stars
tv_list.append(tv_dict)
return tv_list
tv_list = get_tv_from_html("htmls/tv2.html")
print(tv_list)
for i in range(1, 100):
file_name = "htmls/tv" + str(i) + ".html"
dict_list = get_tv_from_html(file_name)
all_tv_dict = all_tv_dict + dict_list
print(len(all_tv_dict))
write_dict_list_to_csv(all_tv_dict, "tv_rating.csv", ["title", "rating", "stars"])
|