Python爬虫-爬取豆瓣Top250电影信息

🎈 博主:一只程序猿子

🎈 博客主页:一只程序猿子 博客主页

🎈 个人介绍:爱好(bushi)编程!

🎈 创作不易:喜欢的话麻烦您点个👍和

🎈 欢迎访问我的主页(点我直达)

🎈 除此之外您还可以通过个人名片联系我

额滴名片儿

目录

1.介绍

2.网页分析

(1)获取电影列表

(2)获取电影信息

3.源码

4.效果展示

5.结语


1.介绍

        本文将详细介绍如何编写Python爬虫爬取豆瓣电影排行榜Top250榜单电影信息

        首先,感谢各位童鞋们的点赞关注收藏!!!

        其次,如果在编写代码的过程中,如果有任何疑问,可以在评论区留言、私信或名片联系我!!!

2.网页分析

(1)获取电影列表

         这里我们需要获取电影的名称和对应的URL地址:

        每一个li标签下都存放着一个电影,可见一页共有25个电影,一共有10个页面。我们需要把10个页面的电影名称和电影URL获取出来。

        每一页的url变化:

        可以看到只需要修改参数start=?即可实现换页!

(2)获取电影信息

        第一步我们获取到了电影名称和电影URL,通过电影URL可以进入到电影的详情页面:

        红色框标记出了我们需要获取的信息,我们将在代码中使用BeautifulSoup来匹配出对应的内容!当然,你也可以选择使用xpath或者正则表达式匹配数据!

3.源码

import random
import time

import requests

from bs4 import BeautifulSoup

class DouBan_top250(object):
    def __init__(self):
        self.cookies = {
               '''换成你自己的cookies'''
        }

        self.headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*'
                      '/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'Cache-Control': 'max-age=0',
            'Connection': 'keep-alive',
            'Sec-Fetch-Dest': 'document',
            'Sec-Fetch-Mode': 'navigate',
            'Sec-Fetch-Site': 'none',
            'Sec-Fetch-User': '?1',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                          ' Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
            'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"',
        }


    def get_movie_list(self, start):
        params = {
            'start': str(start),
            'filter': '',
        }
        html_content = requests.get('https://movie.douban.com/top250', params=params, cookies=self.cookies,
                                    headers=self.headers).text
        soup = BeautifulSoup(html_content, 'html.parser')
        ol_tag = soup.find('ol', {'class': 'grid_view'})
        li_tags = ol_tag.find_all('div', {'class': 'info'})
        titles =[]
        urls = []
        for li_tag in li_tags:
            title = li_tag.find('span', {'class': 'title'}).get_text()
            url = li_tag.find('a').get('href')
            titles.append(title)
            urls.append(url)

        return titles, urls


    def get_movie_info(self, url):
        resp = requests.get(url, headers=self.headers, cookies=self.cookies)
        if resp.status_code == 200:
            soup = BeautifulSoup(resp.text, 'html.parser')
            info = soup.find('div', {'id': 'info'})
            # 封面图片的URL
            img_url = soup.find('a', {'class': 'nbgnbg'}).find('img').get('src')
            # 导演
            director = info.find_all('span', {'class': 'attrs'})[0].get_text()
            # 编剧
            scriptwriter = info.find_all('span', {'class': 'attrs'})[1].get_text().split(' /')
            # 主演
            actors = info.find_all('span', {'class': 'attrs'})[2].get_text().split(' /')

            # 类型
            type_tags = info.find_all('span', {'property': 'v:genre'})
            types = []
            for type_tag in type_tags:
                types.append(type_tag.get_text())
            # 制片国家/地区
            country = info.find_all('span', {'class': 'pl'})[4].next_sibling.strip().split(' / ')
            # 语言
            language = info.find_all('span', {'class': 'pl'})[5].next_sibling.strip().split(' / ')
            try:
                # 简介
                intro = soup.find('div', {'class': 'indent', 'id': 'link-report-intra'})\
                    .find('span', {'class': 'all hidden'}).get_text()\
                    .replace(' ', '').replace('\u3000', '  ').replace('\n\n', '\n').strip('\n')
            except AttributeError as e:
                # 简介
                intro = soup.find('div', {'class': 'indent', 'id': 'link-report-intra'})\
                    .find('span').get_text()\
                    .replace(' ', '').replace('\u3000', '  ').replace('\n\n', '\n').strip('\n')

            rating = soup.find('strong', {'class': 'll rating_num'}).get_text()
            rating_people = soup.find('span', {'property': 'v:votes'}).get_text()

            # print(director, scriptwriter, actors, types, country, language, intro, rating, rating_people, img_url)

            movie_info = [director, scriptwriter, actors, types, country, language, intro, rating, rating_people, img_url]

        else:
            print(f'数据请求失败。。。状态码:{resp.status_code}')
            movie_info = ['', '', '', '', '', '', '', '', '', '']

        return movie_info


    def main(self):
        start = 0
        while start <= 25:
            titles, urls = self.get_movie_list(start)
            time.sleep(1)
            for title, url in zip(titles, urls):
                print(title, url)
                movie_info = self.get_movie_info(url)
                movie_info.insert(0, title)
                print(movie_info)
                time.sleep(random.randint(2, 5))
            start += 25
            time.sleep(random.randint(2, 5))


if __name__ == '__main__':
    douban = DouBan_top250()
    douban.main()

        这是一个完整的源码, 你拿到后只要不缺少相关的模块库,添加上你自己浏览器访问豆瓣网的cookies就可正常运行!!

        因为时间关系,这次我在代码中添加的注释很少,后续有时间我再优化一下这一部分!争取添加更多的注释帮助你理解代码!!

4.效果展示

列表中的数据分别对应的是:【电影名称、导演、编剧、主演、电影类型、制片国家、 语言、电影简介、评分、评分人数、封面URL】 

5.结语

        本篇文章中,我仅实现了获取到豆瓣网电影排行榜Top250的电影信息,但是我还没有实现把获取到的信息保存到表格中或保存到数据库,把电影封面图片下载到本地,后续的文章中我将把这些功能实现!

        如果你对本文感兴趣且想要把数据持久化存储,可以留意我后续发布的文章!

 

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,可以的。Scrapy是一个强大的Python爬虫框架,我们可以用它来爬取豆瓣电影TOP250信息。首先,我们需要安装Scrapy,可以使用pip命令进行安装: ``` pip install scrapy ``` 然后,我们可以创建一个Scrapy项目,命名为douban_top250,执行如下命令: ``` scrapy startproject douban_top250 ``` 接下来,我们需要创建一个Spider,用于爬取豆瓣电影TOP250信息。在douban_top250/spiders目录下,新建一个douban_spider.py文件,编写如下代码: ```python import scrapy class DoubanSpider(scrapy.Spider): name = 'douban' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): for movie in response.xpath('//div[@class="info"]'): yield { 'title': movie.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract_first(), 'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(), 'quote': movie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract_first() } next_page = response.xpath('//span[@class="next"]/a/@href') if next_page: url = response.urljoin(next_page[0].extract()) yield scrapy.Request(url, self.parse) ``` 上述代码中,我们定义了一个名为DoubanSpider的Spider,它的allowed_domains为豆瓣电影网站,start_urls为https://movie.douban.com/top250,表示我们要爬取豆瓣电影TOP250的页面。在parse方法中,我们使用XPath表达式提取每部电影的标题、评分和简介信息,并使用yield返回。然后,我们使用XPath表达式找到下一页的链接,并使用scrapy.Request发送请求,继续爬取下一页的信息。 最后,我们可以在命令行中执行如下命令,启动Spider爬虫程序: ``` scrapy crawl douban -o douban_top250.json ``` 这条命令表示运行名为douban的Spider,将结果保存到douban_top250.json文件中。爬取完成后,我们可以打开douban_top250.json文件,查看爬取到的电影信息

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只程序猿子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值