利用python爬取_如何利用Python抓取静态网站及其内部资源

news/2024/5/21 1:02:45/文章来源:https://blog.csdn.net/weixin_39890289/article/details/110035680

原标题:如何利用Python抓取静态网站及其内部资源

来源: Mask 链接:

https://segmentfault.com/a/1190000015880780

遇到的需求

前段时间需要快速做个静态展示页面,要求是响应式和较美观。由于时间较短,自己动手写的话也有点麻烦,所以就打算上网找现成的。

中途找到了几个页面发现不错,然后就开始思考怎么把页面给下载下来。

由于之前还没有了解过爬虫,自然也就没有想到可以用爬虫来抓取网页内容。所以我采取的办法是:

打开chrome的控制台,进入Application选项

找到Frames选项,找到html文件,再右键Save As...

手动创建本地的js/css/images目录

依次打开Frames选项下的Images/s/Stylesheets,一个文件就要右键Save As...

这个办法是我当时能想到的最好办法了。不过这种人为的办法有以下缺点:

手工操作,麻烦费时

一不小心就忘记保存哪个文件

难以处理路径之间的关系,比如一张图片a.jpg, 它在html中的引用方式是images/banner/a.jpg,这样我们以后还要手动去解决路径依赖关系

然后刚好前段时间接触了一点python,想到可以写个python爬虫来帮我自动抓取静态网站。于是就马上动手,参考相关资料等等。

下面跟大家详细分享一下写爬虫抓取静态网站的全过程。

前置知识储备

在下面的代码实践中,用到了python知识、正则表达式等等,核心技术是正则表达式。

我们来一一了解一下。

Python基础知识

如果你之前有过其他语言的学习经历,相信你可以很快上手python这门语言。具体学习可以上查看python官方文档或者其他教程。

爬虫的概念

爬虫,按照我的理解,其实是一段自动执行的计算机程序,在web领域中,它存在的前提是模拟用户在浏览器中的行为。

它的原理就是模拟用户访问web网页,获取网页内容,然后分析网页内容,找出我们感兴趣的部分,并且最后处理数据。

流程图是:

46ad0c34ebe24820812be52623c29a5d.png

现在流行的爬虫主流实现形式有以下几种:

自己抓取网页内容,然后自己实现分析过程

用别人写好的爬虫框架,比如Scrapy

正则表达式概念

正则表达式是由一系列元字符和普通字符组成的字符串,它的作用是根据一定的规则来匹配文本,最终可以对文本做出一系列的处理。

元字符是正则表达式中的保留字符,它有特殊的匹配规则,比如*代表匹配0到无穷多次,普通字符就是普通的abcd等等。

比如在前端中,常见的一个操作就是判断用户的输入是否为空,这时候我们可以先通过正则表达式来进行匹配,先过滤掉用户输入的两边空白值,具体实现如下:

functiontrim(value){

returnvalue.replace( /^s+|s+$/g, '')

}

// 输出 => "Python爬虫"

trim( ' Python爬虫 ');

下面我们一起来具体了解一下正则表达式中的元字符。

正则表达式中的元字符

在上面,我们说过元字符是正则表达式中的保留字符,它有特殊的匹配规则,所以我们首先要了解经常出现的元字符。

匹配单个字符的元字符

.代表匹配一个任意字符,除了n(换行符),比如可以匹配任意的字母数字等等

[...]表示字符组,里面可以有任意字符,它只会匹配当中的任意一个,比如[abc]可以匹配a或b或c,这里值得注意的是,字符组里面的元字符有时候会被当成是普通字符,比如[-*?]等等,它代表的仅仅是-或*或?,而不是-代表区间,*代表0到无穷次匹配,?代表0或1次匹配。

[^...]跟[...]的含义相反,它的意思是匹配一个不属于[...]里面的字符,而不是不匹配[...]里面的字符,这两种说法虽然细微但是有很大差别,前者规定一定要匹配一个字符,这个切记。

例子:[^123]可以匹配4/5/6等等,但是不匹配1/2/3

提供计数功能的元字符

*代表匹配0次到无穷次,可以不匹配任何字符

+代表匹配1次到无穷次,至少匹配1次

?代表匹配0次或1次

{min, max}代表匹配min次到max次,如a{3, 5}表示a至少匹配3-5次提供位置的元字符

^代表匹配字符串开头,如^a表示a要出现在字符串开头,bcd则不匹配

$代表匹配字符串结尾, 如A$表示A要出现在字符串结尾,ABAB则不匹配

其他元字符

|代表一个范围,可以匹配任意的子表达式,比如abc|def可以匹配abc或者def,不匹配abd

(...)代表分组,它的作用有界定子表达式的范围和与提供功能的元字符相结合,比如(abc|def)+代表可以匹配1次或1次以上的abc或者defdef,如abcabcabc,def

i代表反向引用,i可以为1/2/3等整数,它的含义是指向上一个()里面匹配的内容。比如匹配(abc)+(12)*12,如果匹配成功的话,1的内容是abc,2的内容是12或者空。反向引用通常用在匹配""或者''中

环视

我理解的环视是界定当前匹配子表达式的左边文本和右边文本出现的情况,环视本身不会占据匹配的字符,它是当前子表达式的匹配规则但是本身不算进匹配文本。而我们上面说的元字符都代表一定的规则和占据一定的字符。环视可分为四种:肯定顺序环视、否定顺序环视、肯定逆序环视和否定逆序环视。它们的工作流程如下:

肯定顺序环视:先找到环视中的文本在右侧出现的初始位置,然后从匹配到的右侧文本的最左的位置开始匹配字符

否定顺序环视:先找到环视中的文本在右侧没有出现的初始位置,然后从匹配到的右侧文本的最左的位置开始匹配字符

肯定逆序环视:先找到环视中的文本在左侧出现的初始位置,然后从匹配到的左侧文本的最右的位置开始匹配字符

否定逆序环视:先找到环视中的文本在左侧没有出现的初始位置,然后从匹配到的左侧文本的最右的位置开始匹配字符

肯定顺序环视

肯定顺序环视匹配成功的条件是当前的子表达式能够匹配右侧文本,它的写法是(?=...),...代表要环视的内容。比如正则表达式(?=hello)he的意思是匹配包含hello的文本,它只匹配位置,不匹配具体字符,匹配到位置之后,才真正匹配要占用的字符是he,所以后面可以具体匹配llo等。

对于(?=hello)he而言,hello world可以匹配成功,而hell world则匹配失败。具体代码如下:

importre

reg1 = r'(?=hello)he'

print(re.search(reg1, 'hello world'))

print(re.search(reg1, 'hell world hello'))

print(re.search(reg1, 'hell world'))

# 输出结果

<_sre.SRE_Match object; span=( 0, 2), match= 'he'>

<_sre.SRE_Match object; span=( 11, 13), match= 'he'>

None否定顺序环视

否定顺序环视匹配成功的条件是当前的子表达式不能匹配右侧文本,它的写法是(?!...),...代表要环视的内容,还是上面的例子,比如正则表达式(?!hello)he的意思是匹配不是hello的文本,找到位置,然后匹配he。

例子如下:

importre

reg2 = r'(?!hello)he'

print(re.search(reg2, 'hello world'))

print(re.search(reg2, 'hell world hello'))

print(re.search(reg2, 'hell world'))

# 输出结果

None

<_sre.SRE_Match object; span=( 0, 2), match= 'he'>

<_sre.SRE_Match object; span=( 0, 2), match= 'he'> 肯定逆序环视

肯定逆序环视匹配成功的条件是当前的子表达式能够匹配左侧文本,它的写法是(?<=...),...代表要环视的内容,比如正则表达式(?<=hello)-python的意思是匹配包含-python的子表达式,并且它的左侧必须出现hello,hello只匹配位置,不匹配具体字符,真正占用的字符是后面的-python。

例子如下:

importre

reg3 = r'(?<=hello)-python'

print(re.search(reg3, 'hello-python'))

print(re.search(reg3, 'hell-python hello-python'))

print(re.search(reg3, 'hell-python'))

# 输出结果

<_sre.SRE_Match object; span=( 5, 12), match= '-python'>

<_sre.SRE_Match object; span=( 17, 24), match= '-python'>

None否定逆序环视

否定逆序环视匹配成功的条件是当前的子表达式不能匹配左侧文本,它的写法是(?

例子如下:

importre

reg3 = r'(?<=hello)-python'

print(re.search(reg3, 'hello-python'))

print(re.search(reg3, 'hell-python hello-python'))

print(re.search(reg3, 'hell-python'))

# 输出结果

<_sre.SRE_Match object; span=( 5, 12), match= '-python'>

<_sre.SRE_Match object; span=( 17, 24), match= '-python'>

None

环视在对字符串插入某些字符很有效,你可以利用它来匹配位置,然后插入对应的字符,而不需要对原来的文本进行替换。

捕获分组

在正则表达式中,分组可以帮助我们提取出想要的特定信息。

指明分组很简单,只需要在想捕获的表达式中两端加上()就可以了。在python中,我们可以用re.search(reg, xx).groups()来获取到所有的分组。

默认的()中都指明了一个分组,分组序号为i,i从1开始,分别用re.search(reg, xx).group(i)来获取。

如果不想捕获分组可以使用(?:...)来指明。

具体例子如下:

importre

reg7 = r'hello,([a-zA-Z0-9]+)'

print(re.search(reg7, 'hello,world').groups())

print(re.search(reg7, 'hello,world').group( 1))

print(re.search(reg7, 'hello,python').groups())

print(re.search(reg7, 'hello,python').group( 1))

# 输出结果

( 'world',)

world

( 'python',)

python 贪婪匹配

贪婪匹配是指正则表达式尽可能匹配多的字符,也就是趋于最大长度匹配。

正则表达式默认是贪婪模式。

例子如下:

importre

reg5 = r'hello.*world'

print(re.search(reg5, 'hello world,hello python,hello world,hello java'))

# 输出结果

<_sre.SRE_Match object; span=( 0, 36), match= 'hello world,hello python,hello world'>

由上可以看到它匹配的是hello world,hello python,hello world而不是刚开始的hello world。那如果我们只是想匹配刚开始的hello world,这时候我们可以利用正则表达式的非贪婪模式。

非贪婪匹配正好与贪婪匹配相反,它是指尽可能匹配少的字符,只要匹配到了就结束。要使用贪婪模式,仅需要在量词后面加上一个问号(?)就可以。

还是刚刚那个例子:

importre

reg5 = r'hello.*world'

reg6 = r'hello.*?world'

print(re.search(reg5, 'hello world,hello python,hello world,hello java'))

print(re.search(reg6, 'hello world,hello python,hello world,hello java'))

# 输出结果

<_sre.SRE_Match object; span=( 0, 36), match= 'hello world,hello python,hello world'>

<_sre.SRE_Match object; span=( 0, 11), match= 'hello world'>

由上可以看到这是我们刚刚想要匹配的效果。

进入开发

有了上面的基础知识,我们就可以进入开发环节了。

我们想实现的最终效果

本次我们的最终目的是写一个简单的python爬虫,这个爬虫能够下载一个静态网页,并且在保持网页引用资源的相对路径下下载它的静态资源(如js/css/images)。测试网站为http://www.peersafe.cn/index.html,效果图如下:

4793bfdf898441179f7363ac57c18c63.jpeg

开发流程

我们的总体思路是先获取到网页的内容,然后利用正则表达式来提取我们想要的资源链接,最后就是下载资源。

获取网页内容

我们选用python3自带的urllib.http来发出http请求,或者你可以采用第三方请求库requests。

获取内容的部分代码如下:

url = 'http://www.peersafe.cn/index.html'

# 读取网页内容

webPage = urllib.request.urlopen(url)

data = webPage.read()

content = data.decode( 'UTF-8')

print( '> 网站内容抓取完毕,内容长度:', len(content))

获取到内容之后,我们需要把它保存下来,也就是写到本地磁盘上。我们定义一个SAVE_PATH路径,代表专门放置爬虫下载的文件。

# python-spider-downloads是我们要放置的目录

# 这里推荐使用os模块来获取当前的目录或者拼接路径

# 不推荐直接使用'F://xxx' + '//python-spider-downloads'等方式

SAVE_PATH = os.path.join(os.path.abspath( '.'), 'python-spider-downloads')

接下来就是为这个站点创建一个单独的文件夹了。这个站点文件夹的格式是xxxx-xx-xx-domain,比如2018-08-03-www.peersafe.cn。在此之前,我们需要写一个函数来提取出一个url链接的域名、相对路径、请求文件名和请求参数等等,这个在后续在根据资源文件的引用方式创建相对应的文件夹时也会用到。

比如输入http://www.peersafe.cn/index.html,那么将会输出:

{'baseUrl': 'http://www.peersafe.cn', 'fullPath': 'http://www.peersafe.cn/', 'protocol': 'http://', 'domain

': 'www.peersafe.cn', 'path': '/', 'fileName': 'index.html', 'ext': 'html', 'params': ''}

部分代码如下:

REG_URL = r'^(https?://|//)?((?:[a-zA-Z0-9-_]+.)+(?:[a-zA-Z0-9-_:]+))((?:/[-_.a-zA-Z0-9]*?)*)((?<=/)[-a-zA-Z0-9]+(?:.([a-zA-Z0-9]+))+)?((?:?[a-zA-Z0-9%&=]*)*)$'

regUrl = re.compile(REG_URL)

# ...

'''

解析URL地址

'''

defparseUrl(url):

ifnoturl:

return

res = regUrl.search(url)

# 在这里,我们把192.168.1.109:8080的形式也解析成域名domain,实际过程中www.baidu.com等才是域名,192.168.1.109只是IP地址

# ('http://', '192.168.1.109:8080', '/abc/images/111/', 'index.html', 'html', '?a=1&b=2')

ifres isnotNone:

path = res.group( 3)

fullPath = res.group( 1) + res.group( 2) + res.group( 3)

ifnotpath.endswith( '/'):

path = path + '/'

fullPath = fullPath + '/'

returndict(

baseUrl=res.group( 1) + res.group( 2),

fullPath=fullPath,

protocol=res.group( 1),

domain=res.group( 2),

path=path,

fileName=res.group( 4),

ext=res.group( 5),

params=res.group( 6)

)

'''

解析路径

eg:

basePath => F:Programspythonpython-spider-downloads

resourcePath => /a/b/c/ or a/b/c

return => F:Programspythonpython-spider-downloadsabc

'''

defresolvePath(basePath, resourcePath):

# 解析资源路径

res = resourcePath.split( '/')

# 去掉空目录 /a/b/c/ => [a, b, c]

dirList = list(filter( lambdax: x, res))

# 目录不为空

ifdirList:

# 拼接出绝对路径

resourcePath = reduce( lambdax, y: os.path.join(x, y), dirList)

dirStr = os.path.join(basePath, resourcePath)

else:

dirStr = basePath

returndirStr

上面的正则表达式REG_URL有点长,这个正则表达式能解析目前我遇到的各种url形式,如果有不能解析的,你可以自行补充,我测试过的url列表可以去我的github中查看。

首先一个最复杂的url链接(比如'http://192.168.1.109:8080/abc/images/111/index.html?a=1&b=2')来说,我们想分别提取出http://, 192.168.1.109:8080, /abc/images/111/, index.html, ?a=1&b=2。提取出/abc/images/111/的目的是为以后创建目录做准备,index.html是写入网页内容的名字。

有需要的可以深入研究一下REG_URL的写法,如果有更好的或者看不懂的,我们可以一起探讨。

有了parseUrl函数之后,我们就可以把刚刚获取网页内容和写入文件联系起来了,代码如下:

# 首先创建这个站点的文件夹

urlDict = parseUrl(url)

print( '分析的域名:', urlDict)

domain = urlDict[ 'domain']

filePath = time.strftime( '%Y-%m-%d', time.localtime()) + '-'+ domain

# 如果是192.168.1.1:8000等形式,变成192.168.1.1-8000,:不可以出现在文件名中

filePath = re.sub( r':', '-', filePath)

SAVE_PATH = os.path.join(SAVE_PATH, filePath)

# 读取网页内容

webPage = urllib.request.urlopen(url)

data = webPage.read()

content = data.decode( 'UTF-8')

print( '> 网站内容抓取完毕,内容长度:', len(content))

# 把网站的内容写下来

pageName = ''

ifurlDict[ 'fileName'] isNone:

pageName = 'index.html'

else:

pageName = urlDict[ 'fileName']

pageIndexDir = resolvePath(SAVE_PATH, urlDict[ 'path'])

ifnotos.path.exists(pageIndexDir):

os.makedirs(pageIndexDir)

pageIndexPath = os.path.join(pageIndexDir, pageName)

print( '主页的地址:', pageIndexPath)

f = open(pageIndexPath, 'wb')

f.write(data)

f.close() 提取有用的资源链接

我们想要的资源是图片资源,js文件、css文件和字体文件。如果我们要对网页内容一一进行解析,利用分组,来捕获出我们想要的链接形式,比如images/1.png和s/lib/jquery.min.js。

代码如下:

REG_RESOURCE_TYPE = r'(?:href|src|data-original|data-src)=["'](.+?.(?:js|css|jpg|jpeg|png|gif|svg|ico|ttf|woff2))[a-zA-Z0-9?=.]*["']'

# re.S代表开启多行匹配模式

regResouce = re.compile(REG_RESOURCE_TYPE, re.S)

# ...

# 解析网页内容,获取有效的链接

# content是上一步读取到的网页内容

contentList = re.split( r's+', content)

resourceList = []

forline incontentList:

resList = regResouce.findall(line)

ifresList isnotNone:

resourceList = resourceList + resList 下载资源

在解析出资源链接后,我们要针对每一个资源链接进行检查,把它变成符合http请求的url格式,比如把images/1.png加上http头和刚刚的domain,也就是http://domain/images/1.png。

下面是对资源链接进行处理的代码:

# ./static/js/index.js

# /static/js/index.js

# static/js/index.js

# //abc.cc/static/js

# http://www.baidu/com/static/index.js

ifresourceUrl.startswith( './'):

resourceUrl = urlDict[ 'fullPath'] + resourceUrl[ 1:]

elifresourceUrl.startswith( '//'):

resourceUrl = 'https:'+ resourceUrl

elifresourceUrl.startswith( '/'):

resourceUrl = urlDict[ 'baseUrl'] + resourceUrl

elifresourceUrl.startswith( 'http') orresourceUrl.startswith( 'https'):

# 不处理,这是我们想要的url格式

pass

elifnot(resourceUrl.startswith( 'http') orresourceUrl.startswith( 'https')):

# static/js/index.js这种情况

resourceUrl = urlDict[ 'fullPath'] + resourceUrl

else:

print( '> 未知resource url: %s'% resourceUrl)

接着就是对每个规范的资源链接进行解析(parseUrl),提取出它要存放的目录和文件名等等,然后创建对应的目录。

在这里,我也处理了引用的其他网站的资源。

# 解析文件,查看文件路径

resourceUrlDict = parseUrl(resourceUrl)

ifresourceUrlDict isNone:

print( '> 解析文件出错:%s'% resourceUrl)

continue

resourceDomain = resourceUrlDict[ 'domain']

resourcePath = resourceUrlDict[ 'path']

resourceName = resourceUrlDict[ 'fileName']

ifresourceDomain != domain:

print( '> 该资源不是本网站的,也下载:', resourceDomain)

# 如果下载的话,根目录就要变了

# 再创建一个目录,用于保存其他地方的资源

resourceDomain = re.sub( r':', '-', resourceDomain)

savePath = os.path.join(SAVE_PATH, resourceDomain)

ifnotos.path.exists(SAVE_PATH):

print( '> 目标目录不存在,创建:', savePath)

os.makedirs(savePath)

# continue

else:

savePath = SAVE_PATH

# 解析资源路径

dirStr = resolvePath(savePath, resourcePath)

ifnotos.path.exists(dirStr):

print( '> 目标目录不存在,创建:', dirStr)

os.makedirs(dirStr)

# 写入文件

downloadFile(resourceUrl, os.path.join(dirStr, resourceName))

下载的函数downloadFile的代码是:

'''

下载文件

'''

defdownloadFile(srcPath, distPath):

globaldownloadedList

ifdistPath indownloadedList:

return

try:

response = urllib.request.urlopen(srcPath)

ifresponse isNoneorresponse.status != 200:

returnprint( '> 请求异常:', srcPath)

data = response.read()

f = open(distPath, 'wb')

f.write(data)

f.close()

downloadedList.append(distPath)

# print('>>>: ' + srcPath + ':下载成功')

exceptException ase:

print( '报错了:', e)

以上就是我们的开发全过程。

知识总结

本次开发用到的技术

利用urllib.http来发网络请求

利用正则表达式来解析资源链接

利用os系统模块来处理文件路径问题

心得体会

这篇文章也算是我这段时间学习python的一个实践总结,顺便记录下正则表达式的知识。同时我也希望能够帮助到那些想学习正则表达式和爬虫的小伙伴。返回搜狐,查看更多

该python爬虫的源代码已经放在github上(https://github.com/qzcmask/python-codes/blob/master/static-resource-spider.py),有兴趣的小伙伴可以上去看看,满意的可以顺便给个 Star,感谢支持。

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_726536.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有哪些网站是django开发的_网站开发需要哪些技术人员,长春网络公司告诉您

网站开发是基于B/S(IE浏览器)的网页开发&#xff0c;一般具有交互性。它是由若干个页面组成的有联系的集合。并且他作为一个行业的web开发&#xff0c;自从web开发商业化以来&#xff0c;它一直处于一个增长的状态。那么开发一个网站需要用到的专业人员有哪些&#xff0c;以及他…

华为手机丢失定位网站_EMUI这个功能可以帮你找回丢失的手机

一部手机走天下的时代&#xff0c;出门可以不带钱包&#xff0c;尤其假日出行&#xff0c;非常方便&#xff0c;但是如果忘记带手机那你绝对要陷入焦虑中了&#xff0c;更可怕的事在于手机丢失或者被盗&#xff0c;那绝不亚于一场灾难。问题是&#xff0c;当手机丢失我们就只能…

php控制led灯,PHP响应式LED灯具节能灯汽车灯网站整站源码(自适应手机移动端) dedecms内核...

【温馨提示】源码包解压密码&#xff1a;www.youhutong.com资源描述PHP响应式LED灯具节能灯汽车灯网站整站源码(自适应手机移动端) dedecms内核模板介绍&#xff1a;织梦最新内核开发的模板&#xff0c;该模板属于企业通用、HTML5响应式、二极管、灯具、矿灯类企业使用&#xf…

网站首页实战教程html,Python实战课程1-1练习:创建一个网页

最近在网易课堂上学习python的一个实战课程&#xff0c;正好简书也是我喜欢的一个平台&#xff0c;不妨在这里提交作业分享心得。第一个小练习是做一个简单的网页&#xff0c;最终呈现的效果如下&#xff1a;下面开始吧&#xff01;1.创建html文件将homework文件夹下载到本地&a…

tplogincn服务器无响应,tplogin.cn网站打不开怎么办?

问&#xff1a;设置tplink路由器时&#xff0c;tplogin.cn网站进不去&#xff0c;无法对路由器进行设置&#xff0c;请问如何解决&#xff1f;答&#xff1a;tplogin.cn是tplink路由器的管理页面地址(登录地址)&#xff0c;正常情况下&#xff0c;电脑/手机连接tplin路由器后&a…

附录5-SEO优化

SEO(Search Engine Optimization)搜索引擎优化&#xff0c;可以利用搜索引擎的规则提高网站再搜索引擎内的自然排名 我们现在用搜索引擎搜索1 此时 晋江文学城 的排名就要比 百度汉语 的排名高 不过这个应该不是自然排名 在前端中使用TDK三个标签进行SEO优化 T title 标题D …

几个常用的免费高清无版权图片网站

https://www.pexels.com https://pixabay.com https://www.ssyer.com/home https://unsplash.com https://stocksnap.io https://magdeleine.co https://visualhunt.com

网站⭐Windows下,将xampp升级为https

文章目录 🟥 将SSL文件放置到服务器中🟧 修改httpd.conf文件1️⃣ 去除如下的#2️⃣ 替换 Directory 中的内容3️⃣ 添加字段🟨 修改httpd-ssl.conf文件🟩 重启 apache🟥 将SSL文件放置到服务器中 在C:\SOFT\xampp\apache\conf(找到你的目录)文件夹下新建文件夹:…

python模拟登录网站_python模拟登录http basic authentication网站

当访问需要认证的网站时会提示输入正确的用户和密码如果密码错误会返回401的状态码401 Authorization Required 通过python脚本模拟登录#!/usr/bin/python #-*-coding:utf-8-*- import urllib2 #登录的用户名和密码 username "root" password "redhat" u…

tomcat网站根目录在哪里_学习织梦网站必需会的一件事:织梦网站数据备份

学习织梦网站必需会的一件事&#xff1a;织梦网站数据备份任务&#xff1a;宝塔面板织梦网站备份织梦CMS程序运行环境&#xff1a;PHPMySQL所以无论是备份还是还原&#xff0c;都涉及2个部分&#xff0c;一个是web文件的备份&#xff0c;一个是数据库的备份。做好数据备份是站长…

1. Jenkins 学习——传统网站部署流程

传统网站部署的流程 传统的网站部署&#xff0c;大家在运维过程中&#xff0c;网站部署是运维的工作之一&#xff0c;网站部署的流程大致分为&#xff1a; 需求分析—原型设计—开发代码—提交测试—内网部署—确认上线—备份数据—外网更新-最终测试&#xff0c;如果发现外网…

2. Jenkins 学习——目前主流网站部署的流程

目前主流网站部署的流程 目前主流网站部署方法&#xff0c;通过Hudson/Jenkins工具平台实现全自动部署测试&#xff0c;是一个可扩展的持续集成引擎&#xff0c;是一个开源软件项目&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。Jenkins非…

php 开启phalocn 扩展_宝塔BT面板+wordpress如何开启Memcached缓存,让网站飞起来

宝塔BT面板wordpress如何开启Memcached缓存&#xff0c;让网站飞起来&#xff0c;主要减少查询&#xff0c;提升网站访问速度&#xff0c;降低卡顿的风险&#xff0c;减轻服务器压力今天有个朋友让我给他安装调试Memcached&#xff0c;也是一个wordpress站点&#xff0c;之前因…

java动漫网站开题报告_基于Java的动漫网站的设计与实现(JSP,SQL)

基于Java的动漫网站的设计与实现(JSP,SQL)(任务书,开题报告,外文翻译,毕业论文15000字,程序代码,SQLserver数据库,答辩PPT)摘 要随着科技的迅速发展&#xff0c;计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展&#xff0c;网络的规模也逐渐增大&#…

php刷网站关键词排名,刷百度快速排名 提升百度网站关键词快速排名上首页-环企优站...

静态URL是什么&#xff1a;URL的定义&#xff0c;是指网页地址或者网页 链接。一般通过URL中是否带有“?”、“ ”“”“php” 9;asp ;等字符来分辩 &#xff0c;换句话说就是不带有任何 参数的URL&#xff0c;就是静态URL。 静态URL在搜索 引擎上有一定的好处。可 以更加方便…

php网站上传后打不开了,phpcms上传服务器后,后台打不开怎么办

phpcms上传服务器后怎么打不开后台&#xff1f;如果有报错信息&#xff0c;一般情况是需要改配置文件的。操作步骤如下&#xff1a;1、把网站打包通过FTP上传到服务器&#xff0c;服务器解压。2、数据库导出在导入服务器数据库。注意编码格式。3、网站程序解压完成修改配置文件…

爬取某网站景区列表并保存为csv文件

爬取某网站景区列表并保存为csv文件 网址:http://www.halehuo.com/jingqu.html 经过查看可以发现,该景区页面没有分页,不停的往下拉,页面会进行刷新显示后面的景区信息 通过使用浏览器调试器,发现该网站使用的是post请求,使用ajax传输数据 请求参数: 响应数据: 经过以上分析,…

查看网站收录情况

site:www.nfgjhr.com &#xff0c;其中&#xff0c;不带www的收入录要比带www的要高。

化工网站开发_贵州省化工技术研发中心招聘简章

推荐课程贵州省事业单位2020年招考(公共基础知识)网课贵州教师招考网课 《教育综合知识》全新上线贵州省化工技术研发中心是在市场监管局依法注册的企业&#xff0c;主营业务为矿产和植被资源的高效利用研发、固体废弃物的综合利用及污染防控技术开发、技术交流与成果应用转化、…

mfc 弹出ocx与页面相对_网站404页面有什么用处

404页面是网站优化中必不可少的基础优化之一&#xff0c;404页面是客户端在浏览网页时&#xff0c;服务器无法正常提供信息&#xff0c;或是服务器无法回应&#xff0c;且不知道原因所返回的页面。当用户输入了错误的链接时&#xff0c;返回的页面&#xff0c;它会告诉浏览者其…