媒介
本日为大家带来利用Python爬虫抓取豆瓣影戏《外太空的莫扎特》影评,废话不多说。
Let's start happily
开发工具
Python版本: 3.6.4
相关模块:
requests模块
json模块
re模块
os模块
bs4模块
pandas模块
time模块
环境搭建
安装Python并添加到环境变量,pip安装必要的相关模块即可。
思绪分析
本文以爬取豆瓣影戏《外太空的莫扎特》影评,讲授怎样爬取豆瓣影戏《外太空的莫扎特》影评!
前期准备
1.获取页面内容
def get_html(url): """获取网页全部数据""" headers = Agent_info() try: r = requests.get(url=url, headers=headers, timeout=30) r.encoding = r.apparent_encoding status = r.status_code datas = json.loads(r.text)["html"] str_html = "<html>{}</html>".format(datas) html = BeautifulSoup(str_html, "html.parser") print("爬虫状态码: " + str(status)) # print(type(html)) return html except Exception as e: print("很遗憾,数据爬取失败!") print(e)2.提取数据
- 欣赏器中打开我们要爬取的页面
- 按F12进入开发者工具,查察我们想要的数据在那里
- 这里我们必要时间, 用户, 星级, 短评, 支持数
def etl_data(html): """提取数据""" comments = html.find_all('div', 'comment-item') # print(comments[0]) # 获取影戏的品评并生存到列表(时间,用户,星级,短评,支持数) datas = [] for span in comments: # 短评发表的时间 times = span.find('span', 'comment-time').attrs['title'] # 用户名 name = span.find('a').attrs["title"] # 用户评分星级 try: level = span.find('span', 'rating').attrs['class'][0][-2:] if (level == '10'): level = "一星" elif (level == '20'): level = "二星" elif (level == '30'): level = "三星" elif (level == '40'): level = "四星" elif (level == '50'): level = "五星" except Exception as e: level = "无评价" content = span.find('span', 'short').string.strip() content = re.sub(r'\n', '', content) # 短评支持数 love_point = span.find('span', 'vote-count').string.strip() arr = [times, name, level, content, love_point] datas.append(arr) df = pd.DataFrame(datas) df.columns = ["时间", "用户", "星级", "短评", "支持数"] # print(arr) return df3.获取下一个页面url
def get_nextUrl(html): """抓取下一个页面的 url""" try: # 找到下一页的 url url = html.find('a', 'next').attrs['href'] # print(url) next_start = re.search(r'[0-9]\d{0,5}', url).group(0) print("已经到 " + str(next_start) + " ,稍等一会儿\n") next_url = "https://movie.douban.com/subject/35168646/comments?percent_type=" \ "&start={}&limit=20&status=P&sort=new_score&comments_only=1&ck=Cuyu".format(next_start) # print(next_url) return next_url except: print("到底了~")运行结果
4.长期化存储数据代码实现
def save_data(data, fileName, Flag): """长期化存储数据""" file_name = fileName + "_" + time.strftime("%Y_%m_%d", time.localtime(time.time())) + ".csv" # print(file_name) data.to_csv(file_name, index=False, header=Flag, mode='a', encoding="utf_8_sig") if os.path.exists(file_name): print(file_name + " 数据爬取并生存乐成!") else: print('数据生存失败,请再次实验!')#代码测试2022.7.28无非常,点赞高出100,更新豆瓣读书Top250结果展示
|