• 动态爬取豆瓣电影中“更多”电影详情数据


    动态爬取豆瓣电影中“更多”电影详情数据

    作业需求:
    
    1.使用任意代理IP进行如下操作
    2.使用requests模块进行豆瓣电影的个人用户登录操作
    3.使用requests模块访问个人用户的电影排行榜->分类排行榜->任意分类对应的子页面
    4.爬取需求3对应页面的电影详情数据
    5.爬取3对应页面中滚动条向下拉动2000像素后加载出所有电影详情数据,存储到本地json文件中或者相应数据库中
    【备注】电影详情数据包括:海报url、电影名称、导演、编剧、主演,类型,语言,上映日期,片长,豆瓣评分
    
    建议:用Pycharm开发

     开发中经验总结:

    1、设置多个代理ip每次随机选取

    2、在测试阶段建议先把数据下载到本地,在本地取保存的数据,避免被反爬处理,,导致因访问频繁无法进行数据处理

    3、本次数据解析采用:

    soup = BeautifulSoup(content_page, 'lxml')

    4、加深了对Beautiful Soup对象类型---Tag对象的理解

    https://www.cnblogs.com/wuwenyan/p/4773427.html

    4.1 Tag
    
    Tag对象
    
        Tag就是html文件中的标签以及标签之间的内容,例如以下就是一个Tag。
    
    1 <title>The Dormouse's story</title>

    movie_detail = soup.select('.subject > #info > span')[2].select('span > a')

     注意:如果得到的是'bs4.element.Tag'类型的对象可以继续进行后续的.操作,即能进行soup对象所能进行的操作,
    所以需要确保一个对象是'bs4.element.Tag'类型后再进行后续对其的操作,例如后面将介绍的.find方法是Tag对象才拥有的。

    5、python BeautifulSoup怎么获取无标签文本? 

    -------------------------------------------------------

    --------------------

    # 下面的方法可以获取全部内容 info所在标签下的所有文本信息
    span_class = soup.select('#info')
    for index in span_class:
        print(index.text)

    自己测试用的代码:

    import os,sys
    #添加环境变量
    BASE_DIR = os.path.abspath(__file__)
    sys.path.append(BASE_DIR)
    from bs4 import BeautifulSoup
    import json
    
    #电影详情数据包括:海报url、电影名称、导演、编剧、主演,类型,语言,上映日期,片长,豆瓣评分
    
    fp2 = open('douban_detail.html', 'r', encoding='utf-8')
    #content_page = requests.get(url=movie_url, headers=settings.headers,proxies=settings.proxy).text
    soup = BeautifulSoup(fp2,'lxml')
    # https://www.cnblogs.com/wuwenyan/p/4773427.html
    img_url = soup.select('#mainpic > a > img')[0]['src']
    print('img:::',img_url)
    movie_name = soup.select('#content > h1 > span')[0].text
    # 只取中文--文件好命名
    print('电影名字:',movie_name.split(' ')[0])
    print('电影名字:',movie_name)
    movie_detail = soup.select('.subject > #info > span')
    movie_director = movie_detail[0].select('span > a')
    
    # print(movie_director)
    name_list = ''
    for director in movie_director:
        name_list += '/'+director.text
    print('导演::',name_list)
    
    screenwriter = movie_detail[1].select('span > a')
    name_list2 = ''
    for writer in screenwriter:
        name_list2 += '/' + writer.text
    print('编剧::', name_list2)
    
    name_list3 = ''
    movie_crew = movie_detail[2].select('span > a')
    for actor in movie_crew:
        name_list3 += '/' + actor.text
    print('演员::', name_list3)
    #-----------------------------------------------
    movie_type = soup.find_all('span',property="v:genre")
    name_list4 = ''
    for actor in movie_type:
        name_list4 += '/' + actor.text
    print('类型',name_list4)
    print('-----------------')
    
    
    
    # 下面的方法可以获取全部内容
    content_list = ''
    content_list += '电影名字:'+movie_name+'
    '+ '海报url:'+img_url
    span_class = soup.select('#info')
    for index in span_class:
        content = index.text
        content_list+=content
    print(content_list)
    with open('detail.json','w',encoding='utf-8')as f:
        json.dump(content_list,f)
    View Code

    github地址 点击

  • 相关阅读:
    Linux下Mysql自启动
    C++的Vector用法
    如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
    windows自带记事本导致文本文件(UTF-8编码)开头三个字符乱码问题
    C/C++字符串查找函数
    C++ string 字符串查找匹配
    CentOS6.5升级autoconf版本 Autoconf version 2.64 or higher is required
    Linux命令之远程下载命令:wget
    Linux常用命令大全
    如何使用VisualStudio2013编写和调试c语言程序
  • 原文地址:https://www.cnblogs.com/foremostxl/p/10076570.html
Copyright © 2020-2023  润新知