Python爬虫实战,requests+re模块,Python实现爬取豆瓣电影《外太空的莫扎特》 前言 开发工具 环境搭建 思路分析 前期准备 效果展示

前言

今天为大家带来利用Python爬虫抓取豆瓣电影《外太空的莫扎特》影评,废话不多说。

Let's start happily

开发工具

Python版本: 3.6.4

相关模块:

requests模块

json模块

re模块

os模块

bs4模块

pandas模块

time模块

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

思路分析

本文以爬取豆瓣电影《外太空的莫扎特》影评,讲解如何爬取豆瓣电影《外太空的莫扎特》影评!

前期准备

1.获取页面内容

def get_html(url):
    """获取网页全部数据"""

    headers = Agent_info()
    try:
        r = requests.get(url=url, headers=headers, timeout=30)
        r.encoding = r.apparent_encoding
        status = r.status_code  

        datas = json.loads(r.text)["html"]
        str_html = "<html>{}</html>".format(datas)
        html = BeautifulSoup(str_html, "html.parser")

        print("爬虫状态码: " + str(status))
        # print(type(html))
        return html
    except Exception as e:
        print("很遗憾,数据爬取失败!")
        print(e)

2.提取数据

  • 浏览器中打开我们要爬取的页面
  • 按F12进入开发者工具,查看我们想要的数据在哪里
  • 这里我们需要时间, 用户, 星级, 短评, 支持数
def etl_data(html):
    """提取数据"""

    comments = html.find_all('div', 'comment-item')
    # print(comments[0])

    # 获取电影的评论并保存到列表(时间,用户,星级,短评,支持数)
    datas = []

    for span in comments:
        # 短评发表的时间
        times = span.find('span', 'comment-time').attrs['title']
        # 用户名
        name = span.find('a').attrs["title"]
        # 用户评分星级
        try:
            level = span.find('span', 'rating').attrs['class'][0][-2:]
            if (level == '10'):
                level = "一星"
            elif (level == '20'):
                level = "二星"
            elif (level == '30'):
                level = "三星"
            elif (level == '40'):
                level = "四星"
            elif (level == '50'):
                level = "五星"
        except Exception as e:
            level = "无评价"

        content = span.find('span', 'short').string.strip()
        content = re.sub(r'\n', '', content)

        # 短评支持数
        love_point = span.find('span', 'vote-count').string.strip()

        arr = [times, name, level, content, love_point]
        datas.append(arr)

        df = pd.DataFrame(datas)
        df.columns = ["时间", "用户", "星级", "短评", "支持数"]

        # print(arr)
    return df

3.获取下一个页面url

def get_nextUrl(html):
    """抓取下一个页面的 url"""

    try:
        # 找到下一页的 url
        url = html.find('a', 'next').attrs['href']
        # print(url)
        next_start = re.search(r'[0-9]\d{0,5}', url).group(0)
        print("已经到 " + str(next_start) + " ,稍等一会儿\n")

        next_url = "https://movie.douban.com/subject/35168646/comments?percent_type=" \
                   "&start={}&limit=20&status=P&sort=new_score&comments_only=1&ck=Cuyu".format(next_start)
        # print(next_url)

        return next_url
    except:
        print("到底了~")

运行结果

4.持久化存储数据代码实现

def save_data(data, fileName, Flag):
    """持久化存储数据"""

    file_name = fileName + "_" + time.strftime("%Y_%m_%d", time.localtime(time.time())) + ".csv"
    # print(file_name)

    data.to_csv(file_name, index=False, header=Flag, mode='a', encoding="utf_8_sig")

    if os.path.exists(file_name):
        print(file_name + " 数据爬取并保存成功!")
    else:
        print('数据保存失败,请再次尝试!')

#代码测试2022.7.28无异常,点赞超过100,更新豆瓣读书Top250

效果展示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章