有一个难点是遇到了 pandas返回的数据类型,DataFrame() 函数处理才能写入到csv文件里
import pandas as pd
import requests
from bs4 import BeautifulSoup
import csv
url = "http://www.cbooo.cn/year?year=2018"
datas = requests.get(url).text
# 解析url
soup = BeautifulSoup(datas,'lxml')
# 获取数据集合,find_all 返回的是集合类型,所以取[0], 找table标签下 的 属性是 id:tbContent
moives_tables = soup.find_all('table',{'id':'tbContent'})[0]
# 获取每一个子节点 tr标签
moives = moives_tables.findAll('tr')
# 获取电影名字,电影名字在每个tr标签里面的第一个td标签里面,由于是有多个td所以要用for遍历
names = [ tr.find_all('td')[0].a.get('title') for tr in moives[1:]]
# 获取电影的详情页url地址,而且下面提供给获取导演使用,因为导演信息不在主页面上
hrefs = [ tr.find_all('td')[0].a.get('href') for tr in moives[1:]]
# 获取电影类型,
types = [ tr.find_all('td')[1].string for tr in moives[1:]]
# 获取票房数据
box_offices = [ int(tr.find_all('td')[2].string) for tr in moives[1:]]
# 获取平均票价
Average_fare = [ tr.find_all('td')[3].string for tr in moives[1:]]
# 获取上映日期
show_time = [ tr.find_all('td')[6].string for tr in moives[1:]]
# 构建个获取详情页的导演的函数
def getInfo(url):
# 请求榜上的电影详情页
datas = requests.get(url).text
soup = BeautifulSoup(datas, 'lxml')
# 获取导演,由于数据是带换行的,所以要用replace("\n","") 取消换行
daoyan = soup.select('dl.dltext dd')[0].get_text().replace("\n","")
return daoyan
directors = [getInfo(url) for url in hrefs]
# 数据拼接,得到的数据类型是 <class 'pandas.core.frame.DataFrame'> ,所以要用 DataFrame() 函数来写入excel
df = pd.DataFrame({
'name': names,
'href': hrefs,
'type': types,
'box_office': box_offices,
'Average_fare': Average_fare,
'show_time': show_time,
'directors': directors
})
try:
# 打开和创建excel,设置保存路径,如果不定义路径,默认存储到py文件目录
with open("D://box_office_01.csv", 'w', newline="") as f:
result = pd.DataFrame()
result['name'] = names
result['href'] = hrefs
result['type'] = types
result['box_office'] = box_offices
result['Average_fare'] = Average_fare
result['show_time'] = show_time
result['directors'] = directors
# 这个步骤是把上面的格式写入excel,而且路径要和上面定义的一样
result.to_csv('D://box_office_01.csv')
f.close()
print('finish')
except Exception as e:
print("error" + str(e))
优化了一下代码 , 主要是提升了 csv写入效率和记录了程序运行时间
import pandas as pd
import requests
from bs4 import BeautifulSoup
import time
# 计算开始时间
start_time = time.time()
url = "http://www.cbooo.cn/year?year=2018"
datas = requests.get(url).text
# 解析url
soup = BeautifulSoup(datas,'lxml')
# 获取数据集合,find_all 返回的是集合类型,所以取[0], 找table标签下 的 属性是 id:tbContent
moives_tables = soup.find_all('table',{'id':'tbContent'})[0]
# 获取每一个子节点 tr标签
moives = moives_tables.findAll('tr')
# 获取电影名字,电影名字在每个tr标签里面的第一个td标签里面,由于是有多个td所以要用for遍历
names = [ tr.find_all('td')[0].a.get('title') for tr in moives[1:]]
# 获取电影的详情页url地址,而且下面提供给获取导演使用,因为导演信息不在主页面上
hrefs = [ tr.find_all('td')[0].a.get('href') for tr in moives[1:]]
# 获取电影类型,
types = [ tr.find_all('td')[1].string for tr in moives[1:]]
# 获取票房数据
box_offices = [ int(tr.find_all('td')[2].string) for tr in moives[1:]]
# 获取平均票价
Average_fare = [ tr.find_all('td')[3].string for tr in moives[1:]]
# 获取上映日期
show_time = [ tr.find_all('td')[6].string for tr in moives[1:]]
# 构建个获取详情页的导演的函数
def getInfo(url):
# 请求榜上的电影详情页
datas = requests.get(url).text
soup = BeautifulSoup(datas, 'lxml')
# 获取导演,由于数据是带换行的,所以要用replace("\n","") 取消换行
daoyan = soup.select('dl.dltext dd')[0].get_text().replace("\n","")
return daoyan
directors = [getInfo(url) for url in hrefs]
# 数据拼接,得到的数据类型是 <class 'pandas.core.frame.DataFrame'> ,所以要用 DataFrame() 函数来写入excel
df = pd.DataFrame({
'name': names,
'href': hrefs,
'type': types,
'box_office': box_offices,
'Average_fare': Average_fare,
'show_time': show_time,
'directors': directors
})
try:
df.to_csv('D://box_office_02.csv')
print("done")
except Exception as e:
print("error" + str(e))
print("finish, 消耗时间: %f s" % (time.time() - start_time))
继续优化中,