本文爬虫的步骤:
使用Selenium库的webdriver进行网页元素定位和信息获取;
使用BeautifulSoup库进行数据的提取;
使用Pandas库进行数据的存储。
后台回复python爬虫可获取PPT和影评数据。
《流浪地球》大年初一在内陆上映,也快一个月了。上映以来,票房一路高升。前几日,《流浪地球》已经超过40亿了,跃居中国电影票房总榜第二了。对于这部电影,好评也有,争议也有,微博上热点也是不断。本来之前就想自己用Python爬虫爬取一下豆瓣影评,再做做数据分析。不过这几天都没有来得及弄。这电影都要下了,我才来蹭这个热点,这个热度估计是蹭不上了。
这个周末主要写了一部分爬虫代码爬取了豆瓣影评,先在公众号上记录下来。下周如果有时间的话,会接着使用爬取到的影评数据,进行简单的数据处理和数据分析。
这部分Python爬虫主要使用了两个库,Selenium库和BeautifulSoup库。
在进行爬虫之前,需要先了解到几个概念,微信后台回复python爬虫,可获取到我一年多前学习爬虫时做的一份PPT分享(其实PPT比较简单,更具体的教程可自行百度)。目前爬虫程序还在继续,现在保存了60000条豆瓣影评数据,后台一并分享。
PPT截图
爬取的数据存储格式如下:
想更深入学习爬虫的,推荐一本入门教程:《Python网络数据采集》,内容详尽,而且简单易懂。
以下为爬虫的简单说明和代码。
其实一般的爬虫流程很简单:
1、发送http请求,获取网络源码
一般这一部分调用urllib.request库就好。由于本文爬取豆瓣影评数据要登录个人豆瓣账号,所以我改用Selenium库的webdriver来调用浏览器访问豆瓣网进行数据的抓取。注:在此之前,需要自行下载驱动webdriver。本文使用的浏览器是chrome,不同版本对应的webdriver可在以下网址下载:
http://chromedriver./index.html
或者
/mirrors/chromedriver
2、网页解析
对于网页解析,需要了解HTML这个概念,同时需要知道:标签(Tag)、属性(Attribute)。使用Python进行页面解析和数据提取,一般可使用re库正则表达式处理。或者使用BeautifulSoup库,该库提供了很便利的函数,可以直接根据标签、属性名、属性值等定位到网页元素,提取相应的内容。
那么如何找到我们需要抓取的网页内容在HTML中对应的标签路径呢?可借助开发者工具,打开浏览器,按快捷键F12。在弹出的窗口右上角,点击箭头图标,如下图红框:
之后我们就可以在浏览器左侧用鼠标选择或点击网页内容,在右侧的开发者工具栏就能定位到相应的HTML内容了。
3、数据处理保存。
数据的处理和保存很简单,本文直接使用Pandas库保存为xlsx格式。
#-*-coding:utf-8-*-
"""
CreatedonSatFeb1613:04:52
@author:A
爬取《流浪地球》的豆瓣影评
"""
frombs4importBeautifulSoup
importpandasaspd
fromseleniumimportwebdriver
importtime
importrequests
importurllib.parse
importre
#############未登录状态下的豆瓣影评抓取,未登录状态下可浏览20个页面
##步骤一:分析url规律,分析数据所在的网页源码,使用浏览器,打开开发者工具(Chrome浏览器快捷键为F12)
#豆瓣电影网页《流浪地球》的短评url:
#第1-20条评论所在页:/subject/26266893/comments?status=P
#第21-40条短评所在页:/subject/26266893/comments?start=20&limit=20&sort=new_score&status=P
#第41-60条短评所在页:/subject/26266893/comments?start=40&limit=20&sort=new_score&status=P
#规律:只要修改参数start,一个url存放20条短评。start以20递增
#目前豆瓣限制爬虫,登录状态下,每分钟允许发起40个请求,每个请求20条短评。
#合理限制时间的化,一个小时可采集48000条短评。
#start=0
#end_page=20#爬取50000个页面
#limit=20#每页20个短评
##步骤二:获取网页源码
#defget_html(start,limit,end_page):
#headers={
#'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36'
#}
#foriinrange(end_page):
#params={
#'start':str(start+limit*i),
#'limit':str(limit),
#'sort':'new_score',
#'status':'P'}
#base_url='/subject/26266893/comments?'
#url=base_url+urllib.parse.urlencode(params)
#try:
#response=requests.get(url,headers=headers,timeout=10)
#data=response.text
#pattern=pile(r'
(.*?)',re.S)
#ifre.findall(pattern,data)!=[]:
#withopen(r'E:\Python\data\liulangdiqiu\2.txt','a',encoding='utf-8')asfile:
#file.write(data)
#print('采集第%d页评论成功!'%(i+1))
#else:
#print('采集第%d页评论失败!超过访问页面限制!'%(i+1))
#except:
#print('采集第%d页评论失败!'%(i+1))
#time.sleep(1.5)
#returnNone
#if__name__=='__mian__':
#get_html(start,limit,end_page)
##
##########################以下为登录状态豆瓣影评的抓取
end_page=50000
##使用selenium模拟浏览器登陆
#需要下载安装chromedriver
driver=webdriver.Chrome("C:\\Users\\A\\Downloads\\chromedriver_win32_1\\chromedriver.exe")
driver.get("/passport/login")
time.sleep(3)
username_login=driver.find_elements_by_css_selector('li.account-tab-account')[0]#找到密码登录
username_login.click()
time.sleep(3)
driver.find_element_by_id("username").send_keys("你的账号")
driver.find_element_by_id("password").send_keys("你的密码")
driver.find_element_by_link_text("登录豆瓣").click()
time.sleep(3)
driver.find_element_by_link_text("电影").click()#运行至此,chrome开启一个新的子窗口,跳转到豆瓣电影
##chromewebdriver支持多窗口切换
#driver.current_window_handle#获得当前窗口句柄
#driver.window_handles#返回所以窗口的句柄到当前会话
driver.switch_to_window(driver.window_handles[1])#切换窗口函数
driver.find_element_by_id("inp-query").send_keys("流浪地球")#在搜索输入流浪地球
driver.find_element_by_class_name("inp-btn").click()
time.sleep(3)
driver.find_element_by_class_name("title-text").click()#进入流浪地球页面
time.sleep(3)
driver.find_element_by_id("comments-section").find_element_by_partial_link_text("全部").click()#进入全部评价页面
time.sleep(5)
##解析网页
##爬取评价人name、打分score、赞同人数vote、时间score_time、评价内容comment
name=[]
name_href=[]
score=[]
vote=[]
score_time=[]
comment=[]
foriinrange(end_page):
##使用beautifulsoup库进行html页面解析,当然也可以自行使用正则表达式进行提取
bs=BeautifulSoup(driver.page_source,"html.parser")
comments=bs.findAll("div",class_="comment-item")
forcincomments:
vote.append(int(c.find("span",class_="votes").get_text().strip()))#获取赞同人数,即该评论多少人觉得有用。
name.append(c.find("span",class_="comment-info").find("a").get_text())#获取评论人名字,使用get_text()提取标签的文本内容
name_href.append(c.find("div",class_="avatar").find("a").get("href"))#获取评价人的主页链接,后续可能继续爬取评价人信息
try:
score.append(c.find("span",class_=pile("allstar")).get("title"))#获取评分,评分存放在title属性中的,使用get()提取属性值
except:
score.append("")#未评分的
#此处应该注意,一颗星评价对应class值为allstar10rating,title为很差。一到五颗星的对应值如下:
#一颗星,allstar10rating,很差
#二颗星,allstar20rating,较差
#三颗星,allstar30rating,还行
#四颗星,allstar40rating,推荐
#五颗星,allstar50rating,力荐
score_time.append(c.find("span",class_="comment-time").get_text().strip())
try:
comment.append(c.find("span",class_="short").get_text())
except:
comment.append("")
print('采集第%d页评论成功'%(i+1))
try:
driver.find_element_by_class_name("next").click()
except:
break
time.sleep(2)
ifi%20==0:
time.sleep(10)#控制速度,每20页再休息一下10s
ifi==3000:
data=pd.DataFrame({"评价人":name,"评价人链接":name_href,"时间":score_time,"评分":score,"赞同人数":vote,"评价内容":comment})
data.to_excel(r"E:\Python\data\liulangdiqiu\comments.xlsx",encoding="utf-8",)
driver.quit()
##保存数据
data=pd.DataFrame({"评价人":name,"评价人链接":name_href,"时间":score_time,"评分":score,"赞同人数":vote,"评价内容":comment})
data.to_excel(r"E:\Python\data\liulangdiqiu\comments.xlsx",encoding="utf-8",)
python电影评论的情感分析流浪地球_《流浪地球》影评分析(一):使用Python爬取豆瓣影评...