汇总:爬虫: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[&#39;join_date&#39;] = self.clear_character_chinese(join_date[1]).replace("加入","")

elif(len(join_date)>0):

item[&#39;join_date&#39;] = self.clear_character_chinese(join_date[0]).replace("加入","")

else:

continue

user_name = html.xpath(&#39;//div[@class="info"]/h1/text()&#39;)</p>

  爬虫的代码基本就是这些了。这里我们将其存储为excel文件。代码如下

  # # 保存数据到excel文件

def saveToCsv(self,data):

print(data)

wb = Workbook()

ws = wb.active

ws.append([&#39;短评内容&#39;,&#39;评分&#39;,&#39;赞同量&#39;,&#39;评价日期&#39;,&#39;评价时间&#39;, &#39;用户名&#39;, &#39;常住地址&#39;,&#39;注册时间&#39;])

for item in data:

line = [item[&#39;short&#39;], item[&#39;time&#39;],item[&#39;vote&#39;],item[&#39;complete_time&#39;],item[&#39;detail_time&#39;], item[&#39;userName&#39;],item[&#39;city&#39;],item[&#39;join_date&#39;]]

ws.append(line)

wb.save(&#39;douban.xlsx&#39;)

  保存的数据显示在开头

  获取数据后,我们使用wordcloud对词云进行分析,分别对所有、正、中、负数据的词云进行分析。代码如下

  # 读取短评内容

def read_short_data(self,word_type):

data = []

workbook1=load_workbook(&#39;douban.xlsx&#39;)

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(&#39;douban.xlsx&#39;)

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(&#39;:&#39;)[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))+&#39;点至&#39;+str(int(i)+1)+&#39;点&#39;

x.append(join_time)

else:

x.append(i)

y.append(item[i])

if(column == 4):

plt.xlabel(&#39;日期&#39;)

else:

plt.xlabel(&#39;时刻&#39;)

plt.ylabel(&#39;短评数量&#39;)

print(y)

plt.plot(x, y)

plt.xticks(x, x, rotation=30)

if(column == 4):

plt.title(&#39;短评数量随着时刻的变化关系&#39;)

else:

plt.title(&#39;短评数量随着日期的变化关系&#39;)

plt.rcParams[&#39;font.sans-serif&#39;] = &#39;SimHei&#39;

plt.rcParams[&#39;axes.unicode_minus&#39;] = False

if(column == 4):

plt.savefig(&#39;group_bytime.png&#39;)

else:

plt.savefig(&#39;group_bydate.png&#39;)

  这里我们只分析短评数量的变化。其实数据里面还是有很多东西可以分析的。分析结果如下

  通过这两个分析结果,我们可以大致看出随着时间的推移,*敏*感*词*者联盟电影的关注人数下降了很多,可见大家是冲着第一天的热度来的,毕竟被剧透了没什么可看的。分析这时候的变化,发现大家喜欢在半夜两三点钟的时候发表评论。也许有更多的夜猫子。由于这只是一个简单的学生作业,所以我没有做过多的分析。工作。

  以上就是本文的全部内容。如果需要完整的源码,可以联系站长或者访问右侧的爬虫开源项目,里面有项目的完整代码和分析结果。如果对您有帮助,不妨star一下

  本文首发于

  爬虫:python采集豆瓣影评信息及数据分析

  汇总:推特群推之数据采集

  

  使用Python挖掘推特数据推特数据采集推特官方提供的API可以让我们获取到需要的数据。然后,使用 Python 的 Tweepy 库与 API 交互。实时任务中可以通过Stream API获取twitter流数据,因为数据是及时获取的,常规任务中可以通过search API获取twitter历史数据,但是只能下载7天前的数据当前时间,并且有速度限制。两者都在。顺便说一句,我们也可以在 Github 或 Kaggle 上找到现有的名人或活动社交平台数据集。本项目的数据排名基本涵盖了特朗普开通推特以来(2009~)的所有推文,并持续更新,酷~ 之前推文的文本挖掘 完整代码可以查看

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线