Python爬取爱奇艺电影的名字与信息

python教程

共 5337字,需浏览 11分钟

 ·

2021-09-04 17:26

实例代码,仅参考使用:

import timeimport tracebackimport requestsfrom lxml import etreeimport refrom bs4 import BeautifulSoupfrom lxml.html.diff import end_tagimport jsonimport pymysql#连接数据库  获取游标def get_conn():    """    :return: 连接,游标    """    # 创建连接    conn = pymysql.connect(host="82.157.112.34",                    user="root",                    password="root",                    db="MovieRankings",                    charset="utf8")    # 创建游标    cursor = conn.cursor()  # 执行完毕返回的结果集默认以元组显示    if ((conn != None) & (cursor != None)):        print("数据库连接成功!游标创建成功!")    else:        print("数据库连接失败!")    return conn, cursor#关闭数据库连接和游标def close_conn(conn, cursor):    if cursor:        cursor.close()    if conn:        conn.close()    return 1def get_iqy():    #   获取数据库总数据条数    conn, cursor = get_conn()    sql = "select count(*) from movieiqy"    cursor.execute(sql)     #   执行sql语句    conn.commit()       #   提交事务    all_num = cursor.fetchall()[0][0]       #cursor 返回值的类型是一个元祖的嵌套形式 比如( ( ) ,)    pagenum=int(all_num/48)+1               #这里是计算一个下面循环的起始值    每48个电影分一组    print(pagenum)    print("movieiqy数据库有", all_num, "条数据!")      url = "https://pcw-api.iqiyi.com/search/recommend/list?channel_id=1&data_type=1&mode=11&page_id=1&ret_num=48&session=ee4d98ebb4e8e44c8d4b14fa90615fb7"    headers = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"    }    # response=requests.get(url=url,headers=headers)    # response.encoding="utf-8"    # page_text=response.text    # print(page_text)    """    """    #    temp_list = []      #暂时存放单部的数据    dataRes = []        #每次循环把单部数据放到这个list    for i in range(pagenum+1, pagenum+100):         #循环100-1次        url = "https://pcw-api.iqiyi.com/search/recommend/list?channel_id=1&data_type=1&mode=11&page_id=1&ret_num=48&session=ee4d98ebb4e8e44c8d4b14fa90615fb7"        url_0 = "https://pcw-api.iqiyi.com/search/recommend/list?channel_id=1&data_type=1&mode=11&page_id="        url_0 = url_0 + str(i) + "&ret_num=48&session=ad1d98bb953b7e5852ff097c088d66f2"        print(url_0)        #输出拼接好的url        response = requests.get(url=url_0, headers=headers)        response.encoding = "utf-8"        page_text = response.text        #解析json对象        json_obj = json.loads(page_text)        #这里的异常捕获是因为     测试循环的次数有可能超过电影网站提供的电影数 为了防止后续爬到空的json对象报错        try:            json_list = json_obj['data']['list']        except KeyError:            return dataRes          #json为空 程序结束        for j in json_list:         #   开始循环遍历json串            # print(json_list)            name = j['name']        #找到电影名            print(name)            temp_list.append(name)            #异常捕获,防止出现电影没有评分的现象            try:                score = j['score']      #找到电影评分                print(score)                temp_list.append(score)            except KeyError:                print( "KeyError")                temp_list.append("iqy暂无评分")            #替换字符串             link = j['playUrl']             #找到电影链接            temp_list.append(link)            # 解析播放状态            state = []            pay_text = j['payMarkUrl']          #因为播放状态只有在一个图片链接里有 所以需要使用re解析出类似vip和only(独播)的字样            if (len(pay_text) == 0):            #如果没有这个图片链接 说明电影是免费播放                state="免费"            else:                find_state = re.compile("(.*?).png")                state = re.findall(find_state, pay_text)        #正则匹配链接找到vip                if(len(state)!=0):              #只有当链接不为空再执行                    # print(state)                    # 再次解析                    state = state[0][0:3]       #字符串分片                     # 这里只输出了三个字符,如果是独播,页面显示的是only,我们设置为”独播“                    if (state == "onl"):                        state = "独播"                    else:                        state = "VIP"            # print(state)            # 添加播放状态            temp_list.append(state)            dataRes.append(temp_list)            # print(temp_list)            temp_list = []         print('___________________________')    return dataRes def insert_iqy():    cursor = None    conn = None    try:        count=0        list = get_iqy()        print(f"{time.asctime()}开始插入电影数据")        conn, cursor = get_conn()        sql = "insert into movieiqy (id,name,score,path,state) values(%s,%s,%s,%s,%s)"        for item in list:            print(item)            count = count + 1            if (count % 48 == 0):                print('___________________________')            #异常捕获,防止数据库主键冲突            try:                cursor.execute(sql, [0, item[0], item[1], item[2], item[3] ])            except pymysql.err.IntegrityError:                print("重复!跳过!")         conn.commit()  # 提交事务 update delete insert操作        print(f"{time.asctime()}插入电影数据完毕")    except:        traceback.print_exc()    finally:        close_conn(conn, cursor)    return; if __name__ == '__main__':    # get_iqy()    insert_iqy()
作者:云云yyds链接:https://juejin.cn/post/7000637132427493390来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

实现效果如图:

搜索下方加老师微信

老师微信号:XTUOL1988切记备注学习Python

领取Python web开发,Python爬虫,Python数据分析,人工智能等精品学习课程。带你从零基础系统性的学好Python!

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权


浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报