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

实例代码,仅参考使用:
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 = [] #每次循环把单部数据放到这个listfor 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) #输出拼接好的urlresponse = 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) #正则匹配链接找到vipif(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 dataResdef insert_iqy():cursor = Noneconn = Nonetry:count=0list = 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 + 1if (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!
*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权
评论



