python3爬虫实战之豆瓣电影250

准备工作:
1、观察要网址的结构
https://movie.douban.com/top250?start=0&filter=:?问号后面的参数,start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页…
filter顾名思义,是过滤已经看过的电影,在这里不重要,可以不管。
2、分析网页源代码
打开上面的网址,查看源代码

<ol class="grid_view">
        <li>
            <div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img alt="肖申克的救赎" src="./豆瓣电影 Top 250_files/p480747492.webp" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
                            1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                        </p>

                        
                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.6</span>
                                <span property="v:best" content="10.0"></span>
                                <span>891851人评价</span>
                        </div>

                            <p class="quote">
                                <span class="inq">希望让人自由。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>

<em class="">1</em>代表排名,<span class="title">肖申克的救赎,代表电影名,
提取信息:电影名、排名、导演、评分、评语

第一步:爬取网页

def get_html(web_url):  # 爬虫获取网页
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"}
    html = requests.get(url=web_url, headers=header).text#不加text返回的是response,加了返回的是字符串
    Soup = BeautifulSoup(html, "lxml")
    data = Soup.find("ol").find_all("li")  
    return data

第二步:提取有用的信息
这里提取信息,用的是模块BeautifulSoup

 for info in all_move:
     #    排名
     nums = re.findall(r'<em class="">\d+</em>', str(info), re.S | re.M)  
     nums = re.findall(r'\d+', str(nums), re.S | re.M)
     num = nums[0]

     #    名字
     names = info.find("span")  
     name = names.get_text()

     #    导演
     charactors = info.find("p")  
     charactor = charactors.get_text().replace(" ", "").replace("\n", "")  
     charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
         "\xf4", "").replace("\xfb", "").replace("\u2027", "")

     #    评语
     remarks = info.find_all("span", {"class": "inq"})
     if remarks:  # 这个判断是因为有的电影没有评语,你需要做判断
         remark = remarks[0].get_text().replace("\u22ef", "")
     else:
         remark = "此影片没有评价"
     print(remarks)

     # 评分
     scores = info.find_all("span", {"class": "rating_num"})  
     score = scores[0].get_text()

第三步:保存信息

f = open("F:\\Pythontest1\\douban.txt", "a")  
  
for info in all_move:  
	'''
	注意这里省略了提取信息, 
	提取信息后,写入文件 
	'''  
	f.write(num + '、')  
	f.write(name + "\n")  
	f.write(charactor + "\n")  
	f.write(remark + "\n")  
	f.write(score).f.write("\n\n")  
	  
	  
f.close()  # 记得关闭文件 

爬取的结果,如图:
这里写图片描述

最后附上代码:

from bs4 import BeautifulSoup
import pymysql
import requests
import re
import os


def get_html(web_url):  # 爬虫获取网页
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"}
    html = requests.get(url=web_url, headers=header).text#不加text返回的是response,加了返回的是字符串
    Soup = BeautifulSoup(html, "lxml")
    data = Soup.find("ol").find_all("li")  
    return data


def get_info(all_move):
    f = open("F:\\Pythontest1\\douban.txt", "a")

    for info in all_move:
        #    排名
        nums = re.findall(r'<em class="">\d+</em>', str(info), re.S | re.M)  
        nums = re.findall(r'\d+', str(nums), re.S | re.M)
        num = nums[0]

        #    名字
        names = info.find("span")  
        name = names.get_text()

        #    导演
        charactors = info.find("p")  
        charactor = charactors.get_text().replace(" ", "").replace("\n", "")  
        charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
            "\xf4", "").replace("\xfb", "").replace("\u2027", "")

        #    评语
        remarks = info.find_all("span", {"class": "inq"})
        if remarks:  # 这个判断是因为有的电影没有评语,你需要做判断
            remark = remarks[0].get_text().replace("\u22ef", "")
        else:
            remark = "此影片没有评价"
        print(remarks)

        # 评分
        scores = info.find_all("span", {"class": "rating_num"})  
        score = scores[0].get_text()


        f.write(num + '、')
        f.write(name + "\n")
        f.write(charactor + "\n")
        f.write(remark + "\n")
        f.write(score)
        f.write("\n\n")

    f.close()  # 记得关闭文件


if __name__ == "__main__":
    if os.path.exists("F:\\Pythontest1") == False:  # 两个if来判断是否文件路径存在 新建文件夹 删除文件
        os.mkdir("F:\\Pythontest1")
    if os.path.exists("F:\\Pythontest1\\douban.txt") == True:
        os.remove("F:\\Pythontest1\\douban.txt")

    page = 0  # 初始化页数,TOP一共有250部   每页25部
    while page <= 225:
        web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
        all_move = get_html(web_url)  # 返回每一页的网页
        get_info(all_move)  # 匹配对应信息存入本地
        page += 25 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值