Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程

news/2024/5/10 13:08:29/文章来源:https://blog.csdn.net/qq_43068569/article/details/89884122

    Scrapy是一个用于爬行网站以及在数据挖掘、信息处理和历史档案等大量应用范围内抽取结构化数据的应用程序框架,广泛用于工业。

在本文中我们将建立一个从Hacker News爬取数据的爬虫,并将数据按我们的要求存储在数据库中。

安装

我们将需要Scrapy以及 BeautifulSoup用于屏幕抓取,SQLAlchemy用于存储数据.

如果你使用ubuntu已经其他发行版的unix可以通过pip命令安装Scrapy。

pip install Scrapy

如果你使用Windows,你需要手工安装scrapy的一些依赖。

Windows用户需要pywin32、pyOpenSSL、Twisted、lxml和zope.interface。你可以下载这些包的编译版本来完成简易安装。

可以参照官方文档查看详情指导。

都安装好后,通过在python命令行下输入下面的命令验证你的安装:

>> import scrapy
>>

如果没有返回内容,那么你的安装已就绪。


安装HNScrapy

为了创建一个新项目,在终端里输入以下命令

$ scrapy startproject hn

这将会创建一系列的文件帮助你更容易的开始,cd 到 hn 目录然后打开你最喜欢的文本编辑器。

在items.py文件里,scrapy需要我们定义一个容器用于放置爬虫抓取的数据。如果你原来用过Django tutorial,你会发现items.py与Django中的models.py类似。

你将会发现class HnItem已经存在了,它继承自Item--一个scrapy已经为我们准备好的预定义的对象。

让我们添加一些我们真正想抓取的条目。我们给它们赋值为Field()是因为这样我们才能把元数据(metadata)指定给scrapy。

from scrapy.item import Item, Fieldclass HnItem(Item):title = Field()link = Field()

没什么难的--恩,就是这样。在scrapy里,没有别的filed类型,这点和Django不同。所以,我们和Field()杠上了。

scrapy的 Item类的行为类似于Python里面的dictionary,你能从中获取key和value。

开始写爬虫

在spiders文件夹下创建一个hn_spider.py文件。这是奇迹发生的地方--这正是我们告诉scrapy如何找到我们寻找的确切数据的地方。正如你所想的那样,一个爬虫只针对一个特定网页。它可能不会在其他网站上工作。例如我们写的网站手机号码抓取

在ht_spider.py里,我们将定义一个类,HnSpider以及一些通用属性,例如name和urls。

首先,我们先建立HnSpider类以及一些属性(在类内部定义的变量,也被称为field)。我们将从scrapy的BaseSpider继承:

from scrapy.spider import BaseSpider
from scrapy.selector import Selectorclass HnSpider(BaseSpider):name = 'hn'allowed_domains = []start_urls = ['http://news.ycombinator.com']def parse(self, response):sel = Selector(response)sites = sel.xpath('//td[@class="title"]')for site in sites:title = site.xpath('a/text()').extract()link = site.xpath('a/@href').extract()print title, link

前面的几个变量是自解释的:name定义了爬虫的名字,allowed_domains列出了 供爬虫爬行的允许域名(allowed domain)的base-URL,start_urls 列出了爬虫从这里开始爬行的URL。后续的URL将从爬虫从start_urls下载的数据的URL开始。

接着,scrapy使用XPath选择器从网站获取数据--通过一个给定的XPath从HTML数据的特定部分进行选择。正如它们的文档所说,"XPath 是一种用于从XML选择节点的语言,它也可以被用于HTML"。你也可以阅读它们的文档了解更多关于XPath选择器的信息。


注意 在抓取你自己的站点并尝试计算 XPath 时, Chrome的 开发工具 提供了检查html元素的能力, 可以让你拷贝出任何你想要的元素的xpath. 它也提供了检测xpath的能力,只需要在javascript控制台中使用  $x, 例如 $x("//img"). 而在这个教程就不多深究这个了, Firefox 有一个插件, FirePath 同样也可以编辑,检查和生成XPath.

我们一般会基于一个定义好的Xpath来告诉 scrapy 到哪里去开始寻找数据. 让我们浏览我们的 Hacker News 站点,并右击选择”查看源代码“:

Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程
Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程

你会看到那个 sel.xpath('//td[@class="title"]')  有点貌似我们见过的HTML的代码. 从它们的 文档中你可以解读出构造XPath 并使用相对 XPath 的方法. 但本质上,  '//td[@class="title"]' 是在说: 所有的 <td> 元素中, 如果一个 <a class="title"></a> 被展现了出来,那就到  <td> 元素里面去寻找那个拥有一个被称作title的类型的<a>元素.

 

parse()方法使用了一个参数: response. 嘿,等一下 – 这个 self 是干什么的 – 看起来像是有两个参数!

每一个实体方法(在这种情况下, parse() 是一个实体方法 ) 接受一个对它自身的引用作为其第一个参数. 软盟网认为为了方便就叫做“self”.

response 参数是抓取器在像Hacker News发起一次请求之后所要返回的东西. 我们会用我们的XPaths转换那个响应.

现在我们将使用 BeautifulSoup 来进行转换. Beautiful Soup 将会转换任何你给它的东西 .

下载 BeautifulSoup 并在抓取器目录里面创建 soup.py 文件,将代码复制到其中.

在你的hn_spider.py文件里面引入beautifulSoup 和来自 items.py的 Hnitem,并且像下面这样修改转换方法.

from soup import BeautifulSoup as bs
from scrapy.http import Request
from scrapy.spider import BaseSpider
from hn.items import HnItemclass HnSpider(BaseSpider):name = 'hn'allowed_domains = []start_urls = ['http://news.ycombinator.com']def parse(self, response):if 'news.ycombinator.com' in response.url:soup = bs(response.body)items = [(x[0].text, x[0].get('href')) for x infilter(None, [x.findChildren() for x insoup.findAll('td', {'class': 'title'})])]for item in items:print itemhn_item = HnItem()hn_item['title'] = item[0]hn_item['link'] = item[1]try:yield Request(item[1], callback=self.parse)except ValueError:yield Request('http://news.ycombinator.com/' + item[1], callback=self.parse)yield hn_item

我们正在迭代这个items,并且给标题和链接赋上抓取来的数据.。之前我们写过网站访客手机号码抓取

现在就试试对Hacker News域名进行抓取,你会看到连接和标题被打印在你的控制台上.

scrapy crawl hn
2013-12-12 16:57:06+0530 [scrapy] INFO: Scrapy 0.20.2 started (bot: hn)
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Optional features available: ssl, http11, django
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Overridden settings: {'NEWSPIDER_MODULE': 'hn.spiders', 'SPIDER_MODULES': ['hn.spiders'], 'BOT_NAME': 'hn'}
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware
, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Enabled item pipelines:
2013-12-12 16:57:06+0530 [hn] INFO: Spider opened
2013-12-12 16:57:06+0530 [hn] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2013-12-12 16:57:06+0530 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2013-12-12 16:57:07+0530 [hn] DEBUG: Redirecting (301) to <GET https://news.ycombinator.com/> from <GET http://news.ycombinator.com>
2013-12-12 16:57:08+0530 [hn] DEBUG: Crawled (200) <GET https://news.ycombinator.com/> (referer: None)
(u'Caltech Announces Open Access Policy | Caltech', u'http://www.caltech.edu/content/caltech-announces-open-access-policy')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://shoujihao.gam7.com/','title': u'How I introduced a 27-year-old computer to the web'}
(u'Show HN: Bitcoin Pulse - Tracking Bitcoin Adoption', u'http://tp.gam7.com/')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 http://tp.gam7.com/>{'link': u'http://www.caltech.edu/content/caltech-announces-open-access-policy','title': u'Caltech Announces Open Access Policy | Caltech'}
(u'Coinbase Raises $25 Million From Andreessen Horowitz', u'http://blog.coinbase.com/post/69775463031/coinbase-raises-25-million-from-andreessen-horowitz')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://blog.coinbase.com/post/69775463031/coinbase-raises-25-million-from-andreessen-horowitz','title': u'Coinbase Raises $25 Million From Andreessen Horowitz'}
(u'Backpacker stripped of tech gear at Auckland Airport', u'http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&objectid=11171475')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&objectid=11171475','title': u'Backpacker stripped of tech gear at Auckland Airport'}
(u'How I introduced a 27-year-old computer to the web', u'http://www.keacher.com/1216/how-i-introduced-a-27-year-old-computer-to-the-web/')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://www.keacher.com/1216/how-i-introduced-a-27-year-old-computer-to-the-web/','title': u'How I introduced a 27-year-old computer to the web'}
(u'Show HN: Bitcoin Pulse - Tracking Bitcoin Adoption', u'http://www.bitcoinpulse.com')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://qk.gam7.com/','title': u'How I introduced a 27-year-old computer to the web'}
(u'Show HN: Bitcoin Pulse - Tracking Bitcoin Adoption', u'http://qk.gam7.com/')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 http://qk.gam7.com/>{'link': u'http://shoujihao.gam7.com/','title': u'How I introduced a 27-year-old computer to the web'}
(u'Show HN: Bitcoin Pulse - Tracking Bitcoin Adoption', u'http://shoujihao.gam7.com/')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 http://shoujihao.gam7.com/>{'link': u'http://www.bitcoinpulse.com','title': u'Show HN: Bitcoin Pulse - Tracking Bitcoin Adoption'}
(u'Why was this secret?', u'http://sivers.org/ws')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://sivers.org/ws', 'title': u'Why was this secret?'}
(u'PostgreSQL Exercises', u'http://pgexercises.com/'){'link': u'http://www.ruanally.com/','title': u'How I introduced a 27-year-old computer to the web'}
(u'Show HN: Bitcoin Pulse - Tracking Bitcoin Adoption', u'http://www.ruanally.com/')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 http://www.ruanally.com/>
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://pgexercises.com/', 'title': u'PostgreSQL Exercises'}
(u'What it feels like being an ipad on a stick on wheels', u'http://labs.spotify.com/2013/12/12/what-it-feels-like-being-an-ipad-on-a-stick-on-wheels/')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://labs.spotify.com/2013/12/12/what-it-feels-like-being-an-ipad-on-a-stick-on-wheels/','title': u'What it feels like being an ipad on a stick on wheels'}
(u'Prototype ergonomic mechanical keyboards', u'http://blog.fsck.com/2013/12/better-and-better-keyboards.html')
2013-12-12 16:57:08+0530 [hn] DEBUG: Scraped from <200 https://news.ycombinator.com/>{'link': u'http://blog.fsck.com/2013/12/better-and-better-keyboards.html','title': u'Prototype ergonomic mechanical keyboards'}
(u'H5N1', u'http://blog.samaltman.com/h5n1')
.............
.............
.............
2013-12-12 16:58:41+0530 [hn] INFO: Closing spider (finished)
2013-12-12 16:58:41+0530 [hn] INFO: Dumping Scrapy stats:{'downloader/exception_count': 2,'downloader/exception_type_count/twisted.internet.error.DNSLookupError': 2,'downloader/request_bytes': 22401,'downloader/request_count': 71,'downloader/request_method_count/GET': 71,'downloader/response_bytes': 1482842,'downloader/response_count': 69,'downloader/response_status_count/200': 61,'downloader/response_status_count/301': 4,'downloader/response_status_count/302': 3,'downloader/response_status_count/404': 1,'finish_reason': 'finished','finish_time': datetime.datetime(2013, 12, 12, 11, 28, 41, 289000),'item_scraped_count': 63,'log_count/DEBUG': 141,'log_count/INFO': 4,'request_depth_max': 2,'response_received_count': 62,'scheduler/dequeued': 71,'scheduler/dequeued/memory': 71,'scheduler/enqueued': 71,'scheduler/enqueued/memory': 71,'start_time': datetime.datetime(2013, 12, 12, 11, 27, 6, 843000)}
2013-12-12 16:58:41+0530 [hn] INFO: Spider closed (finished)

你将会在终端上看到大约400行的大量输出 ( 上面的输出之所以这么短,目的是为了方便观看 ).

你可以通过下面这个小命令将输出包装成JSON格式

$ scrapy crawl hn -o items.json -t json

现在我们已经基于正在找寻的项目实现了我们抓取器.

保存抓取到的数据

我们开始的步骤是创建一个保存我们抓取到的数据的数据库。打开 settings.py 并且像下面展现的代码一样定义数据库配置。

BOT_NAME = 'hn'SPIDER_MODULES = ['hn.spiders']
NEWSPIDER_MODULE = 'hn.spiders'DATABASE = {'drivername': 'xxx','username': 'yyy','password': 'zzz','database': 'vvv'}

再在 hn 目录下创建一个 mdels.py 文件。我们将要使用SQLAlchemy作为ORM框架建立数据库模型。

首先,我们需要定义一个直接连接到数据库的方法。为此,我们需要引入 SQLAlchemy 以及settings.py文件。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.engine.url import URLimport settingsDeclarativeBase = declarative_base()def db_connect():return create_engine(URL(**settings.DATABASE))def create_hn_table(engine):DeclarativeBase.metadata.create_all(engine)class Hn(DeclarativeBase):__tablename__ = "hn"id = Column(Integer, primary_key=True)title = Column('title', String(200))link = Column('link', String(200))

在开始下一步之前,我还想说明一下在 URL() 方法里两个星号的用法: **settings.DATABASE。首先,我们通过 settings.py 里的变量来访问数据库。这个 ** 实际上会取出所有在 DATABASE 路径下的值。URL 方法,一个在SQLAlchemy里定义的构造器,将会把key和value映射成一个SQLAlchemy能明白的URL来连接我们的数据库。

接着,URL() 方法将会解析其他元素,然后创建一个下面这样的将被 create_engine() 方法读取的URL。

'postgresql://xxx:yyy@zzz/vvv'

接下来,我们要为我们的ORM创建一个表。我们需要 从 SQLAlchemy 引入declarative_base()以便把我们为表结构定义的类映射到Postgres上,以及一个从表的元数据里创建我们所需要的表的方法,还有我们已经定义好的用于存储数据的表和列。

管道管理

我们已经建立了用来抓取和解析HTML的抓取器, 并且已经设置了保存这些数据的数据库 . 现在我们需要通过一个管道来将两者连接起来.

打开 pipelines.py 并引入 SQLAlchemy的 sessionmaker 功能,用来绑定数据库 (创建那个连接), 当然也要引入我们的模型.

from sqlalchemy.orm import sessionmaker
from models import Hn, db_connect, create_hn_tableclass HnPipeline(object):def __init__(self):engine = db_connect()create_hn_table(engine)self.Session = sessionmaker(bind=engine)def process_item(self, item, spider):session = self.Session()hn = Hn(**item)session.add(hn)session.commit()return item

我们在这里创建了一个类, HnPipeline(). 我们有一个构造器函数 def __init__(self) 来通过定义引擎初始化这个类, hn表格,还使用定义的这个引擎绑定/连接到数据库.

然后我们定义 _process_item() 来获取参数, _item_ 和 _spider_. 我们建立了一个同数据库的会话, 然后打开一个我们的Hn()模型中的数据项. 然后我们通过电泳session.add()来将 Hn 添加到我们的数据库中  – 在这一步, 它还没有被保存到数据库中 – 它仍然处于 SQLAlchemy 级别. 然后, 通过调用 session.commit(), 它就将被放入数据库中,过程也将会被提交 .

我们这里几乎还没有向 settings.py 中添加一个变量来告诉抓取器在处理数据时到哪里去找到我们的管道.

那就在 settings.py加入另外一个变量, ITEM_PIPELINES:

ITEM_PIPELINES = {'hn.pipelines.HnPipeline':300
}

这就是我们刚才所定义管道的目录/模块的路径.

现在我们就可以将所有抓取到的数据放到我们的数据库中, 让我们试试看我们获取到了什么,
再一次运行 crawl命令,并一直等到所有的处理过程完毕为止.

万岁!我们现在已经成功地把我们所抓取到的数据存入了数据库.

Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程
Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程

定时任务

如果我们不得不定期手动去执行这个脚本,那将会是很烦人的. 所有这里需要加入定时任务 .
定时任务将会在你指定的任何时间自动运行. 但是! 它只会在你的计算机处在运行状态时 (并不是在休眠或者关机的时候),并且特定于这段脚本需要是在和互联网处于联通状态时,才能运行. 为了不管你的计算机是出在何种状态都能运行这个定时任务, 你应该将 hn 代码 和bash 脚本,还有  cron 任务放在分开的将一直处在”运行“状态的服务器上伺服.

总结

这是有关抓取的最简短小巧的教程,而scrapy拥有提供高级功能和可用性的更多特性.

从 Github 下载整个源代码.

文章来源:https://www.oschina.net/translate/build-website-crawler-based-upon-scrapy

部分整理自:www.ruanbe.com

 

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

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

相关文章

快速排名系统询火星推荐_360网站快速排名系统 - 影响网站排名的外链因素

原出处&#xff1a;超级排名系统原文链接&#xff1a;http://www.chaojipaiming.com360网站快速排名系统注册地址 seo.chaojipaiming.com 网站关键词快速排名优化&#xff0c;7-15天关键词排名到首页&#xff0c;PC端和移动端都可以优化&#xff0c;支持百度、搜狗、360、神马等…

ogre在Linux下如何创建窗口,一步步搭建Ogre - 菜鸟学Ogre教程_Linux编程_Linux公社-Linux系统门户网站...

这次的教程是完全脱离了wiki的框架&#xff0c;白手起家搭建Ogre。Ogre的最基本的生命周期如下&#xff1a;1.创建根对象&#xff1b;2.定义Ogre将要用到的资源&#xff1b;3.选择并设置渲染引擎(指的是DirectX&#xff0c;OpenGL等等)&#xff1b;4.创建渲染窗口&#xff1b;5…

源代码泄露获取某电子商务网站服务器权限

源代码泄露获取某电子商务网站服务器权限 simeon 渗透本次目标事发偶然&#xff0c;通过shadon对“phpMyAdmin”关键字进行检索时&#xff0c;加入“index Of”关键字后&#xff0c;会出现所有存在列目录漏洞的网站&#xff0c;该网站为电子商务网站&#xff0c;网站保留有数万…

利用Mysql root帐号获取某Linux操作系统网站webshell

利用Mysql root帐号获取某Linux操作系统网站webshell simeon 获取Webshell&#xff0c;网上有很多文章&#xff0c;本文是phpMyAdmin漏洞利用与防范专题中的一个研究课题&#xff0c;其主要环境是在有Mysql数据库root帐号密码权限的基础下&#xff0c;如何通过技术手段获取Linu…

对某网站被挂黑广告源头分析

1.1对某网站被挂黑广告源头分析 任何的攻击都会留下痕迹,通过日志分析来发现漏洞,发现入侵的途径和路径,为漏洞分析和攻击溯源提供支持。在本案例中通过对日志文件的分析,成功获取后台地址,获取进入者的IP地址等信息。 1.1.1事件介绍 1.公司主站及其它站点被挂广告 某日晚…

对某入侵网站的一次快速处理

1.1对某入侵网站的一次快速处理 simeon 1.1.1入侵情况分析 凌晨1点,接到朋友的求助,网站被黑了,访问网站首页会自动定向到一个赌博网站,这个时间点都是该进入梦乡的时间,可是国家正在开会,这个时间点的事情都比较敏感,没有办法,直接开干吧。 1.查看首页代码 通过查看首…

4.公司网站被入侵——弱口令账号惹的祸

4.1公司网站被入侵——弱口令账号惹的祸 一些公司公司其内部网络跟web服务器直接相连,虽然在出口做了安全限制,仅仅允许80端口对外进行连接,但如果提供web服务的站点存在安全隐患,通过渗透,获取webshell,通过webshell提权,通过代理程序直接穿透内网,进而控制整个域控和…

网站服务器出现的链接错误,网站页面出现死链是哪些原因导致的?

网站死链大家都知道对于网站有较大的影响&#xff0c;一个站点存在着过多的死链是可能会导致网站降权&#xff0c;严重还会被K站&#xff0c;所以网站必须减少死链接情况出现。死链接是开始有效网站&#xff0c;过一段时间成为无效网站。到底哪些情况&#xff0c;导致死链接的出…

腾讯云服务器文件怎么恢复吗,实战腾讯云镜像备份恢复云服务器实例提取网站数据文件...

本来这个问题是准备今天操作的&#xff0c;但是担心今天要陪伴孩子出去玩&#xff0c;所以就在昨天晚上给客户搞定。这个网友的问题是服务器到期&#xff0c;然后找腾讯云客服备份镜像&#xff0c;但是他服务器已经到期删除&#xff0c;但是镜像好在还在的&#xff0c;所以我准…

python网站服务器面板,宝塔面板Python项目管理器部署flask

使用宝塔面板中的python项目管理器部署flask项目。最近想写一个工具箱的网站&#xff0c;之前使用的是PHP语言开发的&#xff0c;有一些功能是通过PHP无法实现的。在我的博客的第二个版本中就把开放平台功能模块关闭啦&#xff01;目前在使用flask框架在构建新的应用&#xff0…

PHP网站总是打印错误信息,PHP错误报告和错误信息设置详解_php

在php网站开发中&#xff0c;错误(Bugs)调试和解决是必不可少的部分&#xff0c;在网站调试阶段&#xff0c;错误信息能给我们很大帮助&#xff0c;当网站上线之后&#xff0c;我们是否也应该将原始的错误信息展示在用户面前呢&#xff1f;答案是否定的&#xff0c;为了提高用户…

Tomcat的下载及网站介绍初步测试

Tomcat下载地址 下载地址&#xff1a;https://tomcat.apache.org/ 下载完成后&#xff0c;解压压缩包&#xff1a; 文件夹信息 在bin目录下&#xff0c;startup.bat是运行tomcat、shutdown.bat是停止运行tomcat 测试tomcat 开启tomcat 双击startup.bat 会弹出&#xff1a…

怎么判断按摩店有服务_广州SEO外包服务推广哪里可以找到?怎么判断好不好?...

说到竞争压力大&#xff0c;网络营销一点都不会比线下轻&#xff0c;因为足不出户的消费习惯已成为了广大用户的习惯了。所以&#xff0c;随着移动互联网的迅速发展&#xff0c;企业需要使用有效的方法把自身的产品推广出去。而SEO推广是一种很不错的方法&#xff0c;因为它是一…

大规模网站架构的缓存机制和几何分形学

缓存机制在我们的实际研发工作中&#xff0c;被极其广泛地应用&#xff0c;通过这些缓存机制来提升系统交互的效率。简单的总结来说&#xff0c;就是在两个环节或者系统之间&#xff0c;会引入一个cache/buffer做为提升整体效率的角色。 而 有趣的是&#xff0c;这种缓存机制令…

分分钟在自己电脑上建一个视频网站,收费电影随便看,还没广告!

声明iker干货 本文仅作为技术文章&#xff0c;不鼓励不诱导用户观看盗版视频。第一步分分钟在自己电脑上建一个视频网站&#xff0c;收费电影随便看&#xff0c;还没广告&#xff01;第二步安装好软件后先切换环境&#xff0c;推荐使用 PHP 7.0.12 Apache&#xff0c;&#xf…

你需要但是找不到的网站,其实不太想分享,有你想要想收藏的

今天iker分享给大家几个平时十分需要的网站&#xff0c;如果对你有帮助麻烦点赞关注一下哦&#xff0c;谢谢了。1、Goimg.io这是一个图片压缩在线网站&#xff0c;当你在上传图片时可能会遇到图片文件太大的问题&#xff0c;这时这个网站就派上用场了。网站链接https://goimg.i…

6个在线制作海报的网站,一分钟搞定一张海报!

Fotojethttps://www.fotojet.com/cn/features/poster/FotoJet提供大量的富有设计感的海报模板&#xff0c;从音乐主题到时尚主题应有尽有。你可以选择喜欢的模板&#xff0c;再结合自己的想法&#xff0c;DIY完成你的海报。即使没有任何设计经验&#xff0c;你也可以设计出高水…

百度二级网页打不开_百度快照合理利用与网站网页制作的技巧

合理利用百度引擎进行网站宣传&#xff0c;这是网络时代企业网站发展的必要形式。目前百度搜索的排名&#xff0c;是宣传的核心与重点。而网站的整体布局&#xff0c;要追求有更好的宣传目的&#xff0c;就成为有效利用搜索引擎&#xff0c;提高网站流量的方法。当然让客户可能…

手机网站开发(WAP网站)第一篇

现在的互联网&#xff0c;可以说是名副其实的移动互联网。大家不仅可以利用无线网卡随处随地上网&#xff0c;还可以直接利用手机浏览网页、下载文件&#xff0c;而且现在的无线运营商也正在大力发展无线网络、扩展手机上网带宽。 于是&#xff0c;手机网页的制作需求也变多…

建材安装php源码,PHP响应式瓷砖大理石建材企业网站整站源码(自适应手机移动端) dedecms内核...

【温馨提示】源码包解压密码&#xff1a;www.youhutong.com资源描述PHP响应式瓷砖大理石建材企业网站整站源码(自适应手机移动端) dedecms内核源码介绍&#xff1a;采用织梦最新内核开发的模板&#xff0c;该模板企业通用、瓷砖、大理石、建材类企业都可使用。响应式自适应各种…