時(shí)間:2023-09-05 00:00:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-09-05 00:00:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
python Django網(wǎng)頁(yè)開(kāi)發(fā)實(shí)戰(zhàn)(1):最近一直在學(xué)習(xí)Django網(wǎng)頁(yè)開(kāi)發(fā)的內(nèi)容,今天用Django簡(jiǎn)單的做一個(gè)電影頁(yè)面網(wǎng)頁(yè),初步結(jié)果見(jiàn)圖,總共分為三個(gè)步驟,數(shù)據(jù)獲?。ㄅ老x(chóng))、網(wǎng)頁(yè)界面設(shè)計(jì)(html)、網(wǎng)頁(yè)開(kāi)發(fā)(Django),下面就一步一步來(lái)詳細(xì)的講解。import requestsimport csvfrom lxml import etreeimport pymysqlimport jsonimport reclass ConnMysql(): def __init__(self): # 連接數(shù)據(jù)庫(kù) self.db = pymysql.connect(host='localhost', port=3306, database='douban',#數(shù)據(jù)庫(kù)名稱 user='root', password='******',#數(shù)據(jù)庫(kù)密碼 charset='utf8') self.cursor = self.db.cursor() self.cursor.execute("DROP TABLE IF EXISTS movie") sql = ''' create table movie ( name Char(255), cover CHAR (255), disc TEXT (2555), address char (255)); ''' self.cursor.execute(sql) print('連接成功') def insert(self,dict1): # 將數(shù)據(jù)添加到數(shù)據(jù)庫(kù)中的movie表中 sql = "insert into movie (name,cover,disc,address) values(%s,%s,%s,%s)" data = [dict1['name'],dict1['cover'],dict1['disc'],dict1['address']] try: self.cursor.execute(sql,data) self.db.commit() # 提交操作 except: self.db.rollback()
1.2 爬取數(shù)據(jù)class Douban(): def __init__(self): self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',} self.num=1000#爬取1000個(gè)數(shù)據(jù),夠我們用啦 self.url = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1&start={}' self.douban_movie() def douban_movie(self): for page in range(0,self.num,20): print('開(kāi)始第%s頁(yè)'%page) self.get_url=self.url.format(str(page)) self.r=requests.get(url=self.get_url, headers=self.headers) self.r.encoding='utf-8' self.json_text=json.loads(self.r.text) self.parse_text() def parse_text(self): for moive_list in self.json_text['data']: # print(type(moive_list)) self.moive_name=moive_list['title'] self.movie_url=moive_list['url'] self.movie_cover=moive_list['cover'] self.parse_content() self.item={ 'name':self.moive_name, 'cover':self.movie_cover, 'disc':self.disc, 'address':self.movie_url, } self.save_data() def parse_content(self): self.r_disc = requests.get(url=self.movie_url, headers=self.headers) tree = etree.HTML(self.r_disc.text) self.disc = tree.xpath('//div[@id="link-report"]/span/text()') # /H4/a/@href' self.disc=re.sub(r'[/]//n ( /,)//u3000/[/']','',str(self.disc)) def save_data(self): database.insert(self.item)if __name__ == '__main__': database = ConnMysql() movie = Douban()
1.3打開(kāi)Navicat Premium,連接數(shù)據(jù)庫(kù),可以看到在總的數(shù)據(jù)庫(kù)中有douban數(shù)據(jù)庫(kù),其下面有movie列表,打開(kāi)之后可以發(fā)現(xiàn)爬取到的數(shù)據(jù)已經(jīng)全部存入到數(shù)據(jù)庫(kù)中了。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> /*解決頁(yè)面浮動(dòng)后的塌陷問(wèn)題*/ .clearfix{ zoom:1; } .clearfix:after{ content: ''; display: block; visibility: hidden; line-height: 0; clear:both; } body,div{ margin: 0 auto; } div{ border: 1px solid gray; width: 750px; text-align:center; } ul{ list-style-type: none; display: inline-block; } #header li{ float:left; margin-left: 10px; font-size: 16px; font-family: '微軟雅黑'; color:#666666 } #header li:hover{ cursor:pointer; background: blue; color:white; } #content li{ float:left; display: inline; margin-right: 15px; text-align: center; height: 120px; width: 120px; overflow: hidden; padding-top:10px; padding-bottom: 5px; } #content h1{ font-size:14px; margin:0; } .tip{ display: block; font-size: 12px; } .h1,.tip{ width:110px; text-align: center; } #content ul{ margin:0; margin-left: 55px; padding:0; } </style></head><body> <div id="header" class="clearfix"> <ul class="'clearfix"> <li>首頁(yè)</li> <li>電影</li> <li>電視劇</li> <li>動(dòng)漫</li> <li>綜藝</li> <li>音樂(lè)</li> <li>MV</li> <li>視頻</li> <li>短片</li> <li>公開(kāi)課</li> </ul> </div> <div id="content"> <ul class="clearfix"> {% for movie in movies %} <li> <a href="{{ movie.address }}"><img src="{{ movie.cover }}" width="80px" height="80px"/></a> <h1 class="h1">{{ movie.name }}</h1> <span class="tip"> {{ movie.disc }}</span> </li> {% endfor %} </ul> </div> <div> <a href="/movie/?num={{ pre_page_num }}">上一頁(yè)</a> <a href="/movie/?num={{ next_page_num }}">下一頁(yè)</a> </div></body></html>
3、Django網(wǎng)頁(yè)開(kāi)發(fā)from django.contrib import adminfrom django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('movie/',include('movieshow.urls'))]
設(shè)置完主url之后,在app中urls中進(jìn)行子url設(shè)置,沒(méi)有這個(gè)py文件的,右鍵新建一個(gè),命名為urlsfrom django.urls import pathfrom . import viewsurlpatterns = [ path('',views.index_view),]
接著進(jìn)行數(shù)據(jù)庫(kù)映射D:/pythonstudy/django/movie>python manage.py inspectdb>movieshow/models.py
映射完成之后,可以發(fā)現(xiàn)在models中有字段的一些信息class Movie(models.Model): name = models.CharField(max_length=255, blank=True, primary_key=True) cover = models.CharField(max_length=255, blank=True, null=True) disc = models.TextField(blank=True, null=True) address = models.CharField(max_length=255, blank=True, null=True) class Meta: managed = False db_table = 'movie'
完成以上操作之后,就可以在views中進(jìn)行相關(guān)網(wǎng)頁(yè)的顯示與操作了def page(num,size=20): num=int(num) #總記錄數(shù) total=Movie.objects.count() totalpage=int(math.ceil(total*1.0/size)) #是否越界 if num<1: num=1 if num>totalpage: num=totalpage #每頁(yè)顯示記錄 movies=Movie.objects.all()[((num-1)*size):(num*size)] # print(movies) return movies,numdef index_view(request): #接收前端請(qǐng)求參數(shù) num=request.GET.get('num',1) #處理分頁(yè) movies,n=page(num) print(movies) #查詢所有數(shù)據(jù) # movies=Movie.objects.all() #上一頁(yè) pre_page_num=n-1 next_page_num=n+1 return render(request,'index01.html',{'movies':movies,'pre_page_num':pre_page_num,'next_page_num':next_page_num}) # return None
關(guān)鍵詞:實(shí)戰(zhàn)
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。