
基于豆瓣网某系列电影数据采集与可视化分析.docx
17页基于豆瓣网某系列电影数据采集与可视化分析 黄蓉 毛红霞摘 要:文章基于Python程序设计实现了对豆瓣网站上《小时代》系列电影影评、剧照、歌曲的爬取,并针对爬取的影评做出相应的数据清洗以及数据可视化的展示通过爬取豆瓣网站电影影评及相关剧照,分析大众对电影的态度以及电影本身的特色,并对影评数据进行清洗,进而通过数据可视化的具体形式直观的展现观众的评价,从而解释某种关于影视作品的现象关键词:网络爬虫;数据采集;影评;可视化:TP393.09 :A :2096-4706(2020)23-0004-04Data Collection and Visual Analysis of a Series of Films Based on DHUANG Rong,MAO Hongxia(School of Computer and Software,Jincheng College of Sichuan University,Chengdu 611731,China)Abstract:Based on Python program design,this paper realized crawling of film reviews,stills and songs of Tiny Times series on D,and made corresponding data cleaning and data visual display for crawling of film reviews. Through crawling the film reviews and relevant stills on D,analyze the publics attitude towards the film and the characteristics of the film itself,and clean the film review data,and then intuitively show the audiences comments through the specific form of data visualization,so as to explain a certain phenomenon about film and television works.Keywords:web crawler;data collection;film review;visualization0 引 言目前国内影视行业存在一种“烂片高票房”的现象,而《小时代》这个系列电影就是“烂片高票房”的一个典型例子,从《小时代》上映后就遭到很多著名的影评人的批评,大家一致认为这部影片质量不高,但仍有大部分人选择花钱、花时间去观看。
为更好的解释这一现象,笔者基于学校专业课程学习的Python内容与网络爬虫内容,选择利用爬虫技术对电影影评、剧照以及歌曲进行爬取,对电影本身及观众感受逐一分析,并通过可视化将数据展示出来1 数据采集1.1 网络爬虫技術网络爬虫又通常被人们称为网页蜘蛛,它是用特定规则去爬取静态或者动态网页中所需要的数据或内容的一种方法[1],换而言之网络爬虫的本质就是自动抓取网页信息的一段代码爬取数据的基本过程可以分为四步,分别是:发送一个requests字样请求,通过HTTP库向目标服务器站点发送请求,等待对方服务器的响应;获取响应内容,如果服务器能做出正常响应,那么就会得到一个response回应,里面所包含的内容便是希望得到的网页页面内容;解析网页内容,由于得到的内容可能是HTML代码,一般需要用到正则表达式或者XPath等等进行网页解析;保存需要的数据,可以将内容存为文本、表格,也可以保存在数据库里本文所用方法是基于Python语言进行的网页数据爬取,利用Python本身提供的众多数据库,高效、精准的进行网页抓取、网页解析、数据存储等操作[2]1.2 应对反爬策略爬虫的速度是远远高于人类的速度的,所以在使用爬虫的时候会占用相当一大部分服务器的带宽,这就增大了服务器的负载,甚至在大量用户访问的情况下会造成网络拥堵,并且如果网络爬虫被滥用,会出现网络上数据内容雷同甚至一模一样的情况,使得原创作品得不到保护,于是,很多网页会设置反爬虫机制,来打破这样的局面。
那么当用户真正需要爬取数据的时候,就必须对爬虫进行伪装以下便是本项目应对反爬的策略:(1)伪装用户代理,将请求头部User-Agent字段改为浏览器的User-Agent后再发送请求User-Agent[3]2)设定休眠时间,人为浏览网页总是会停顿几秒,为了使爬虫与人类相似,一般在爬取的时候会将爬虫设置特定的休眠时间从而模拟人为登录状态[4],由此会使用time库中的sleep函数,在Selenium登入时模拟用户的点击延时行为3)使用代理IP访问网站,豆瓣网页在爬虫频繁登陆后会封禁该IP一段时间,而利用代理IP,使得同一IP访问豆瓣服务器的频率相对减小,服务器难以检测[5],避免IP被封4)伪装Cookie,一般情况下,网站会通过检验请求信息中是否存在Cookie,以及利用Cookie的值来判断该请求到底是真实用户还是爬虫[6],所以需要在用户某次登录时获取Cookie,将其加入到请求头中,达到模仿用户登录获取数据的效果1.3 模拟登录豆瓣网模拟登录网页通常有两种方式,一种是requests请求,一种是Selenium模拟浏览器自动登录,本项目选择第二种方式登录豆瓣网第一步,找到登录界面的网址,利用driver= webdriver.Chrome()启动浏览器,将找到的网址放入driver.get()方法中;第二步,利用driver.find_element_by_xpath()方法定位到密码登录的位置:用f12打开开发工具,利用鼠标点击可以找到其位置,代码表示为://*[@id="account"]/div[2]/div[2]/ div/div[1]/ul[1]/li[2];第三步,依次定位账号密码框,利用send_keys()输入内容,第四步,获取登录按钮的位置,click()点击登录即完成模拟登录。
主要代码为:#点击密码登陆,豆瓣登陆框默认号登陆password_login=driver.find_element_by_xpath(//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2])password_login.click()#找到账号框username=driver.find_element_by_css_selector(#username)username.click()username.clear()username.send_keys(***)time.sleep(2)#找到密码框password=driver.find_element_by_css_selector(#password)password.click()password.clear()password.send_keys(***)time.sleep(2)#找到登录框submit=driver.find_element_by_xpath(//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a)print(准备登陆...)submit.click()time.sleep(5)1.4 影評爬取在影评爬取之前,需要找到电影的链接,因为《小时代》系列电影有四部,所以考虑利用Selenium定位获取四部电影的名字以及链接,在利用Selenium自动搜索电影名称的时候,发现当跳出新窗口时,driver定位的还是上一个窗口展现的页面,导致不能正确的输入想要的字段使得结果报错或者元素定位错误,所以利用driver.window_handles[1]切换页面句柄,让driver自动定位到新的窗口上,最后将名字和链接存放在字典里一一对应。
每部电影需要爬取前500条数据,每页有20条数据,则需要爬取25页,这里涉及到翻页处理问题,通过网页链接的规律可知,在这25页中,只有start的值在发生变化,则可以用循环语句来代替人工翻页,代码为:link=v+comments?start={}&limit=20&status=P&sort=new_score.format(page*20),这里的page表示0到24,v代表前面电影的链接,然后用xpath提取所需要的内容,具体代码为:l = s.get(url=link, headers=headers,proxies=proxies)html = l.content.decode(utf-8)html = etree.HTML(html, parser=etree.HTMLParser (encoding=utf-8))#名字host = html.xpath(//span[@class="comment-info"]/a/text())# 评分gra = html.xpath(//span[@class="comment-info"]/span[2]/@title)#内容for c in range(1, 21):con=html.xpath(//*[@id="comments"]/div[{}]/div[2]/p/span/text().format(c))1.5 剧照爬取在爬取剧照时,同样涉及到翻页问题,网页链接的规律与影评一致,都是只有start参数改变,可将翻页处理写成:url_photo=v+photos?type=S&start={}&sortby=like&size=a&subtype=a.format(page * 30),主要代码为:# 解析网页print("开始爬取{}页".format(page + 1))response = requests.get(url_photo, headers=headers,proxies=proxies)if response.status_code == 200:soup = BeautifulSoup(response.text, "lxml")imgTags = soup.find_all("div", attrs={"class": "cover"})# 获取图片链接以及名字for imgTag in imgTags:src = imgTag.img.get("src")name = imgTag.parent.get("data-id") + movie_name[i]# print(src)resp = requests.get(src, headers=headers,proxies=proxies)1.6 音乐爬取音乐与影评、剧照所不同的是,四部电影音乐总和较少,一共15条,所以不涉及翻页处理,直接在音乐界面获取即可,代码为:def get_message(response):html=response.content.decode(utf-8)html=etree.HTML(html,parser=etree.HTMLParser (encoding=utf-8)) res_url=html.xpath(r//*[@id="content"]/div。












