第一阶段冲刺(五)
日期:2021.05.07
作者:杨传伟
完成任务:爬取imdb网站电影首页共计6000+条电影数据并存到数据库。
爬虫源码:
1 import re 2 import time 3 import traceback 4 5 from bs4 import BeautifulSoup 6 from lxml import etree 7 import pymysql 8 import requests 9 #连接数据库 获取游标 10 def get_conn(): 11 """ 12 :return: 连接,游标 13 """ 14 # 创建连接 15 conn = pymysql.connect(host="82.157.112.34", 16 user="root", 17 password="root", 18 db="MovieRankings", 19 charset="utf8") 20 # 创建游标 21 cursor = conn.cursor() # 执行完毕返回的结果集默认以元组显示 22 if ((conn != None) & (cursor != None)): 23 print("数据库连接成功!游标创建成功!") 24 else: 25 print("数据库连接失败!") 26 return conn, cursor 27 #关闭数据库连接和游标 28 def close_conn(conn, cursor): 29 if cursor: 30 cursor.close() 31 if conn: 32 conn.close() 33 return 1 34 def get_imdb(): 35 36 # url='https://www.imdb.cn/feature-film/1-0-0-0/?page=1' 37 headers={ 38 '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' 39 } 40 dataRes=[] #最终结果集 41 temp_list=[] #暂时结果集 42 43 # print(all_li) 44 45 for i in range(200,202): 46 url_='https://www.imdb.cn/feature-film/1-0-0-0/?page='+str(i) 47 response = requests.get(url=url_, headers=headers) 48 # print(response) 49 response.encoding = 'utf-8' 50 page_text = response.text 51 # print(page_text) 52 etree_ = etree.HTML(page_text) 53 all_li = etree_.xpath('//div[@class="hot_box"]/ul/li') #获取所有li 54 #判断all_li是否为空 55 if(len(all_li)==0): 56 print("爬取结束,all_list为空!") 57 if(len(dataRes)!=0): 58 return dataRes; 59 else: 60 return ; 61 print(url_) 62 for li in all_li: 63 name=li.xpath('./a[1]/img/@alt') 64 if(len(name)==0): 65 name.append("电影名错误") 66 # print(name) 67 #存姓名 68 temp_list.append(name[0]) 69 70 score=li.xpath('./span[@class="img_score"]/@title') 71 if(len(score)==0): 72 score.append("imdb暂无评分") 73 # print(score) 74 #存分数 75 temp_list.append(score[0]) 76 # print(temp_list) 77 #存到dataRes 把temp_list置为空 78 dataRes.append(temp_list) 79 temp_list=[] 80 print(dataRes) 81 return dataRes 82 def insert_imdb(): 83 """ 84 插入imdb数据 85 :return: 86 """ 87 cursor = None 88 conn = None 89 try: 90 list_=[] 91 list = get_imdb() 92 if(type(list)!=type(list_)): 93 return ; 94 print(f"{time.asctime()}开始插入imdb数据") 95 conn, cursor = get_conn() 96 sql = "insert into movieimdb (id,name,score) values(%s,%s,%s)" 97 for item in list: 98 try: 99 print(item) 100 cursor.execute(sql, [0, item[0], item[1]]) 101 except pymysql.err.IntegrityError: 102 print("重复!跳过!") 103 conn.commit() # 提交事务 update delete insert操作 104 print(f"{time.asctime()}插入imdb数据完毕") 105 finally: 106 close_conn(conn, cursor) 107 return; 108 # def get_dblen(): 109 # conn,cursor= 110 # num_= 111 112 if __name__ == '__main__': 113 # get_imdb() 114 insert_imdb()
截图示例:
5.7 李楠
今日与团队中其他队员编写的web前端进行了结合,实现了初步的分类排序查询,但是页面的布局之间还有些问题,图片部分不知为何展示不出来,但是图片的网址并没问题,明日将尝试解决,而且现在查询展示的只有前二十条,明日将尝试实现,类似腾讯电影分类界面的下滑加载更多。
Html部分:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/> 7 <meta charset="UTF-8"> 8 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 9 <meta name="viewport" content="width=device-width, initial-scale=1"> 10 <title>树懒电影</title> 11 <link rel="stylesheet" href="../static/css/show.css"> 12 <style> 13 14 body 15 { 16 background-color:#FFFFF0; 17 } 18 19 <!--超链接样式--> 20 /* unvisited link */ 21 a:link { 22 color: red; 23 } 24 25 /* visited link */ 26 a:visited { 27 color: dodgerblue; 28 } 29 30 /* mouse over link */ 31 a:hover { 32 color: red; 33 } 34 35 /* selected link */ 36 a:active { 37 color: blue; 38 } 39 40 /*电影分类样式*/ 41 aside { 42 overflow:hidden 43 } 44 div { 45 display:inline-block; 46 margin-top:15px; 47 } 48 i { 49 font-size:14px; 50 color:#666; 51 font-style:normal; 52 } 53 span { 54 display:inline-block; 55 width:80px; 56 height:24px; 57 text-decoration:none; 58 color:#039; 59 border-radius:2px; 60 font-size:14px; 61 line-height:24px; 62 text-align:center; 63 } 64 span:hover { 65 cursor:pointer; 66 } 67 .mystyle { 68 color:#f60; 69 background-color:#f3edc2; 70 } 71 .last { 72 float:left; 73 color:#666; 74 font-size:14px; 75 margin-top:20px; 76 } 77 #yi { 78 display:inline-block; 79 } 80 #yi span { 81 margin-left:10px; 82 color:#f60; 83 background-color:#f3edc2; 84 } 85 </style> 86 </head> 87 <script src="../static/js/jquery-1.7.2.min.js"></script> 88 <body> 89 <div id="container"> 90 <div id="header"> 91 <!--电影logo 92 <div class="logo"> 93 <img src=".\img\logo.png" height="100px" width="100px" /> 94 </div> 95 --> 96 <div class="title"><h1 id="title">树懒电影</h1></div> 97 <div class="container"> 98 <form action="https://www.baidu.com/?tn=62095104_19_oem_dg" class="parent"> 99 <input type="text" class="search" placeholder="电影名称,主演"> 100 <input type="button" name="" id="" class="btn"> 101 </form> 102 </div> 103 </div> 104 105 <!--电影分类--> 106 <div id="classfiy"> 107 <aside> 108 <i>类型:</i> 109 <div> 110 <span>全部</span> 111 <span>剧情</span> 112 <span>喜剧</span> 113 <span>动作</span> 114 <span>爱情</span> 115 <span>惊悚</span> 116 <span>犯罪</span> 117 <span>悬疑</span> 118 <span>战争</span> 119 <span>科幻</span> 120 <span>动画</span> 121 <span>恐怖</span> 122 <span>家庭</span> 123 <span>传记</span> 124 <span>冒险</span> 125 <span>奇幻</span> 126 <span>武侠</span> 127 <span>历史</span> 128 </div> 129 </aside> 130 <aside> 131 <i>年份:</i> 132 <div> 133 <span>全部</span> 134 <span>2021</span> 135 <span>2020</span> 136 <span>2019</span> 137 <span>2018</span> 138 <span>2017</span> 139 <span>2016</span> 140 <span>2015</span> 141 <span>2011-2014</span> 142 <span>2006-2010</span> 143 <span>2000-2005</span> 144 <span>90年代</span> 145 <span>80年代</span> 146 </div> 147 </aside> 148 <aside> 149 <i>地区:</i> 150 <div> 151 <span>全部</span> 152 <span>内地</span> 153 <span>香港</span> 154 <span>美国</span> 155 <span>欧洲</span> 156 <span>台湾</span> 157 <span>日本</span> 158 <span>韩国</span> 159 <span>印度</span> 160 <span>泰国</span> 161 <span>英国</span> 162 <span>法国</span> 163 <span>德国</span> 164 <span>加拿大</span> 165 <span>西班牙</span> 166 <span>意大利</span> 167 <span>澳大利亚</span> 168 </div> 169 </aside> 170 <aside> 171 <i>排列顺序:</i> 172 <div> 173 <span>热门(正序)</span> 174 <span>评分(正序)</span> 175 <span>热门(倒序)</span> 176 <span>评分(倒序)</span> 177 <span></span> 178 </div> 179 </aside> 180 <div class="last">已选择: 181 <div id="yi"></div> 182 </div> 183 </div> 184 <script> 185 var oDivLength = []; 186 var div = document.getElementsByTagName('div'); 187 var divSpan = document.getElementsByTagName('span'); 188 //判断有几个列表 189 for (var i = 0; i < div.length; i++) { 190 div[i].index = i;//给所有div标序号 191 } 192 for (var i = 0; i < divSpan.length; i++) { 193 divSpan[i].onclick = function() { 194 oDivLength[this.parentElement.index] = this.innerText//标签的文本;获取对应的文本,其中下标为对应div的序号,从5开始 195 var oChild = this.parentElement.children;//获取div下的所有span标签 196 for (var j = 0; j < oChild.length; j++) { 197 oChild[j].className = '';//将classname设为“” 198 } 199 this.className = 'mystyle'; //已选中的当前列的当前元素添加样式 200 document.getElementById('yi').innerHTML = ''//标签的html文本; 201 for (var m = 0; m < oDivLength.length; m++) { //放到已选择里面 202 if (oDivLength[m] == '' || oDivLength[m] !== undefined) { 203 var para = document.createElement("span"); 204 var node = document.createTextNode(oDivLength[m]); 205 para.appendChild(node); 206 document.getElementById('yi').appendChild(para); 207 } 208 } 209 if(oDivLength[8]=="热门(正序)"){ 210 oDivLength[8]="hot_1" 211 } 212 if(oDivLength[8]=="热门(倒序)"){ 213 oDivLength[8]="hot_0" 214 } 215 if(oDivLength[8]=="评分(正序)"){ 216 oDivLength[8]="star_1" 217 } 218 if(oDivLength[8]=="热门(倒序)"){ 219 oDivLength[8]="star_0" 220 } 221 $.ajax({ 222 url: "/query_tag", 223 data: { 224 type:oDivLength[5],date:oDivLength[6],area:oDivLength[7], 225 first:oDivLength[8],num:"20" 226 }, 227 success: function (data) { 228 $(".ul_show").empty() 229 if(data.data==""){ 230 alert("暂无数据!") 231 }else{ 232 for (var i = 0; i < data.data.length; i++) { 233 appendUlBody ="<li> <p class='picture'>" 234 +"<img src="+"'"+data.data[i][8]+"'"+" height='200px' width='140px' /></p>" 235 +"<p class='instroction'>" 236 +"<a href='https://movie.douban.com/subject/1292052/' style='text-decoration:none;'>" 237 +data.data[i][0]+"</a><br><br>导演: "+data.data[i][2]+"<br>主演: "+data.data[i][1]+"<br>" 238 +data.data[i][4]+"/"+data.data[i][5]+"<br>"+data.data[i][6]+"<br>"+data.data[i][3]+"<br>"+data.data[i][7]+"</p></li>" 239 $(".ul_show").append(appendUlBody); 240 } 241 } 242 }, 243 error: function (xhr, type, errorThrown) { 244 } 245 }) 246 } 247 } 248 //点击完毕后有数据的为下标5,6,7,8 249 </script> 250 <!--电影分类模块结束--> 251 252 <div id="main"> 253 <div class="cat"></div> 254 <h1 id="medium_title">豆瓣TOP榜</h1> 255 <div class="content"> 256 <ul style="width: 100%;margin-left:300px; list-style: none" class="ul_show"> 257 </ul> 258 </div> 259 <div class="sidebar"> 260 <p class="p_right">豆瓣用户每天都在对“看过”的电影进行“很差”到“力荐”的评价,豆瓣根据每部影片看过的人数以及该影片所得的评价等综合数据,通过算法分析产生豆瓣电影 Top 250。</p> 261 <p class="ad_right"><img src=".\img\ad.png" height="150px" width="250px" /></p> 262 </div> 263 </div> 264 <!-- 265 <footer class="footer"> 266 <div class="container clearfix"> 267 <div class="left"> 268 <p> 269 违法和不良信息举报电话:4008353331-9 270 </p> 271 <p> 272 <img src="img/jubao.png" alt=""> <a href="">中国互联网举报中心</a> 电话:12377 <a href="">新出发京批字第直160029号</a> 273 </p> 274 </div> 275 </div> 276 </footer> 277 --> 278 </div> 279 </body> 280 </html>
后台部分:
1 @app.route('/query_tag') 2 def query_tag(): 3 str_s=[] 4 str_s.append(request.values.get("type")) 5 str_s.append(request.values.get("date")) 6 str_s.append(request.values.get("area")) 7 str_s.append(request.values.get("first")) 8 str_s.append(request.values.get("num")) 9 if(str_s[0]=="全部"): 10 str_s[0]="" 11 if(str_s[1]=="全部"): 12 str_s[1]="" 13 if(str_s[2]=="全部"): 14 str_s[2]="" 15 if(str_s[0]==None): 16 str_s[0]="" 17 if(str_s[1]==None): 18 str_s[1]="" 19 if(str_s[2]==None): 20 str_s[2]="" 21 if(str_s[3]==None): 22 str_s[3]="" 23 print(str_s) 24 data=[] 25 for i in sql.find_class_order(str_s): 26 data.append(i) 27 return jsonify({"data": data})
5.7 章英杰
任务进度:完成了网页分页功能(网页设计已基本完毕,之后可能会进行小幅度的更改)。
分页效果为每页显示条目10条,共分为25页。
整体项目结构:主要分为HomePage.css,toPage.js和HomePage。html三个文件
产品页面: