汇总:爬虫:python采集豆瓣影评信息并进行数据分析
优采云 发布时间: 2022-12-06 07:17汇总:爬虫:python采集豆瓣影评信息并进行数据分析
前言:最近时间比较多,给同学完成了一个简单的爬虫和数据分析任务。具体需求是爬取*敏*感*词*者联盟4的豆瓣影评信息,进行简单的数据分析。这里的数据分析是指提取关键词,并根据时间进行词云分析和热度分析。分析比较简单,以后可以进一步完善。
首先,呈现数据 采集 和分析结果。
根据学生的要求,只有采集1000条数据,需要更多数据的同学可以自行修改采集的限制
下面详细介绍如何完成数据采集和数据分析的工作
首先,爬虫第一步是分析页面元素,打开网页,按F12,查看数据请求
从上到下,我们可以发现数据存在于第一个请求中
我们可以分析这个请求,点击翻页,再请求几页
我们可以知道他的翻页规则是由start和limit这两个参数控制的。start表示页数,limit表示每页的项目数。
知道了它的分页规则后,我们需要定位到我们需要的元素采集,这里我们需要采集的短评内容、发布者信息、评价指标、评价时间、审批号等。
这里我们选择etree+xpath来分析数据。下面我将介绍如何定位短评论内容。我们在浏览器上使用选择元素的功能。选择元素后,检查元素的位置
分析对应的html元素,首先找到修改元素最可靠的顶级元素,这里我们很容易发现这个元素位于id="comments"的div元素下面,一般来说,基于id的元素不会发生的变化太多了。然后,我们继续往下看,在对应元素的上层寻找更靠谱的元素,比如class。这是一个小技巧。我们可以使用浏览器的$x方法来验证我们的xpath是否正确,如下
这样我们就可以很方便的采集获取短评论数据,代码如下
def start_spider(self):
result_list = []
for i in range(0,50):
start = i
reponse = requests.get(self.target_url.format(start),headers=self.headers)
# print(reponse.text)
html = etree.HTML(str(reponse.content,'utf-8'))
# 短评列表
short_list = html.xpath('//div[@id="comments"]/div[@class="comment-item"]//span[@class="short"]/text()')
print(short_list)
times = html.xpath('//div[@class="comment-item"]//span[@class="comment-info"]/span[2]/@class')
complte_times = html.xpath('//div[@class="comment-item"]//span[@class="comment-info"]/span[3]/@title')
votes = html.xpath('//div[@class="comment-item"]//div[@class="comment"]/h3/span[@class="comment-vote"]/span[@class="votes"]/text()') # 赞同量
采集除了短评论数据,我们还需要采集发布者的一些其他信息,比如注册时间、常驻城市等。
所以我们需要根据这个链接去用户主页补资料采集
采集的原理是一样的,使用xpath分析网页数据,但是这个链接需要注意需要登录才能请求,我的爬虫中的解决方案是使用cookies,
当我们用一个账号登录的时候,随便查一个request就可以找到我们的cookie信息
直接将这个请求复制到请求头即可
代码如下
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
'Cookie': 'll="118281"; bid=1E8tHh1UO7k; __utma=30149280.787827060.1593838175.1593838175.1593838175.1; __utmc=30149280; __utmz=30149280.1593838175.1.1.utmcsr=so.com|utmccn=(referral)|utmcmd=referral|utmcct=/link; ap_v=0,6.0; _vwo_uuid_v2=DFE5584FB8092E19E1C48ACB6A8C99E62|d5d4f0c4ca4c47a6ddcacacff97040ad; __gads=ID=5490f395fcb95985:T=1593838190:S=ALNI_Mbd_y4lD5XgT1pqnwj9gyQQasX2Nw; dbcl2="218965771:ytN/j1jGo58"; ck=7U_Q; __guid=236236167.3893834060458141000.1593840219409.0322; _pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1593840220%2C%22https%3A%2F%2Faccounts.douban.com%2Faccounts%2Fpassport%2Fregister%22%5D; _pk_ses.100001.8cb4=*; push_noty_num=0; push_doumail_num=0; __utmt=1; __utmv=30149280.21896; __yadk_uid=5q5tgoXkHZk2p7qqUcXhzcqZF8yK4kpa; monitor_count=4; _pk_id.100001.8cb4=a34ccb6950d8365b.1593840220.1.1593840306.1593840220.; __utmb=30149280.9.10.1593838175'
}
# 用户链接列表
user_list = html.xpath('//div[@id="comments"]/div[@class="comment-item"]//span[@class="comment-info"]/a/@href')
for i in range(len(user_list)):
url = user_list[i]
item = {'short':self.clear_character_chinese(str(short_list[i]))}
reponse = requests.get(url,headers=self.headers)
html = etree.HTML(reponse.text)
city = html.xpath('//div[@class="user-info"]/a/text()')
join_date = html.xpath('//div[@class="user-info"]/div[@class="pl"]/text()')
if(city != None):
if(len(city) > 0):
item['city'] = self.clear_character_chinese(city[0])
else:
continue
if(join_date != None):
<p>
if(len(join_date)>1):
item['join_date'] = self.clear_character_chinese(join_date[1]).replace("加入","")
elif(len(join_date)>0):
item['join_date'] = self.clear_character_chinese(join_date[0]).replace("加入","")
else:
continue
user_name = html.xpath('//div[@class="info"]/h1/text()')</p>
爬虫的代码基本就是这些了。这里我们将其存储为excel文件。代码如下
# # 保存数据到excel文件
def saveToCsv(self,data):
print(data)
wb = Workbook()
ws = wb.active
ws.append(['短评内容','评分','赞同量','评价日期','评价时间', '用户名', '常住地址','注册时间'])
for item in data:
line = [item['short'], item['time'],item['vote'],item['complete_time'],item['detail_time'], item['userName'],item['city'],item['join_date']]
ws.append(line)
wb.save('douban.xlsx')
保存的数据显示在开头
获取数据后,我们使用wordcloud对词云进行分析,分别对所有、正、中、负数据的词云进行分析。代码如下
# 读取短评内容
def read_short_data(self,word_type):
data = []
workbook1=load_workbook('douban.xlsx')
sheet=workbook1.get_sheet_by_name("Sheet")
count = 0
for row in sheet.iter_rows():
if(count == 0):
count = 1
continue
print(row[0].value)
short = row[0].value
short_type = row[1].value
if (word_type == 1):
if (int(short_type)=40 or int(short_type)20):
continue
short = self.clean_stopwords(short)
data.append(short)
return ";".join(data)
def generWord(self,word_type):
# 查询数据
content = self.read_short_data(word_type)
msg = "全部"
if(word_type == 1):
msg = "好评"
elif(word_type == 2):
msg = "中评"
elif(word_type == 3):
msg = "差评"
self.get_image(content,"douban_{}.png".format(msg))
# 生成词云
def get_image(self,data,savePath):
text = self.trans_CN(data)
wordcloud = WordCloud(
background_color="white",
font_path = "C:\\Windows\\Fonts\\msyh.ttc"
<p>
).generate(text)
# image_produce = wordcloud.to_image()
# image_produce.show()
wordcloud.to_file(savePath)</p>
词云结果如下
分析完词云,我们接着完成时间分析,因为采集的数据太少,分析结果不是很好,代码如下
# 时间分析
def group_by(self,column):
workbook1=load_workbook('douban.xlsx')
sheet=workbook1.get_sheet_by_name("Sheet")
count = 0
item={}
for row in sheet.iter_rows():
if(count == 0):
count = 1
continue
print(row[0].value)
join_time = row[column].value
if (column == 4):
join_time_str = join_time.split(':')[0]
join_time = int(join_time_str)
if(join_time in item):
item[join_time] = item[join_time]+1
else:
item[join_time] = 1
x = []
y = []
for i in sorted (item) :
if(column == 4):
join_time = str(int(i))+'点至'+str(int(i)+1)+'点'
x.append(join_time)
else:
x.append(i)
y.append(item[i])
if(column == 4):
plt.xlabel('日期')
else:
plt.xlabel('时刻')
plt.ylabel('短评数量')
print(y)
plt.plot(x, y)
plt.xticks(x, x, rotation=30)
if(column == 4):
plt.title('短评数量随着时刻的变化关系')
else:
plt.title('短评数量随着日期的变化关系')
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
if(column == 4):
plt.savefig('group_bytime.png')
else:
plt.savefig('group_bydate.png')
这里我们只分析短评数量的变化。其实数据里面还是有很多东西可以分析的。分析结果如下
通过这两个分析结果,我们可以大致看出随着时间的推移,*敏*感*词*者联盟电影的关注人数下降了很多,可见大家是冲着第一天的热度来的,毕竟被剧透了没什么可看的。分析这时候的变化,发现大家喜欢在半夜两三点钟的时候发表评论。也许有更多的夜猫子。由于这只是一个简单的学生作业,所以我没有做过多的分析。工作。
以上就是本文的全部内容。如果需要完整的源码,可以联系站长或者访问右侧的爬虫开源项目,里面有项目的完整代码和分析结果。如果对您有帮助,不妨star一下
本文首发于
爬虫:python采集豆瓣影评信息及数据分析
汇总:推特群推之数据采集
使用Python挖掘推特数据推特数据采集推特官方提供的API可以让我们获取到需要的数据。然后,使用 Python 的 Tweepy 库与 API 交互。实时任务中可以通过Stream API获取twitter流数据,因为数据是及时获取的,常规任务中可以通过search API获取twitter历史数据,但是只能下载7天前的数据当前时间,并且有速度限制。两者都在。顺便说一句,我们也可以在 Github 或 Kaggle 上找到现有的名人或活动社交平台数据集。本项目的数据排名基本涵盖了特朗普开通推特以来(2009~)的所有推文,并持续更新,酷~ 之前推文的文本挖掘 完整代码可以查看