发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!