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