首页 文章 精选 留言 我的

精选列表

搜索[python],共10000篇文章
优秀的个人博客,低调大师

Python全栈 Web(定位布局、定位方式)

定位布局: 属性:position 取值: static 默认值 按照文档流布局 relative 相对定位 absolute 绝对定位 fixed 固定定位 只有元素的position属性设置为非默认属性 才算是已经定位的元素 偏移属性: top right bottom left 用来配合已经定位的元素实现位置移动 取值:px top:以元素的上边界为基准移动元素 right:以元素的右边界为基准移动元素 bottom:以元素的低边界为基准移动元素 left:以元素的上左界为基准移动元素 定位方式: 相对定位: 属性:position:relative; 元素采用相对定位时会参照它在文档中原本的位置进行偏移 绝对定位: 属性:position:absolute; 特点: 1.绝对定位的元素,会脱离文档流不占位 2.绝对定位元素会参照离他最近的已经定位的祖先元素进行偏移 3.如果没有已经定位的祖先元素 元素会参照body(浏览器窗口左上角)进行偏移 注意: 所有元素只要脱流就可以设置宽高大小 通常使用“父相子绝”的方式页面布局 限制其他元素的布局方式 浮动和绝对定位点都可以实现元素脱流,采用浮动+外边距调整元素的位置 等价于绝对定位+偏移属性 浮动更常见于外围结构标签,做网页整体布局时 使用,绝对定位更常见于内部元素的调整 浮动和相对定位可以共存 设置相对定位只是为了辅助内部子元素+的定位布局 堆叠次序的调整: 已经定位的元素堆叠在一起是的排列顺序 语法: 属性:z-index 取值:整数 数值越大越靠上 注意: 如果我们元素z-index属性值相同,后来者居上 父子元素都设置z-index 永远都是子元素在上 不受影响 z-index属性只能用在已经定位的元素上 固定定位: 可以使元素的位置固定在浏览器窗口的某个位置 不会随网页内容的滚动而滚动 语法: 属性:position 取值:fixed 配合偏移属性实现元素位置的固定 注意: 固定定位的元素永远是参照浏览器的窗口定位的 固定定位的元素都会变成块元素 显示方式: 1.决定元素以何种样式显示在网页中 属性:display 取值: none 设置元素隐藏 隐藏后不占位 block 设置元素显示 或 将元素转换为块元素 inline 转换为行内元素 inline-block 转换为行内块元素 显示效果: 属性:visibility 取值: visible 默认值 表示显示 hidden 元素隐藏 仍然在文档中占位 元素透明度: 属性:opacity 设置元素透明度 取值:0~1 0:透明 1:不透明 元素设置opacity属性 所有的内容都会实现透明效果 子元素会继承父元素的透明效果 如果父子元素都设置了opacity 子元素最终的效果是在父元素半透明的基础上 在进行半透明 子元素最终效果=父元素opacity*本身opacity 设置垂直对齐方式: 属性:vertical-align 取值:top middle bottom 可以用在行内元素上 但更常见于为行内快元素设置vertical-align 调整行内快元素左右内容与它的对齐方式 光标显示: 改变鼠标悬停在元素上时的显示外观 属性:cursor 取值: default 默认 pointer 显示为小手形状 text 显示为 I crosshair 显示为 + 列表属性: 列表本身是块级元素,自带外边距,电邮项目符号 属性: 属性:list-style-type 设置项目符号 取值: none 取消项目符号 disc 实心原点 circle 空心原点 square 实心方块 ... 设置项目符号为图片: 属性:list-style-image 取值: url(“图片路径”) 设置项目符号的位置: 属性:list-style-position 取值:inside outside 设置项目符号出现在内容框的外部还是内部 **简写属性: list-style:none; 常用来取消列表的项目符号 转换属性: 主要是用来改变元素在页面中的位置、尺寸、角度 属性:transform 取值: 转换函数 多个函数之间用空格隔开 转换原点: 转换原点实际上就是元素转换操作的基准点 属性:transform-origin 取值:x y; 表示以元素左上角为原点进行选取旋转原点的坐标 可以使用像素值、百分比、方位值 top center bottom left center right 默认以元素的中心点为原点 转换函数: 平移变换: 改变元素在网页中的位置 属性:transform 取值:translate(x, y) x表示元素在水平方向上平移的距离 y表示元素在垂直方向上平移的距离 可以填写正值或负值 其他情况: translateX(value) 指水平方向位移 translateY(value) 指垂直方向位移 translate(value) 等价于translateX 缩放变换: 改变元素在页面中的大小 属性:transform 取值:scale(value) value为无单位的素值 表示缩放比例 默认值是1 正常比例显示 value > 1 会等比放大 0 < value < 1 等比缩小 value < 0 元素会等比反转 其他情况: scaleX(v) 横向缩放 scaleY(v) 垂直缩放 旋转变换: 元素旋转一定的角度显示 属性:transform 取值:rotate(ndeg) 表示元素按照指定的角度旋转 正值:顺时针 负值:逆时针 3D变换: rotateX(ndeg)沿X轴旋转 rotateY(ndeg)沿Y轴旋转 rotateZ(ndeg)沿Z轴旋转 旋转原点会影响转换效果 元素如果涉及旋转操作 会连带坐标轴一起旋转,影响后面的位移

优秀的个人博客,低调大师

python-并发编程之多进程

一、操作系统基础: 进程的概念起源于操作系统,操作系统其它所有概念都是围绕进程来的,所以我们了解进程之前先来了解一下操作系统 操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成 两大功能: 1.将复杂的硬件操作封装成简单的接口给应用程序或者用户去使用 2.将多个进程对硬件的竞争变得有序 操作系统处理进程的发展简略: 1.串行:一个任务完整的运行完毕才运行下一个任务 2.并发:多个任务看起来是同时运行的 3.多道技术(复用-->共享) (1)空间上的复用:多个任务复用内存空间 (2)时间上的复用:多个任务复用cpu的时间 时间上的复用又分为两种: 一个任务占用时间过长会被操作系统剥夺走cpu的执行权限:比起串行执行反而降低效率 一个任务遇到IO操作也会被操作系统剥夺走cpu的执行权限:比起串行执行可以提升效率 二、进程 程序仅仅是一堆代码而已,而进程指的是程序运行的过程 (一)、进程的创建 开启进程的方式1:(直接使用Process) from multiprocessing import Process import time def task(name): print('%s is running'%name) time.sleep(3) print('%s is done'%name) #在windows系统上,开启子进程的操作必须放到 if __name__ == '__main__':中,避免递归 if __name__ == '__main__': p = Process(target=task,args=('egon',)) # Process(target=task,kwargs={'name':'egon'}) p.start()#只是向操作系统发送了一个开启子进程的信号 print('主') View Code 开启进程的方式2:(继承Process来自定义类,重写run方法) from multiprocessing import Process import time class Myprocess(Process): def __init__(self,name): super().__init__() self.name = name def run(self): print('%s is running' % self.name) time.sleep(3) print('%s is done' % self.name) if __name__ == '__main__': p = Myprocess('egon') p.start() print('主') View Code 结果都为: 主 egon is running egon is done 注:run:如果在创建Process对象的时候不指定target,那么就会默认执行Process的run方法: (二)、join方法 join阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程 from multiprocessing import Process import time def task(name,n): print('%s is running'%name) time.sleep(n) print('%s is done'%name) if __name__ == '__main__': start = time.time() p_j =[] for i in range(1,4): p = Process(target=task,args=('egon',i)) p.start() p_j.append(p) for i in p_j: i.join() print(time.time() - start) print('主') View Code 当不加join方法时,主进程先运行完毕,加了join就会等子进程运行完毕后才运行主进程,先依次调用start启动进程,再依次调用join要求主进程等待子进程的结束。 为什么要先依次调用start再调用join,而不是start完了就调用join from multiprocessing import Process import time def task(name,n): print('%s is running'%name) time.sleep(n) print('%s is done'%name) if __name__ == '__main__': p1 = Process(target=task,args=('egon',1)) p2 = Process(target=task,args=('alex',2)) start = time.time() p1.start() p1.join() p2.start() p2.join() print(time.time() - start) print('主') View Code 程序变成了串行执行,并不是并发了。 (三)进程直接的内存空间互相隔离 from multiprocessing import Process import time n=100 def task(): global n n=0 if __name__ == '__main__': p = Process(target=task) p.start() p.join() print(n)#100 View Code 主进程与子进程之间互不干扰,子进程是对主进程的拷贝。 (四)、进程对象其他相关属性或方法 进程pid(每一个进程在操作系统内都有一个唯一的id号) 使用multiprocessing内的current_process from multiprocessing import Process,current_process import time def task(): print('%s is running'%current_process().pid) time.sleep(3) print('%s is done'%current_process().pid) if __name__ == '__main__': p = Process(target=task) p.start() print('主 %s'%current_process().pid) View Code 使用os模块下的getpid方法 from multiprocessing import Process,current_process import time,os def task(): print('%s is running'%os.getpid()) time.sleep(3) print('%s is done'%os.getpid()) if __name__ == '__main__': p = Process(target=task) p.start() print('主 %s'%os.getpid()) View Code getppid()获取进程的主进程id号 from multiprocessing import Process,current_process import time,os def task(): print('%s is running 爹是:%s' %(os.getpid(),os.getppid())) time.sleep(30) print('%s is done 爹是:%s' %(os.getpid(),os.getppid())) if __name__ == '__main__': p=Process(target=task) p.start() print('主:%s 主他爹:%s' %(os.getpid(),os.getppid())) View Code from multiprocessing import Process,current_process import time,os def task(): print('%s is running'%os.getpid()) time.sleep(3) print('%s is done'%os.getpid()) if __name__ == '__main__': p = Process(target=task,name='子进程1') p.start() print(p.name)#查看进程名 # p.terminate()杀死子进程 print(p.is_alive())#查看子进程是否存活 print('主 %s'%os.getpid()) (五)、僵尸进程与孤儿进程 僵尸进程:子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。在 unix 或 linux 的系统中,当一个子进程退出后,它就会变成一个僵尸进程,如果父进程没有通过wait或者waitpid()系统调用来读取这个子进程的退出状态的话,这个子进程就会一直维持僵尸进程状态。 僵尸进程的危害:如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。 孤儿进程:如果一个子进程的父进程先于子进程结束,则该子进程将变成孤儿进程。它将由init进程收养,称为init进程的子进程。init就是孤儿院 清除僵尸进程:方法1,结束父进程(主进程),当父进程退出的时候,僵尸进程也会被清除 方法2,在处理程序中调用wait系统调用来清除僵尸进程 (六)、守护进程 守护进程本质就是一个“子进程”,该“子进程”的什么周期小于等于被守护进程的生命周期 p.daemon = True#放在start前面 from multiprocessing import Process import time def task(name): print('太监 %s活着。。。'%name) time.sleep(3) print('太监 %s死了。。。'%name) if __name__ == '__main__': p = Process(target=task,args=('lxx',)) p.daemon = True#放在start前面 p.start() print('egon 正在死...') View Code (七)、互斥锁 每个进程互相独立,相互之间没有任何关系,某个进程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。 import json import time,random from multiprocessing import Process,Lock def search(name): with open('db.json','rt',encoding='utf-8') as f: dic=json.load(f) time.sleep(1) print('%s 查看到余票为 %s' %(name,dic['count'])) def get(name): with open('db.json','rt',encoding='utf-8') as f: dic=json.load(f) if dic['count'] > 0: dic['count'] -= 1 time.sleep(random.randint(1,3)) with open('db.json','wt',encoding='utf-8') as f: json.dump(dic,f) print('%s 购票成功' %name) else: print('%s 查看到没有票了' %name) def task(name,mutex): search(name) #并发 mutex.acquire() get(name) #串行 mutex.release() # with mutex: # get(name) if __name__ == '__main__': mutex = Lock() for i in range(10): p=Process(target=task,args=('路人%s' %i,mutex)) p.start() # p.join() # join只能将进程的任务整体变成串行 View Code 焚膏油以继晷,恒兀兀以穷年。

优秀的个人博客,低调大师

Python全栈 Web(边框、盒模型、背景)

CSS常用的属性: width height color background-color font-size font-weight text-decoration vertical-align 尺寸单位和颜色: px % red rgb(255, 0, 0) reba(255, 0, 0, 0.5) #ff0000 #f00 尺寸 和 边框: 尺寸属性: width、height 用来改变元素的宽高大小 取值:px为单位的数字 或 % 快元素和行内快元素都可以设置宽高大小 行内元素不起作用,大小有内容自适应 溢出处理: 溢出属性:overflow 取值:visible(默认可见) hidden 隐藏 溢出部分不可见 scroll 显示滚动条 溢出时可用 始终显示 auto 自动当发生溢出的时 产生滚动条并可用 边框: 边框的实现: 1.简写设置 通过一个属性为4个方向设置边框 可以设置边框的宽度、样式、颜色 属性:border 取值:width style color(缺一不可) width:宽度 px style:边框样式 取值: solid:实线 dashed:虚线 dotted:点线 double:双线 color:设置边框颜色 特殊用法: 取消边框:border:none; 2.单独设置某个方向的边框 属性: border-top 上 border-right 右 border-bottom 下 border-left 左 取值:width style color(缺一不可) 3.单独定义边框的宽度、样式、颜色(了解) border-width: border-style: border-color: 4.边框实现三角标 元素的宽高尺寸为0 元素分别设置四个方向相同宽度 指定方向可以见 剩余的设置为不可见 透明(transparent) 想要设置三角标必须设置4个方向的边框 否则就是矩形 轮廓线: 围绕在元素边框周围的线 常见于表单元素 如:输入框焦点线 属性:outline 取值:width style color 一般多取消元素的默认轮廓线 outline:none 圆角边框: 设置元素的圆角 属性:border-radius 取值:px、%(参照元素尺寸) 取值情况: border-radius:20px; 一个值表示4个圆角程度都是20px 两个值表示 1和3 2和4 对角相等 三个值表示最后一个角和对角相等 四个值表示分别表示4个圆角程度 圆形:取一个值:%50; 边框阴影(盒阴影): 属性: box-shadow 取值: offset-x 水平偏移 offset-y 垂直偏移 blur 阴影的模糊度 值越大越模糊 spread 阴影的 延伸距离 color 阴影颜色 浏览器坐标系: 不管是窗口还是元素都以左上角为原点 作为x,y轴的正方向 盒模型/框模型: 一切元素皆为框 定义在文档中实际占据的尺寸 包含内容: 外边距、边框、内边距、元素尺寸 默认情况下元素最终占据的尺寸大小: 最终宽度 = 左右的外边距 + 左右边框的宽度 + 左右内边距 + 元素宽度 最终高度 = 上下的外边距 + 上下边框的高度 + 上下内边距 + 元素高度 1.外边距: 元素边框与其他元素边框之间的距离 设置元素与元素之间的距离 属性: margin 取值:px、% 取值情况: margin:10px; 一个值表示四个方向都设置外边距 两个值表示上下,左右的外边距相等 三个值表示左右相等其他不等 四个值表示分别设置上右下左的外边距 特殊用法: 1.清除元素的外边距 margin:0px; 2.设置元素在父元素中水平居中 margin:0px auto; 3.取值可以是负值 如果给负值表示位置微调 四个方向的外边距单独设置: 属性: margin-top margin-right margin-bottom margin-left 可以是一个值也可以是百分比 具有默认外边距的元素: 2.内边距: 元素的内容与元素边框的距离 属性:padding 取值:px、% 取值情况: padding:10px; 一个值表示四个方向的内边距 两个值表示上下,左右相等 三个值表示左右相等 其他不等 四个值表示分别设置四个方向的内边距 四个方向的内边距单独设置: padding-top padding-right padding-bottom padding-left 具有默认内边距的元素: ol ul 文本框 密码框 按钮 td box-sizing: 指定盒模型的计算方式 属性:box-sizing 取值: content-box 默认值 border-box: 元素的width height属性 设置包含边框 内边距和内容部分共同的尺寸 元素显示设置: 属性;display 作用;改变元素类型 取值: block 转换为块元素(可以设置隐藏显示) inline 转换为行内块元素 inline-block 转换为行内块元素 none 设置元素隐藏 背景相关的属性: 背景颜色是从边框位置开始绘制的 如果元素加内边距,也会按照背景颜色进行补充 所有的元素默认颜色都为透明 新建窗口为白色不是body的颜色 而是浏览器渲染的效果 属性: background-color 背景图片的设置: 属性;background-image 取值 url(图片地址) 图片平铺显示: 如果背景图片小于元素尺寸,会自动对图片重复平铺 属性: background-repeat 取值: repeat(默认) 水平和垂直方向平铺 no-repeat 不重复平铺 repeat-x 水平方向平铺 repeat-y 垂直方向平铺 图片尺寸: 属性:background-size 取值: px %: 采用当前元素的尺寸获取包含width height两个值 cover: 将图片等比拉伸至完全覆盖元素 超出部分裁剪掉 contain: 将图片等比拉伸至刚好被元素容纳 图片比例不变 图片的位置: 默认情况下 背景图片重从元素的左上角显示 属性: background-position 取值:x y 以像素为单位的数值没使用空格隔开 x 水平偏移距离(正负数都可以) y 垂直偏移距离(正负数都可以) x% y%: 百分比参照元素尺寸获取 0% 0%: 图片左上角显示 100% 100%: 背景图片右下角显示 50% 50%: 背景图片中间显示 使用方位值表示: x y x:left center right y:top center bottom 如果要一个方向 背景属性简写: 属性:background 取值: color url() repeat position 背景图片的大小需要单独设置

优秀的个人博客,低调大师

卷积神经网络概述及python实现

对于卷积神经网络(CNN)而言,相信很多读者并不陌生,该网络近年来在大多数领域都表现优异,尤其是在计算机视觉领域中。但是很多工作人员可能直接调用相关的深度学习工具箱搭建卷积神经网络模型,并不清楚其中具体的原理。本文将简单介绍卷积神经网络(CNN),方便读者大体上了解其基本原理及实现过程,便于后续工作中的实际应用。本文将按以下顺序展开: 了解卷积操作 了解神经网络 数据预处理 了解CNN 了解优化器 理解ImageDataGenerator 进行预测并计算准确性 demo 什么是卷积? 在数学(尤其是函数分析)中,卷积是对两个函数(f和g)的数学运算,以产生第三个函数,该函数表示一个函数的形状如何被另一个修改。(来源:维基百科) 此操作在多个领域都有应用,如概率、统计、计算机视觉、自然语言处理、图像和信号处理、工程和微分方程。该操作在数学上表示为: 卷积

优秀的个人博客,低调大师

【Python】从0开始写爬虫——豆瓣电影

1. 最近略忙。。java在搞soap,之前是用工具自动生成代码的。最近可能会写一个soap的java调用 2. 这个豆瓣电影的爬虫。扒信息的部分暂时先做到这了。扒到的信息如下 from scrapy import app import re header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } movie_url = "https://movie.douban.com/subject/27132728/?tag=%E7%83%AD%E9%97%A8&from=gaia" m_id = re.search("[0-9]+", movie_url).group() # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string# 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() # 类型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片长 m_time = info.find(attrs={"property": "v:runtime"}).string m_time = re.search("[0-9]+", m_time).group() # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(star.string[:-1]) m_votes = score_info.find(attrs={"property": "v:votes"}).string print("id", m_id, "名称", m_name, "年份 ", m_year, "导演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "类型", m_types, "片长", m_time) print("评分", m_score, "星评(从5星到1星)", m_rate, "评价总数", m_votes) 输出如下 id 27132728 名称 致命警告 El aviso 年份 2018 导演 丹尼尔·卡尔帕索罗 主演 ['奥拉·加里多', '劳尔·阿雷瓦洛', '贝伦·奎斯塔', 'Sergio Mur', 'Aitor Luna'] 上映日期 2018-03-23 类型 ['惊悚'] 片长 92 评分 6.4 星评(从5星到1星) ['14.2', '19.9', '41.1', '21.3', '3.5'] 评价总数 445 把这些狗东西封装成一个方法。并且随便找几个豆瓣电影的url试一下。在多尝试几个url之后,会报一些问题,主要是没有进行空判断, 所以稍微修改了一点 from scrapy import app import re def douban_movie(movie_url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } m_id = re.search("[0-9]+", movie_url).group() # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string # 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() # 类型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片长 m_time = info.find(attrs={"property": "v:runtime"}) m_time = re.search("[0-9]+", m_time.string).group() if m_time else 0 # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(star.string[:-1]) m_votes = score_info.find(attrs={"property": "v:votes"}) m_votes = m_votes.string if m_votes else 0 print("id", m_id, "名称", m_name, "年份 ", m_year, "导演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "类型", m_types, "片长", m_time) print("评分", m_score, "星评(从5星到1星)", m_rate, "评价总数", m_votes) douban_movie("https://movie.douban.com/subject/30236775/?from=showing") douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia") douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia") douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia") 输出如下 id 30236775 名称 旅行吧!井底之蛙 年份 2018 导演 陈设 主演 ['王雪沁', '吴凡', '周宗禹', '强光宗', '张艺文'] 上映日期 2018-08-18 类型 ['动画', '奇幻'] 片长 78 评分 None 星评(从5星到1星) [] 评价总数 0 id 26842702 名称 燃烧 버닝 年份 2018 导演 李沧东 主演 ['刘亚仁', '史蒂文·元', '全钟瑞', '金秀京', '崔承浩'] 上映日期 2018-05-16 类型 ['剧情', '悬疑'] 片长 148 评分 7.9 星评(从5星到1星) ['25.9', '48.1', '21.4', '3.2', '1.3'] 评价总数 81519 id 26973784 名称 设局 La niebla y la doncella 年份 2017 导演 安德烈斯·M·科佩尔 主演 ['基姆·古铁雷斯', '薇洛妮卡·恩切圭', '奥拉·加里多', '罗伯托·阿拉莫'] 上映日期 2017-09-08 类型 ['惊悚'] 片长 0 评分 5.2 星评(从5星到1星) ['1.2', '9.8', '42.0', '40.0', '7.1'] 评价总数 320 id 30249296 名称 我们的侣行 第二季 年份 2018 导演 张昕宇 主演 ['张昕宇', '梁红'] 上映日期 2018-06-12 类型 ['真人秀'] 片长 0 评分 8.9 星评(从5星到1星) ['59.3', '27.8', '11.1', '1.9', '0.0'] 评价总数 342 又稍微修改了一下 1. 把原方法加了一个返回值返回一个存储数据的字典 2.对数据做了一些转换,主要是把字符串转成数字 3.对电影和电视剧做了一个区分。 from scrapy import app import re import datetime def douban_movie(movie_url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } movie = {} m_id = re.search("[0-9]+", movie_url).group() movie["id"] = m_id # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") kinds = content.find(class_="episode_list") movie["type"] = 0 if kinds else 1 # 0 :电视剧,1:电影。如果有分集数,为电视剧, 否则就是电影 # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string movie["name"] = m_name; m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 movie["year"] = m_year # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string movie["directer"] = m_directer # 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() movie["date"] = datetime.datetime.strptime(m_date, '%Y-%m-%d') # 类型 categories = info.find_all(attrs={"property": "v:genre"}, limit=2) m_categories = [] for category in categories: m_categories.append(category.string) movie["categories"] = m_categories # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) movie["actors"] = m_actors # 片长 m_time = info.find(attrs={"property": "v:runtime"}) m_time = int(re.search("[0-9]+", m_time.string).group()) if m_time else 0 movie["time"] = m_time # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string if score_info.find("strong") else 0.0 movie["score"] = float(m_score) if m_score else 0.0 m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(float(star.string[:-1])) movie["stars"] = m_rate m_votes = score_info.find(attrs={"property": "v:votes"}) m_votes = int(m_votes.string) if m_votes else 0 movie["vote"] = m_votes return movie print(douban_movie("https://movie.douban.com/subject/30236775/?from=showing")) print(douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia")) print(douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia")) print(douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia")) 输出 {'id': '30236775', 'type': 1, 'name': '旅行吧!井底之蛙', 'year': '2018', 'directer': '陈设', 'date': datetime.datetime(2018, 8, 18, 0, 0), 'categories': ['动画', '奇幻'], 'actors': ['王雪沁', '吴凡', '周宗禹', '强光宗', '张艺文'], 'time': 78, 'score': 0.0, 'stars': [], 'vote': 0} {'id': '26842702', 'type': 1, 'name': '燃烧 버닝', 'year': '2018', 'directer': '李沧东', 'date': datetime.datetime(2018, 5, 16, 0, 0), 'categories': ['剧情', '悬疑'], 'actors': ['刘亚仁', '史蒂文·元', '全钟瑞', '金秀京', '崔承浩'], 'time': 148, 'score': 7.9, 'stars': [25.9, 48.1, 21.5, 3.2, 1.3], 'vote': 83194} {'id': '26973784', 'type': 1, 'name': '设局 La niebla y la doncella', 'year': '2017', 'directer': '安德烈斯·M·科佩尔', 'date': datetime.datetime(2017, 9, 8, 0, 0), 'categories': ['惊悚'], 'actors': ['基姆·古铁雷斯', '薇洛妮卡·恩切圭', '奥拉·加里多', '罗伯托·阿拉莫'], 'time': 0, 'score': 5.2, 'stars': [1.2, 9.8, 41.8, 40.2, 7.0], 'vote': 321} {'id': '30249296', 'type': 0, 'name': '我们的侣行 第二季', 'year': '2018', 'directer': '张昕宇', 'date': datetime.datetime(2018, 6, 12, 0, 0), 'categories': ['真人秀'], 'actors': ['张昕宇', '梁红'], 'time': 0, 'score': 8.9, 'stars': [59.3, 28.8, 10.2, 1.7, 0.0], 'vote': 400}

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册