爬虫项目—豆瓣影评爬取

什么是网络爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

网络爬虫_百度百科.mp4


豆瓣影评爬取

页面分析

页面链接如下:

https://movie.douban.com/subject/26634250/comments?start=0&limit=20


对于页面上的文本来说,短评指的是以下的内容


对于程序来说,直接获取界面中的内容是比较难以实现,因此可以使用HTML代码来进行提取,我们可以查看一些该页面的HTML代码


对于可以找到相应的短评代码,发现都是由<span class="short">短评内容</span>的格式来构成,可以以这个内容为准,进行相应的正则提取



URL链接分析

URL是一个网页的入口,每个网页资源都有自己对应的URL资源,对于下面的链接来说:

https://movie.douban.com/subject/26634250/comments?start=0&limit=20

  • 26634250表示该电影的ID标号,每个电影都会有自己的ID标号
  • start表示起始的短评编号
  • limit表示每页显示的短评数量
  • 每个参数之间使用&符号来进行连接
  • 由于limit大小为20,因此start必须是20的倍数

获取网页的HTML代码

def getHtml(url):
    try:
        #设置相应的请求头,伪装成浏览器访问,防止网页将程序识别为爬虫
        headers = {
            'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5'
        }
        
        #获取response对象
        response = r.get(url,headers = headers)
        
        #如果返回代码为200,则说明访问成功,返回代码
        if response.status_code == 200:
            return response.text
        else:
            print(response.status_code)
    except r.RequestException as e:
        #输出错误信息
        print(e)

对网页内容进行分析提取

    #获取网页内容
    html = getHtml(url)
    
    #分析内容,使用正则表达式
    pattern = '<span class="short">(.*?)</span>'
    
    #将所有搜索到的结果组合成一个列表
    short_list =  re.findall(pattern,html)
    
    #将内容进行组合
    result += "".join(short_list)

可以尝试使用getHtml来获取其他网页进行分析


探究练习

对下面网页进行爬取,并且找出目标网页中的所有电影标题

https://ssr1.scrape.center/


爬取多页数据

在豆瓣网页中发现,每次进行切换页面时,start的参数都会不断向上进行递增,因此可以使用一个for循环进行多次页面的爬取,完整代码如下:

import requests as r
import re
import wordcloud
import matplotlib.pyplot as plt
import jieba

move_id = "30391186"
start = 0
limit = 20
result = ""

headers = {
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5'
}


def getHtml(url):
    try:
        response = r.get(url,headers = headers)
        if response.status_code == 200:
            return response.text
        else:
            print(response.status_code)
    except r.RequestException as e:
        print(e)

for i in range(20,100,20):
    url = "https://movie.douban.com/subject/{}/comments?start={}&limit={}"\
      .format(move_id,i,limit)
    #获取网页内容
    html = getHtml(url)


    #分析内容
    pattern = '<span class="short">(.*?)</span>'
    short_list =  re.findall(pattern,html)

    #将内容进行组合
    result += "".join(short_list)


#统计词频
re_dict = {}
re_list = jieba.lcut(result)
print(re_list)
for item in re_list:
    if len(item) > 1:
        if item not in re_dict:
            re_dict[item] = 1
        else:
            re_dict[item] += 1


#进行词云分析
word = wordcloud.WordCloud(font_path = "STSONG.TTF",width = 300,height = 300)

word.fit_words(re_dict)

#显示结果
plt.imshow(word)
plt.axis("off")
plt.show()

数据内容分析

进行分词显示

由于是中文显示,需要使用JIEBA进行分词显示

#统计词频
re_dict = {}
re_list = jieba.lcut(result)
print(re_list)
for item in re_list:
    if len(item) > 1:
        if item not in re_dict:
            re_dict[item] = 1
        else:
            re_dict[item] += 1


#进行词云分析
word = wordcloud.WordCloud(font_path = "STSONG.TTF",width = 300,height = 300)

word.fit_words(re_dict)

#显示结果
plt.imshow(word)
plt.axis("off")
plt.show()

作业练习

对下面网页进行爬取,并且找出目标网页中的所有电影标题、评分、上映年限,每个电影的相关信息组合成一个字典来进行

格式如下:

{"name":电影名称,"score":分数,"year":上映年限}

https://ssr1.scrape.center/

最后修改:2024 年 06 月 01 日
如果觉得我的文章对你有用,请随意赞赏