实验要求
使用python爬虫,从https://www.dytt8.net.cn/index.php/vod/show/id/6.html 爬取电影标题和主演信息,并按格式写入csv文件。
代码实现
import requests
import bs4
import csv
from bs4 import BeautifulSoup
# 获得页面内容,输入需要获取的url地址,输出页面内容
def getHTMLText(url):
try:
r = requests.get(url, timeout=30) # 获取页面,并进行超时设置
r.raise_for_status() # 产生异常信息
r.encoding = r.apparent_encoding # 指定字符集为获取得到的真实字符集
return r.text # 返回响应主体页面HTML
except:
ptint("网页获取失败")
# 解析页面提取信息,提取html中的所需信息到列表lst中
def parsePage(lst, html):
soup = BeautifulSoup(html, "html.parser") # 解析页面
try:
# 查找CSS过滤器
title_list = soup.select('.stui-vodlist__detail>h4>a') # 使用CCS类选择器及子标签查找,获得a标签存入列表
people_list = soup.select('.stui-vodlist__detail>p') # 使用CCS类选择器及子标签查找,获得p标签存入列表
# 提取信息存入列表
for i in range(len(title_list)):
title = title_list[i].string # 遍历列表获取每一个电影名称
people = people_list[i].string # 遍历列表获取每一个主演信息
lst.append([title, people]) # 将每一个电影名称和主演信息添加到列表中
except:
print("网页解析失败")
# 信息输出,写入csv文件,并使用format()设置字符串格式打印内容
def printList(lst):
try:
# 输出表头信息
# 写入csv文件
csvFile = open("data.csv", "w") # 打开文件
writer = csv.writer(csvFile)
header = ["number", "title", "people"]
writer.writerow(header)
# 使用格式化打印输出
tplt = "{0:^6}\t{1:<16}\t{2:<50}" # 设置格式
print(tplt.format("number", "title", "people", chr(12288))) # 打印表头
number = 0 # 设置计数器
# 输出电影信息
for g in lst:
number = number + 1
info = [number, g[0], g[1]]
writer.writerow(info)
print(tplt.format(number, g[0], g[1][:50], chr(12288))) # 打印内容,其中主演人员部分有所截取
csvFile.close() # 关闭文件
except:
print("输出失败")
# 主函数
def main():
depth = 3 # 设置爬取深度,即爬取的页面数,在该网页中,一个页面含36个电影信息
start_url = 'https://www.dytt8.net.cn/index.php/vod/show/id/6/page/' # 每一个页面地址中的相同起始部分
infolist = [] # 信息列表初始化
for i in range(depth):
try:
url = start_url + 'i+1' + '.html' # 构建不同页面的完整url链接
html = getHTMLText(url) # 获取页面html
parsePage(infolist, html) # 解析页面信息
except:
continue
printList(infolist) # 打印列表信息
if __name__ == '__main__':
main()