实战项目 — 爬取中国票房网年度电影信息并保存在csv

有一个难点是遇到了  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))

 

  

 

继续优化中,

 

转载于:https://www.cnblogs.com/chen-jun552/p/11310187.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值