Python爬虫基础练习_My电影_热映榜单信息

本文介绍了一个使用Python的requests和lxml库爬取电影网站热门电影信息的实践案例。内容包括电影名称、评分、主演、上映时间和海报链接。由于网站存在反爬机制,需手动刷新页面解决验证码问题。爬取的数据最终保存到本地txt文件中。
摘要由CSDN通过智能技术生成

刚学 requests 做个小练习

爬取内容是:某电影网站,正在热映的电影榜单

具体是:电影名称,评分,主演,上映时间,及电影海报链接(网站缩略图)

注意事项: 因为网站的反爬,多次访问后会有图形验证码,所以会爬取不到数据.
解决方法: 只需要用浏览器刷新页面,通过验证码(直接在代码中过验证的方式还没学会…)
# 导入各种用得到的库
import time
import requests
import random
from lxml import etree


class Mymovie(object):
    # 准备域名 请求头 存储列表
    def __init__(self, url):
        self.url = 'https://maoyan.com/films?offset={}'.format(url)
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }

        self.movie_info = []

    # 发送get请求获取数据
    def movie_get(self,url):
        # 随机等待1-3秒
        time.sleep(random.uniform(1, 3))
        # 发送get请求
        get_your = requests.get(url,headers=self.headers)
        # 获取请求数据并编码
        get_content = get_your.content.decode('utf-8')
        # 返回获取到的数据
        return get_content

    # 筛选数据
    def screen_html(self,html):
        # etree.HTML()可以用来解析字符串格式的HTML文档对象,,将传进去的字符串转变成_Element对象,供xpath()使用
        get_html = etree.HTML(html)
        # 准备空字典,用来存放筛选出的数据
        movie_dict = {}
        # 遍历取出需要的数据
        for li in get_html:
            # 电影名称
            movie_dict['title'] = li.xpath('//div[@class="channel-detail movie-item-title"]//a[@data-act="movies-click" ]/text()')
            # 评分 , 因为有些电影暂无评分(暂无评分以 div 标签存储),以及评分存储方式用两个 i 标签分割成两块,所以这里先把所有数据以对象取出保存
            movie_dict['score'] = li.xpath('//div[ @class="channel-detail channel-detail-orange"]')
            # 电影类型 , 电影类型,主演,上映时间 每个数据前后都有换行及空格所以只取出列表中的有效内容
            movie_dict['type'] = li.xpath('//div[@class="movie-item-hover"]// div[@class="movie-hover-title"][2]/text()')[1::2]
            movie_dict['star'] = li.xpath('//div[@class="movie-item-hover"]// div[@class="movie-hover-title"][3]/text()')[1::2]
            movie_dict['show_time'] = li.xpath('//div[@class="movie-item-hover"]// div[@class="movie-hover-title movie-hover-brief"]/text()')[1::2]
            # 电影海报的 url 地址(因为我的电脑硬盘空间较小,所以只保存了地址)
            movie_dict['src_url'] = li.xpath('//div[@class="movie-item-hover"]//img[@class="movie-hover-img"]/@src')
        # 将取出数据的字典追加到一开始准备的列表中
        self.movie_info.append(movie_dict)
        # 打印出来方便查看是否取到了数据
        print(self.movie_info)

    # 将获取的数据保存到本地
    def write_movie(self):
        # 因为是练习所以用 txt 保存一下,可以看到爬取成功就行
        with open('Mymovie.txt', 'ab') as f:
            # 一页显示有 30 部电影,以下标遍历取出,最后一页只有 5 部电影的数据,会有异常,但是不影响取数据及保存
            # 能跑能动,还要什么自行车
            for j in range(30):
                # 写入的数据都需要用 encode() 解码,拼接是为了好看一点
                # [0]是从列表中取出字典
                f.write('\n电影名称:'.encode()+self.movie_info[0]['title'][j].encode())
                # .xpath("string(.)") 是为了将暂无评分的和分割的评分一起取出
                # 为什么不在存入的时候就取出来呢?  可能是因为我菜吧,在上面取出时,只取到了一个评分,循环遍历也没有效果...
                movie_num = self.movie_info[0]['score'][j].xpath("string(.)").encode()
                f.write('\n电影评分:'.encode()+movie_num,)
                movie_type = self.movie_info[0]['type'][j].encode()
                f.write('\n电影类型:'.encode()+movie_type.strip())
                movie_star = self.movie_info[0]['star'][j].encode()
                f.write('\n主演:'.encode()+movie_star.strip())
                movie_time = self.movie_info[0]['show_time'][j].encode()
                f.write('\n上映时间:'.encode()+movie_time.strip())
                f.write('\n海报链接:'.encode()+self.movie_info[0]['src_url'][j].encode()+'\n\n'.encode())
        # 加一个 print 方便查看运行状态
        print('电影信息保存成功!')

    # 启动
    def star_movie(self):
        # 启动 get 请求,并将编码后的数据赋值给 html
        html = self.movie_get(self.url)
        # 将编码后的数据传入,进行解析
        self.screen_html(html)
        # 将取到的数据保存到本地
        self.write_movie()


if __name__ == '__main__':
    # 准备 url 缺失的数据,分析 url 第一页为空或0,第二页为 30 (一页显示了 30 部电影的信息),第三页为 60
    for i in range(3):
        url_name = i * 30
        # 创建 movie 类,并传入 url 缺失的值
        movie = Mymovie(url_name)
        # 启动函数
        movie.star_movie()

----当然这只是为了学习----

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值