python 爬虫之获取标题和链接

今天我想分享一些关于SEO优化的基础知识,这些知识几乎每位SEO专业人员都会明白。一种SEO策略是在其他论坛上发布文章,首先发布一些具有技术性的文章,然后再发布自己网站的链接。最近,我在oschina论坛上发布了一些文章,但今天我没有太多新的内容要发布,所以我决定分享一段小代码,用于爬取我的oschina论坛内的链接和标题。这个过程非常简单,非常容易。

下面是Python代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from requests_html import HTMLSession

session = HTMLSession()
url = "https://my.oschina.net/u/4798232"
r = session.get(url)

for i in range(1, 12):
i = str(i)
url_xpath = '//div[@id="newestBlogList"]/div[1]/div[' + i + ']/div/a'
title = r.html.xpath(url_xpath, first=True).text
link_xpath = url_xpath + '/@href'
link = r.html.xpath(link_xpath, first=True)
a = "原"
if a not in title:
print(title)
print(link)
else:
print(title.replace(a, ""))
print(link)

这段代码使用XPath来操作,具体如何复制XPath可以参考您提供的文章中的动图示例。然后,我们导入所需的库并定义了要访问的URL。在循环中,我们通过XPath来获取链接和标题。

不过,注意到一开始有些文章的XPath中多了一个[1],解决这个问题时的方法是尝试不加[1],看看是否仍然可以获取文章的内容。此外,注意获取标题时需要使用.text属性来获取文字,但获取链接时不需要。

还可以进一步将标题和链接保存到JSON文件中,或使用openwrite来将它们写入文本文件中,然后可以在需要时读取它们。这将获取文章的所有链接,并通过查询文章内容的XPath来获取所有文章内容。

如果有任何问题或需要进一步的指导,请随时在评论区提问,我将尽力回答。

网站媒体查询@media详解

通过使用 @media 查询,可以针对不同的媒体类型来定义不同的样式。@media 可以根据不同的屏幕尺寸来设置不同的样式,特别是如果需要创建响应式的网页,@media 非常有用。当浏览器窗口大小改变时,页面会根据浏览器的宽度和高度进行重新渲染。

用法非常简单,例如:

1
2
3
4
5
@media screen and (max-width:1000px) {
.topbox .logo {
display: none;
}
}

类似于上面的小例子,在CSS中设置了一个媒体查询,它会检查浏览器的宽度是否小于1000px,如果是,则执行查询块中的样式,从而实现不同屏幕大小下的不同页面显示。

然而,这种方法通常更适合小型网站。对于大型网站,通常会开发更复杂的自适应方法,例如淘宝和京东等,它们为了提供极致的用户体验会实施更高级的适配策略。

另一种简单的方法是在HTML中使用不同的CSS文件,根据不同的页面宽度引入不同的CSS文件,如下所示:

1
2
<link rel="stylesheet" media="screen and (max-width:1400px)" href="./css/public2.css">
<link rel="stylesheet" media="screen and (max-width:1000px)" href="./css/public3.css">

这样,不同的页面宽度将加载不同的CSS文件,实现了自适应效果。

如果需要更多关于 @media 查询的信息,推荐阅读菜鸟教程中关于CSS @media 查询的教程。如果有任何疑问,请随时在评论区提出,我会尽快回答。

网站索引量暴跌

目前是23号,我的百度站长索引量内容只到16号,并没有更新后面的数据,不知道是因为问题还没有修复,还是因为什么,不过当时18号的时候,百度就发公告了:

您好,近日搜索资源平台【索引量】工具,由于工具计算系统不稳定导致数据异常,当前问题已紧急修复,索引量数据重新上线,详情请参考 请点击

出现了,它出现了,百度居然把索引量调回了15号的,非常神奇,吓我一跳,我就觉得我 API 提交 3000 份没啥问题,哈哈。

网站的索引量恢复到了15号的数据

今天在打开百度站长工具的时候,看到了我可怜巴巴的索引量直接变成 0 了,我就觉得今天是一个不寻常的日子。虽然我觉得问题大概是我在昨天出现了一波操作失误,主动提交数直接涨到了 3000,今天一看的时候把我吓到了。但是我后来看百度的站长论坛里,发现许许多多的网站的索引量都变少了,人家是几万几万的减,几百万的索引量都减半了,而我这才 3 条索引量,只是毛毛雨罢了。

网页的索引量暴跌

网页的索引量暴跌

网页的索引量暴跌

网页的索引量暴跌

我目前看到的,大多数的网站都降了,而且大多数是一半一半的掉,我这个一下全掉就有点奇怪了,哈哈。不过其实只要保证网站的质量,发布优质内容还是可以的。

引用一个大哥的话:

刚才看到跌了100多万,心里暗暗叫到“不好~~~~~~~~~~”正准备删库走人的时候,看到了楼主的贴子,心里顿时豁然了,楼主的贴子好比一盏明灯!今天不用走人了,还可以多领一天鸡腿~~~~~~~~~

本来可能要有一大堆的人今天要删库跑路了,没想到发现大家都这样,而且我的掉的还算少的,那么要加鸡腿喽!

安装Docker Desktop报错WSL 2 installation is incomplete

以下是您提供的内容的格式化版本:


在看《python3网络爬虫开发实战》的时候,安装开发环境时,遇到了一个小问题,但是呢百度上面的回答大多不怎么样,不过没想到自己随便一试就把解决办法试出来了。

安装 Docker Desktop 时,出现了以下报错:

WSL 2 installation is incomplete

具体原因是因为 Windows 系统下的 Linux 内核的版本有点低,我们只需要前往更新地址,下载对应的 Linux 内核更新包,然后更新一下即可!

更新地址https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-kernel

根据网页提示进行更新即可。

python 爬虫入门之requests-html

其实本来应该早一点发的,但是我用织梦后台编辑文章的时候,不小心点了网页的x号,于是乎,内容白写了,然后我又开始重新写了。

requests库,是一个第三方的Python库,用来模拟发送HTTP请求。它通常用于爬虫或接口的测试。与urllib等其他的系统库相比,虽然他们的功能相似,但是requests相对来说更简单、方便和高效。

首先我们先把这个requests-html安装一下,进入运行框然后输入 pip3 install requests-html 即可安装成功,在之后我们把该库导入即可:

1
import requests_html

接下来准备了一个小例子给大家,本来其实每句话都有分析的,但是由于是第二遍写,就不那么麻烦了:

1
2
3
4
5
6
7
import requests_html

# 导入requests-html库
session = requests_html.HTMLSession() # 创建一个session的变量,用来取代requests_html.HTMLSession()要不之后字太多而纸样只需要操作session
res = session.get("https://www.datehoer.com/") # get一下网址,这里我们用博客主页做演示
res.encoding = "utf-8" # 获取的编码格式
print(res.text) # 输出获取的内容

最简单的一种方法。 之后我们来介绍一下其他的方法,也就是requests-html的进阶。

获取链接:

1
print(res.html.absolute_links)

这个就是获取链接的方式,绝对路径,这样就会直接获取完整的链接’https://www.datehoer.com/wdsj/'而如果直接获取链接呢?

1
print(res.html.links)

‘/wdsj/2020/1111/42.html’ 则会出现上面这样不完整的链接,各有各的用处吧,不过大多数还是要加一下绝对路径的链接的。

XPATH

这个的抓取我们看一下动图 requests-html

获取的内容为 /html/body/article 这个:

1
print(res.html.xpath("/html/body/article", first=True).text)

这个就是把该 xpath 代表的内容输出出来的代码。 而 xpath 有 4 个参数:

  • selector,要用的 XPATH 选择器;
  • clean,布尔值,如果为真会忽略HTML中 style 和 script 标签造成的影响(原文是 sanitize,大概这么理解);
  • first,布尔值,如果为真会返回第一个元素,否则会返回满足条件的元素列表;
  • _encoding,编码格式。

然后我们还有 html+css 获取的方法

还是以博客的主页为例,我们要获取头部标签内的内容,而我们 div 里有一个 class 为 header 的标签,我们就获取它的内容吧。

1
2
hc = res.html.find("div.header", first=True)
print(hc.text)

只要写出该内容的标签传递关系即可获取内容:

1
主页 技术分享 日常学习 法制专栏 我的世界 关于我 检索标题 智能模糊 搜索

这就是具体的获取内容了,相应的,具体你需要什么内容需要通过属性来进行判断。

1
print(hc.search("主{}")[0])

比如说这个,这个就是查询内容了,搜索之前获取的 div.header 里有没有以主为开头的内容,然后返回获取的值。再比如说还有许多的方法,就不一一在此列出了,其余的我们且听下回分晓!

php 表单提交

首先,本地演示需要开启本地服务器,你可以使用 phpstudyapache 或其他类似工具。然后,需要修改主机文件(host)以便无需输入 “localhost” 即可访问本地网站。

下面解释一下本地演示的流程:

php提交过程

PHP 提交过程

  1. 在 HTML 页面中创建一个 <form> 元素,并设置 action 属性为你的 PHP 文件名。同时,选择使用 POSTGET 方法都可以,根据你的需求而定。

  2. <form> 元素内部,创建需要提交的表单字段,使用 <input> 标签。每个 <input> 标签需要设置 name 属性,这个属性用于标识表单字段。

下面是一个示例的 HTML 代码:

1
2
3
4
<form action="444.php" method="post">
<input type="text" name="nl">
<input type="submit" value="提交">
</form>
  1. 在你的 PHP 文件中,使用 $_POST(或 $_GET,根据表单方法选择)来接收表单提交的数据。使用 $_POST 时,通过指定 name 属性来获取相应的数据。

下面是一个简单的 PHP 代码示例,它判断用户输入的年龄是否大于 18 岁:

1
2
3
4
5
6
<?php
$age = $_POST["nl"];
if ($age > 18) {
echo "你要对自己的行为负责";
}
?>

这个例子中,"nl"<input> 标签的 name 属性,用于确认接收的数据是用户输入的年龄。

区分 $_GET$_POST

  • $_GET 变量包含了通过 HTTP GET 方法发送的参数,这些参数以名称(name)和值(value)的形式组成数组。GET 方法的信息在浏览器的地址栏中可见,但有长度限制(通常不超过 100 个字符)。

  • $_POST 变量包含了通过 HTTP POST 方法发送的参数,同样以名称和值的形式组成数组。POST 方法的信息不可见,而且没有信息长度限制。

需要注意的是,GET 相对不太安全,因为信息在 URL 中可见,而 POST 更安全,因为信息不可见。根据需求,选择适合的方法。

此外,GET 只生成一个 TCP 数据包,而 POST 会生成两个 TCP 数据包。在稳定的传输情况下,GET 通常更快,因为它一次性发送数据。POST 则需要先发送一个请求,类似于提前告知对方要传输的数据,然后再实际传输数据。

具体的使用应根据你的需求和客户需求来选择。虽然 GET 和 POST 的作用类似,但在内部实现上有很大的不同,不能随意混用。

希望这些解释能帮助你理解本地演示和表单提交的流程!如果有任何问题或需要进一步的帮助,请随时提问。

python 外星人入侵 完整版

差不多用了三天的空闲时间,把这个案例看完了一遍,并且实际操作了一下,其实难度确实不高,很适合我们这样的新人去操作。不过其实遇到了许多的问题,但大多都是我的问题,做的我是心态崩了。

今天最后做play按钮的时候,怎么也不出效果,把 game_active 改为 False 就显示黑屏,而换成 True 显示内容但是没啥卵用,因为不是静态的。当时是真的不想做了,因为确实没有啥错误,出去吃了个饭,再仔细一看发现我是真的蠢!

1
2
3
4
5
6
7
8
9
while True:
# 监视鼠标和键盘事件
gf.check_events(ai_settings, screen, stats, board, play_button, ship, aliens, bullets)
if stats.game_active:
ship.update()
bullets.update()
gf.update_bullets(ai_settings, screen, stats, board, ship, aliens, bullets)
gf.update_aliens(ai_settings, screen, stats, board, ship, aliens, bullets)
gf.update_screen(ai_settings, screen, stats, board, ship, aliens, bullets, play_button)

这一段,最后的 gf.update_screen 应该在 if 外,因为它是做出那个静态效果的,但是我当时把它放到了 if 里,所以改成 False 时,显示黑屏,我当时真的找了半天,因为他这个如果你没改 False 的话是没有任何问题出现的,最后随便一看,发现了这个错误,把我气的。

还有一些非常蠢的错误,基本上全是自己的失误吧,哎,说多了都是泪。

其实很重要的一个模块就是 pygame.sprite,毕竟你要修改游戏要进行交互等等吧,很重要。

不得不说,细节决定成败,这句话非常有道理!

我就把外星人、计分板和按钮的 Python 文件发一下源代码,其余的还是改成附件上传吧,毕竟有点小多。

计分板的 scoreboard.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import pygame.font
from pygame.sprite import Group
from ship import Ship

class Scoreboard():
"""显示得分信息的类"""

def __init__(self, ai_settings, screen, stats):
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
self.text_color = (50, 50, 50)
self.font = pygame.font.SysFont(None, 48)

# 初始化得分图像
self.prep_score()
self.prep_high_score()
self.prep_level()
self.prep_ships()

def prep_ships(self):
self.ships = Group()
for ship_number in range(self.stats.ships_left):
ship = Ship(self.ai_settings, self.screen)
ship.rect.x = 10 + ship_number * ship.rect.width
ship.rect.y = 10
self.ships.add(ship)

def prep_high_score(self):
high_score = int(round(self.stats.high_score, -1))
high_score_str = "{:,}".format(high_score)
self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color)
# 将最高得分放在屏幕顶部中央
self.high_score_rect = self.high_score_image.get_rect()
self.high_score_rect.centerx = self.screen_rect.centerx
self.high_score_rect.top = self.score_rect.top

def prep_level(self):
self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color)
self.level_rect = self.level_image.get_rect()
self.level_rect.right = self.score_rect.right
self.level_rect.top = self.score_rect.bottom + 10

def prep_score(self):
"""将得分转化为图像"""
rounded_score = int(round(self.stats.score, -1))
score_str = "{:,}".format(rounded_score)
self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color)
# 将得分放到右上角
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20
self.score_rect.top = 20

def show_score(self):
"""在屏幕上显示得分"""
self.screen.blit(self.score_image, self.score_rect)
self.screen.blit(self.high_score_image, self.high_score_rect)
self.screen.blit(self.level_image, self.level_rect)
# 绘制飞船
self.ships.draw(self.screen)

外星人的 alien.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
def __init__(self, ai_settings, screen):
"""初始化外星人起始位置"""
super(Alien, self).__init__()
self.ai_settings = ai_settings
self.screen = screen

# 加载外星人图像,并设置其 rect 属性
self.image = pygame.image.load("images/alien.bmp")
self.rect = self.image.get_rect()

# 每个外星人都要在屏幕的上面出现
self.rect.x = self.rect.width
self.rect.y = self.rect.height

# 储存每个外星人的位置
self.x = float(self.rect.x)

def blitme(self):
self.screen.blit(self.image, self.rect)

def check_edges(self):
"""如果外星人位于屏幕边缘,就返回 true"""
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
elif self.rect.left <= 0:
return True

def update(self):
"""

向右移动外星人"""
self.x += self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction
self.rect.x = self.x

按钮的 button.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pygame.font

class Button():
def __init__(self, ai_settings, screen, msg):
self.screen = screen
self.screen_rect = screen.get_rect()
self.width, self.height = 200, 50
self.button_color = (0, 255, 0)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None, 48)
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center
self.prep_msg(msg)

def prep_msg(self, msg):
self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center

def draw_button(self):
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)

你可以通过点击以下链接下载附件:

如果你有任何问题或需要进一步的帮助,请随时在评论区发送,我会尽力解答!

python-alien-invasion-game-spaceship

本来这篇文章我已经有思路了,并且其实已经写了一些了,但是因为有一些事情要去做,然后忘记这边还写得文章了,没保存直接关闭了。所以现在是我重新写的了!

最近我是在看《Python从入门到实践》,看的比较快,已经到项目部分了,开始做飞船大战外星人这个基本上入门必学的案例了,但是还是遇到了许多的问题,不过幸好基本上全部解决了了。其实对编程最大的挑战,就是仔细。这个东西确实,有的时候感觉就是控制不住自己,不是多敲了就是少敲了,下面先分析一下会出现什么样的问题。

首先呢其实就是英文大小写问题,还有加不加s,有的时候你前面定义的是有s的,但是后来下面调用的时候忘记了,或者前面没有s,后面加了。

再有就是符号问题,我发现我写Python很爱写分号;,搞得我很难受,用PyCharm一直有波浪线出现。

然后再就是其实真的,一些简单的小程序写上一个文档就好了,文档太多调用很麻烦的!不过说实在的,分的多了,找起来修改很容易,并且其实未来进行编程的时候,大多都不是小程序,还是需要重构一下代码的。不过其实,可以先把想要重构的先写出来,然后再找到合适的地方把它放进去,不是创建一个.py就是创建一个def,反正就是要把它放起来,让主文件空空荡荡最好!

我一般就是错名字,错参数!很难受的,有的找起来非常费劲!

super(Bullet,self).__init__(),比如说这一段,给继承的参数,容易出错。再比如说一些位置,不要理所应当,我今天把左右移动调成上下移动,一开始是我确实以为是up和down,没想到实际上却是top和bottom,虽然有的时候PyCharm没有提示,但是大多数没提示都是错误的。

下面上一下代码,把所有文件放在同一目录下即可,当然图片记得放好或者修改一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 主文件:
import pygame
from setting import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group

def run_game():
# 初始化游戏并且创建一个屏幕对象
pygame.init()
# 初始化背景属性
ai_settings = Settings()
# 使类setting里的内容直接被调用
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("aa") # 窗口名字
# 创建飞船
ship = Ship(ai_settings, screen)
# 创建储存子弹的编组
bullets = Group()
# 开始游戏的主循环
while True:
# 监视鼠标和键盘事件
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
bullets.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings, screen, ship, bullets)

run_game()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# game_functions.py
import sys
import pygame
from bullet import Bullet

def check_keydown_events(event, ai_settings, screen, ship, bullets):
"""响应按下"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
fire_bullet(ai_settings, screen, ship, bullets)

def fire_bullet(ai_settings, screen, ship, bullets):
# 创建一个子弹并将它加入编组bullets
if len(bullets) < ai_settings.bullet_allowed:
# 判断现存子弹数量是否小于设定值
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)

def check_keyup_events(event, ship):
"""响应松开"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False

def check_events(ai_settings, screen, ship, bullets):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)

def update_screen(ai_settings, screen, ship, bullets):
"""更新数据"""
screen.fill(ai_settings.bg_color)
# 绘制所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()

def update_bullets(bullets):
"""更新子弹位置,删除消失的子弹"""
# 更新子弹位置
bullets.update()
# 删除消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom < 0:
bullets.remove(bullet)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# ship.py
import pygame

class Ship():
def __init__(self, ai_settings, screen):
"""初始化飞船位置"""
self.screen = screen
self.ai_settings = ai_settings
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load("images/ship.bmp")
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# 将每艘新飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# 在飞船的属性center中储存小数值
self.center = float(self.rect.centerx)
# 移动标志
self.moving_right = False
self.moving_left = False

def update(self):
"""根据移动标志调整位置"""
# 更新飞船的center值,而不是rect
if self.moving_right and self.rect.right < self.screen_rect.right:
self.center += self.ai_settings.ship_speed_factor
if self.moving_left and self.rect.left > 0:
self.center -= self.ai_settings.ship_speed_factor
# 根据self.center更新rect对象
self.rect.centerx = self.center

def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image, self.rect)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# bullet.py
import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
"""一个对飞船发射的子弹进行管理的类"""

def __init__(self, ai_settings, screen, ship):
"""在飞船所处位置创建一个子弹"""
super(Bullet, self).__init__()
self.screen = screen
# 在(0,0)处创建一个表示子弹的矩形,再将位置进行转移(设置成改在的位置)
self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
# 储存用小数表示的子弹位置
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor

def update(self):
"""向上移动子弹"""
# 更新子弹位置的小数值
self.y -= self.speed_factor
# 更新子弹的位置
self.rect.y = self.y

def draw_bullet(self):
"""在屏幕上绘制子弹"""
pygame.draw.rect(self.screen, self.color, self.rect)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# setting.py
class Settings():
"""储存外星人大战的所有设置"""

def __init__(self):
"""初始化游戏的设置"""
# 屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
# 飞船的设置
self.ship_speed_factor = 1.5
# 子弹设置
self.bullet_speed_factor = 1
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = (60, 60, 60)
self.bullet_allowed = 3

效果图我就不放了,反正还可以吧,就这样!


希望这样的格式更容易阅读和理解你的博客内容。如果有任何其他需要或问题,请随时告诉我。

织梦 栏目ID和文章ID从头从1开始

在进行织梦建站的时候,大部分的人都会在本地进行测试,然后就会产生你测试的文章和栏目,并且把id记录了下来,即使你最后把文章和栏目都删掉了,id也会保存下来。

下面交给大家一个快速删除织梦后台数据的办法 通过织梦后台系统里的 下面是快速删除织梦dede数据的方法在织梦后台点击系统,然后找到sql命令运行工具,然后把这12句sql代码复制进去点击执行即可。 会清空栏目,文档,tag标签,最好先备份一下然后再清空数据。 因为我们有plan B。

1
2
3
4
5
6
7
8
9
10
11
12
TRUNCATE dede_addonarticle; 
TRUNCATE dede_addonimages;
TRUNCATE dede_addoninfos;
TRUNCATE dede_addonshop;
TRUNCATE dede_addonsoft;
TRUNCATE dede_addonspec;
TRUNCATE dede_arccache;
TRUNCATE dede_arctiny;
TRUNCATE ded_archives;
TRUNCATE dede_taglist;
TRUNCATE dede_tagindex;
TRUNCATE dede_arctype;

之后在核心里更新栏目缓存,接下来在生成里更新系统缓存即可。 假如说你清空数据然后前台的html+css会移动,比如说div左右移,或者上下移,推荐你看我的 织梦 清空数据或删除栏目后前台div会移动