程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(5)

爬取中国票房网年度电影信息并保存在csv

发布于2019-08-07 09:46     阅读(550)     评论(0)     点赞(3)     收藏(0)


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

  

优化了一下代码 

import pandas as pd
import requests
from bs4 import BeautifulSoup

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("finish")
except Exception as e:
    print("error" + str(e))

  

 



所属网站分类: 技术文章 > 博客

作者:小胖子

链接:https://www.pythonheidong.com/blog/article/9500/4254791ef402a1b5a505/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)