入门级面向对象爬虫,给豆瓣端一碗热汤!bs4解析电影DBTop250

Python,自学爬坑。最近在研究scrapy爬虫框架,fiddler手机抓包,以及redis数据库,感觉刚刚对面向对象编程有了一定的认识就迎来了更高阶的编程知识。(泪目~~)anyway,在新的知识里消化和巩固已经学完的知识吧。另,本博所撰皆适合新手入门练习,希望大家能共同进步!

豆瓣电影top250爬虫,利用热汤(自己起的名字) ,非常容易解析,最后数据存入表格~
上码子~

import requests  # 请求库
from bs4 import BeautifulSoup  # 端一碗热汤
from fake_useragent import UserAgent  # fake请求头
import random  # 随机库
import xlwt  # 制表库


class DouBanTop250(object):

    """豆瓣电影250排行数据模型"""

    def __init__(self):
        """初始属性"""
        ua = UserAgent()  # 创建一个请求头对象
        self.ua = {
            'User-Agent': f'{ua.random}'
        }  # 随机生成一个请求头
        self.url = 'https://movie.douban.com/top250'
        self.response = ''
        self.soup = None
        self.count = 0  # 定义一个初始值为0的变量,用于制表
        self.workbook = xlwt.Workbook(encoding='utf-8')  # 建立工作簿
        self.sheet = self.workbook.add_sheet('DoubanTopMovie250')  # 写入表头
        self.create_xls()  # 调用写入表头的函数

    def create_xls(self):

        """制表函数"""
        self.sheet.write(0, 0, '电影ID')
        self.sheet.write(0, 1, '电影名称')
        self.sheet.write(0, 2, '演员表')
        self.sheet.write(0, 3, '地区年代类型')
        self.sheet.write(0, 4, '评分及人数')
        self.sheet.write(0, 5, '电影简评')
        self.sheet.write(0, 6, '电影详情页')
        self.sheet.write(0, 7, '电影海报地址')

    def get_html(self):

        """采集函数 采集网页源码"""
        response = requests.get(self.url, headers=self.ua)
        self.response = response.text
        self.parse_html()

    def parse_html(self):

        """解析函数  解析返回的网页数据"""
        print('☂')
        print('正在熬制一碗热汤...')
        self.soup = BeautifulSoup(self.response, 'lxml')
        this_page = self.soup.find('span', {'class', 'thispage'}).text  # 查找当前页的页码
        print(f'正在爬取第"{this_page}"页数据..')
        results = self.soup.find_all('div', {'class', 'item'})  # 根据热汤查找规则提取数据,得到一个列表的数据
        for result in results:  # 迭代这个列表
            movie_id = result.em.string  # 提取em标签下的文本  即为电影id
            movie_link = result.a.attrs.get('href')  # 提取电影详情页链接
            movie_img = result.div.a.img.attrs.get('src')  # 提取电影海报地址
            movie_name = result.find('div', {'class', 'hd'}).a.text.replace('\n', '').replace(' ',
                                                                                              '')  # 提取a标签下的所有文本内容,去除无用字符
            movie_chart = \
                result.p.text.replace(' ', '').replace('\xa0\xa0\xa0', '').replace('\xa0/\xa0', '').replace('\n',
                                                                                                            '').replace(
                    '...', '/').split('//')[0]  # 导演,主演,
            movie_type = \
                result.p.text.replace(' ', '').replace('\xa0\xa0\xa0', '').replace('\xa0/\xa0', '').replace('\n',
                                                                                                            '').replace(
                    '...', '/').split('//')[-1]  # 电影年代地区即及类型
            movie_ratings = result.find('div', {'class', 'star'}).text.replace('\n\n', '|').replace('\n',
                                                                                                    '')  # 电影评分及评分人数
            movie_description = result.find('span', {'class', 'inq'}).text  # 提取电影简介
            print('☃')
            print('正在写入表格..')
            print('\n')
            self.save_data(movie_name, movie_id, movie_chart, movie_type, movie_ratings, movie_description, movie_link, movie_img)  # 调用保存数据写入表函数,并传入参数
        try:
            print('正在查找下一页..')
            next_page = self.soup.find('span', {'class', 'next'}).a.attrs.get('href')  # 按照规则提取下一页标签
            self.url = 'https://movie.douban.com/top250' + next_page  # 拼接完整的地址
            self.get_html()  # 调用采集函数,重新开始循环
        except Exception as e:
            print('全部数据爬取完毕!')

    def save_data(self, movie_name, movie_id, movie_chart, movie_type, movie_ratings, movie_description, movie_link, movie_img):

        """保存数据的函数"""

        self.count += 1  # 每次使用这个变量的值都+1  以便数据能按顺序写入表格
        self.sheet.write(self.count, 0, movie_id)  #数据写入
        self.sheet.write(self.count, 1, movie_name)
        self.sheet.write(self.count, 2, movie_chart)
        self.sheet.write(self.count, 3, movie_type)
        self.sheet.write(self.count, 4, movie_ratings)
        self.sheet.write(self.count, 5, movie_description)
        self.sheet.write(self.count, 6, movie_link)
        self.sheet.write(self.count, 7, movie_img)
        self.workbook.save('DoubanTopMovie250.xls')
        print('-' * 50)

    def run(self):

        """程序启动函数"""
        print('\n')
        print('█▇▆▅▄▃▂▁')
        print('程序启动')
        self.get_html()


if __name__ == '__main__':
    #  在当前类调用
    douban = DouBanTop250()
    douban.run()

如图,不得不夸一下热汤真的是,体贴入微,连报错提示都像是小姐姐一样,如果是python,冷冰冰的给你抛出一句:“傻逼??这里错了你看不懂?!”
在这里插入图片描述

**数据保存页面 **
在这里插入图片描述

希望尽快能用scrapy搞点事情~

end()

发布了12 篇原创文章 · 获赞 22 · 访问量 3249

猜你喜欢

转载自blog.csdn.net/bosslay/article/details/89003323
今日推荐