IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python爬虫基础练习_My电影_热映榜单信息 -> 正文阅读

[Python知识库]Python爬虫基础练习_My电影_热映榜单信息

刚学 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()

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

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:30:21  更:2021-07-10 14:32:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 16:20:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码