python scrapy 爬取学习问答网站

news/2024/5/16 4:00:42/文章来源:https://blog.csdn.net/qq_43681115/article/details/104857974

废话不多说,直接入正题。

关于模拟登录,另一篇再讲解(这篇写太多了) 我们先来分析好页面。

首先打开知乎,点击进入首页的随便一个问答可以看到url是这样的👇

在这里插入图片描述
观察url可以发现question有一个id,answer也同样有
在这里插入图片描述

退出来随便再点一个问答,验证我们的想法

答案显而易见

但一篇问答,总不会只有一个答案answer是吧,一个问题有很多答案,那么这个url显示的answer_id是什么呢?我们猜想可能是看到的第一个回答(应该没错是高赞,但其实不是)如何来验证我们的想法,同样的进行检查。
在这里插入图片描述

可以看到一个itemID。和上面url所显示的answer_id是一样的。

证实了answer_id;另外可以看到第二个回答,也有一个itemID。
在这里插入图片描述

设想一下如果他的赞超过了前者,那么url是否会变化?正当我试着去寻找两个赞差距不大(主要是第一名第二名)的回答的时候,发现了一个不一样的结果,其实并不是单独地赞高就会把你放在第一设为answer_id,看下方两张图👇,哪个才是最终赢家呢?事实上,是后者
在这里插入图片描述

赞多,并不一定排第一。 那难道是评论多优先?那再仔细地去寻找几篇,会发现这样的情况:第二(评论少)第三(评论多)。 那么猜想一下是否是一个公式来计算热度呢? 好了点到为止,感兴趣的可以百度搜一下。 (应该是有的,我也还没百度)

以上都是“检查”时发现的一些东西。前面主要是讲answer_id的由来。接下来是主要的。我们点击查看全部回答;并且可以发现每一个问答,初始都一定会有3个回答。可自行查看,关于这个问题后面会讲到。

在这里插入图片描述

点击后,结果是这样的:
在这里插入图片描述

并且如果你够细心那么你会发现url变化了(其实我也是后面才发现)

在这里插入图片描述

往下翻能看到全部的答案 但是答案并不是直接静态就显示出来的而是随着你页面的下滑,可以看到左下角的数据是一直在变化的。

在这里插入图片描述

如果想直接这样爬是不方便的。我们可以看到之前点击“查看全部”可以看到有新的请求。Filter过滤一下,输入一些关键字(如answer、answer_id)查看请求的Response。可以看到如下👇

此图像的alt属性为空
我们看到了api接口,还有question_id,offset=3(可以和之前讲的只有三个回答对应了),limit=5,几个关键的数据,点击response,可以清晰地看到数据。

在这里插入图片描述

双击跳转页面。装一个JSONview插件,更好的查看json数据。这里我先把data合并了,我们先分析下方的paging。

此图像的alt属性为空;文件名为image-47-1024x348.png

拖到next及previous最后面,可以看到

此图像的alt属性为空;文件名为image-48.png

3-5=-2->0最小为0,我们修改url offset=0,那么当然 is_start:true;那么同理,offset>=319(因为从0开始的,最后一个是318)时,那么is_end一定也为true.

此图像的alt属性为空;文件名为image-50.png

接下来我们看limit=5这一项,我们查看data,下面有5个项。关于数据我们后面再进行分析。
在这里插入图片描述

这里修改limit=10,那么就会data下面的项肯定会变化。这里就自行去尝试了。

接下来分析数据,下面是关于question的一些摘要,这个接口并没有把question的所有内容搞下来,不然后面对于问题的爬取将变得十分简单。

lt属性为空;文件名为image-51.png

回答者的信息

此图像的alt属性为空;文件名为image-53.png

此图像的alt属性为空;文件名为image-55.png

最后就是回答者的content了,这里不贴图了,这个人回答太多了😂。

关于answer的分析就到这里。接下来就是关于question的问题。question就相对于更简单了。

------------------------分割线------------------------

下面来分析问答的 “问” ,其实也就这些东西

在这里插入图片描述

所属专栏,标题,question_id, 还有它的描述内容(有些是为空)、还有评论数、关注者、被浏览数。这里看不到创建时间和更新时间,前面在分析answer的时候我们看到了。这里看你心情,想爬就爬,因为具体看不懂这个时间,只知道这个数字大小,小的更前,所以其实前面answer的time其实也可以没有爬取的必要。

在这里插入图片描述

我们检查一下这些元素,首先是title

此图像的alt属性为空;文件名为image-58-1024x187.png

上下箭头,可以看到 “1 of 2” 的 “ 1 ”是在👇

此图像的alt属性为空;文件名为image-59.png

刷新一下,正常情况是没有的。
在这里插入图片描述

那么什么时候有呢,当你的鼠标滚轮下滑时,就可以看到出现了这个标题。上滑就会消失。如下图。

此图像的alt属性为空;文件名为image-61-1024x322.png

好的其实管他无所谓是不是唯一,能取得出来标题就行。放入xpath_helper

此图像的alt属性为空;文件名为image-62-1024x98.png

出现两个值,但其实真正在爬取时,只有一个值。我们来看看scrapy shell 记得加上 -s USER_AGENT模拟浏览器登录,不然会被反爬。后面写代码也是必带的。

此图像的alt属性为空;文件名为image-63-1024x80.png

内容呢如下,关于显示全部,后面的内容如何提取呢?
在这里插入图片描述

其实一样的scrapy shell调试可以看到 是直接就能全部抓取到的。
在这里插入图片描述
而最开始我通过检查页面并不能获取到全部。可以看到多了一些内容。
在这里插入图片描述

除此之外,关键是在 // ,之前写我只写了一根斜线,返回一直为空列表。然后我就一直百度,最后没解决换成了css就好了 ,结果时自己太憨了。 因为不是直接在div的下一个子结点上,所以需要注意!!!
此图像的alt属性为空;文件名为image-64-1024x98.png

此图像的alt属性为空;文件名为image-65-1024x72.png

最后一个需要注意的是 关注者与被浏览数(其他的可以自己试试)

此图像的alt属性为空;文件名为image-66-1024x94.png
关注者

此图像的alt属性为空;文件名为image-67-1024x82.png
被浏览数

这两个是一样的~ 会爬到五个数据(具体五个可以自行尝试,按下箭头,其实另外三个就是第一个answer的作者相关信息),但在实际中其实只爬取的到两个 。

此图像的alt属性为空;文件名为image-68-1024x102.png

同样的看scrapy shell,无论是css还是xpath只爬取到两个数据。

此图像的alt属性为空;文件名为image-69-1024x151.png

好,问题的“问”也解决了

关于验证码识别,模拟登录在另一篇补全了。

接下来直接上🐎(架 架 架~~~) 关于模拟登录在另一篇进行更新

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">
import jsonimport scrapy
import re
from selenium import webdriver
import pickle
from urllib import parse
from scrapy.loader import ItemLoader
from douban.items import ZhihuAnswerItem,ZhihuQuestionItem
import datetimefrom mouse import move,clickimport timefrom selenium.webdriver.common.keys import Keysclass ZhihuSpider(scrapy.Spider):name = 'zhihu'allowed_domains = ['www.zhihu.com']start_urls = ['https://www.zhihu.com/']#这里是构造api接口的url放在了开头start_answer_url="https://www.zhihu.com/api/v4/questions/{0}/answers?include=data%5B*%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%2Cis_recognized%2Cpaid_info%2Cpaid_info_content%3Bdata%5B*%5D.mark_infos%5B*%5D.url%3Bdata%5B*%5D.author.follower_count%2Cbadge%5B*%5D.topics&amp;offset={1}&amp;limit={2}&amp;sort_by=default&amp;platform=desktop"headers = {# "HOST": "www.zhihu.com",# "Referer": "https://www.zhizhu.com",#User-Agent必不可少'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}def parse(self, response):#xpath检测知乎标题 取出所有a标签的href_urlall_urls = response.xpath("//a/@href").extract()#接下来遍历list类型的all_urls#![在这里插入图片描述](https://img-blog.csdnimg.cn/20200315181224106.png)#因为如上图,这里用parse的方法将两个url组合起来,scrapy里常用 all_urls = [parse.urljoin(response.url, url) for url in all_urls]for url in all_urls:# print(url)#正则匹配 我们只需要匹配不带answer_id的url,前文分析过了,相当于是显示全部答案。match_obj=re.match("(.*zhihu.com/question/(\d+)).*",url)if match_obj:request_url=match_obj.group(1)# scrapy的经典用法callback,也非常常用yield scrapy.Request(request_url,headers=self.headers,callback=self.parse_question)# break#这里,如果不匹配,则继续进一步跟着url,寻找匹配的url(深度处理的思想)else:yield scrapy.Request(url,headers=self.headers,callback=self.parse)# print(request_url,question_id)#问答的问的解析,这里用的css比xpath更简洁。(两者都需要会)def parse_question(self,response):match_obj = re.match("(.*zhihu.com/question/(\d+)).*", response.url)if match_obj:question_id = int(match_obj.group(2))item_loader=ItemLoader(item=ZhihuQuestionItem(),response=response)#print(response)#标题item_loader.add_css("title", 'h1.QuestionHeader-title::text')#内容item_loader.add_css('content', '.QuestionHeader-detail')#直接add_value赋值item_loader.add_value('url', response.url)#同样也是item_loader.add_value('zhihu_id', question_id)#记得spanitem_loader.add_css('answer_num', '.List-headerText span::text')#记得buttonitem_loader.add_css('comments_num', '.QuestionHeader-Comment button::text')#所属专栏item_loader.add_css('topics', '.QuestionHeader-topics .Popover div::text')#关注者,及浏览数,不用写两个,因为是列表,取[0][1]就可以了item_loader.add_css('watch_user_num', '.NumberBoard-itemValue::text')question_item = item_loader.load_item()#这里格式化之前的api接口urlyield scrapy.Request(self.start_answer_url.format(question_id, 0, 20), headers=self.headers, callback=self.parse_answer)yield question_item#问答的答解析def parse_answer(self,response):# json格式处理将字符串变成字典 详情百度ans_json = json.loads(response.text)#一步一步地取细心一点,还是很简单的is_end = ans_json["paging"]["is_end"]next_url = ans_json["paging"]["next"]totals_num=ans_json["paging"]["totals"]#遍历["data"],提取具体字段, 可对照查看具体json数据for answer in ans_json["data"]:answer_item = ZhihuAnswerItem()answer_item["zhihu_id"] = answer["id"]answer_item["url"] = answer["url"]answer_item["question_id"] = answer["question"]["id"]answer_item["author_id"] = answer["author"]["id"] if "id" in answer["author"] else Noneanswer_item["content"] = answer["content"] if "content" in answer else Noneanswer_item["praise_num"] = answer["voteup_count"]answer_item["comments_num"] = answer["comment_count"]answer_item["create_time"] = answer["created_time"]answer_item["update_time"] = answer["updated_time"]answer_item["crawl_time"] = datetime.datetime.now()yield answer_item#这里是如果没有结束,则继续调用answer爬取。if not is_end:yield scrapy.Request(next_url,headers=self.headers,callback=self.parse_answer)#这里是调用事先准备好的cookie#这里自己改一下自己的参数就行了,可以百度到def start_requests(self):cookies=pickle.load(open("D:/Pythonstudy/douban/douban/spiders/cookies/zhihu_cookies","rb"))#cookie存放位置cookie_dict = {}for cookie in cookies:cookie_dict[cookie['name']] = cookie['value']return [scrapy.Request(url=self.start_urls[0], dont_filter=True, cookies=cookie_dict)]<strong>#这里start_urls是列表记得[0]

items.py

<!-- wp:preformatted -->
<pre class="wp-block-preformatted"> import re
import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst,MapCompose
import datetime
from douban.settings import SQL_DATE_FORMAT,SQL_DATETIME_FORMATclass DoubanItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()passclass doubanItemLoader(ItemLoader):default_output_processor = TakeFirst()def RemoveFormatter(value):#去除如\n \xa0 \u3000等格式符Need_remove="".join(value.split())return Need_remove
def date_convert(value):#date转换try:Time =datetime.datetime.strptime(value, "%Y").date()except Exception as e:Time = datetime.datetime.now().date()return Timedef get_nums(value):#正则取数字rex_str = ".*?(\d+).*"match_obj = re.match(rex_str, value)if match_obj:value = match_obj.group(1)return valuedef get_time(value):rex_str = ".*?(\d+).*"match_obj = re.match(rex_str, value)if match_obj:value = match_obj.group(1)return value
def Remove_nums(value):rex_str = "\d+/(.*)"match_obj = re.match(rex_str, value)if match_obj:value=match_obj.group(1)return valuedef return_value(value):return valuedef get_Madein(value):value=list(value)# result = ""# for i in range(89, 91):#     result += value[i]# return resultreturn str(value[89] + value[90])# def get_lauguage(value):
#     lau=value[0]
#     return lau
def add_Num(value):return "No."+valueclass ZhihuQuestionItem(scrapy.Item):zhihu_id=scrapy.Field()topics=scrapy.Field()url=scrapy.Field()title=scrapy.Field()content=scrapy.Field()answer_num=scrapy.Field()comments_num=scrapy.Field()watch_user_num=scrapy.Field()click_num=scrapy.Field()crawl_time=scrapy.Field()def get_insert_sql(self):#因为爬取可能会造成数据重复,所以采用更新的手段,防止报错insert_sql="""insert into zhihu_question(zhihu_id,topics,url,title,content,answer_num,comments_num,watch_user_num,click_num,crawl_time)VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)<strong>ON DUPLICATE KEY UPDATE content=VALUES(content), answer_num=VALUES(answer_num), comments_num=VALUES(comments_num),watch_user_num=VALUES(watch_user_num), click_num=VALUES(click_num)</strong>"""zhihu_id=self["zhihu_id"][0]topics=",".join(self["topics"])url=self["url"][0]title="".join(self["title"])content="".join(self["content"])answer_num=get_nums("".join(self["answer_num"]).replace(",", ""))comments_num=get_nums("".join(self["comments_num"]))#有坑,这里因为假如数字是1,351,那么直接int会什么都没有,所以需要replace去掉",",这里当时确实坑到我了watch_user_num =int(self["watch_user_num"][0].replace(",", ""))click_num = int(self["watch_user_num"][1].replace(",", ""))# SQL_DATETIME_FORMAT= 这个可以在setting里设置,因为经常用#爬取时间,取now()就行了crawl_time=datetime.datetime.now().strftime(SQL_DATETIME_FORMAT)params = (zhihu_id, topics, url, title, content, answer_num, comments_num,watch_user_num, click_num, crawl_time)return insert_sql, params #记得返回class ZhihuAnswerItem(scrapy.Item):zhihu_id=scrapy.Field()url=scrapy.Field()question_id=scrapy.Field()author_id=scrapy.Field()content=scrapy.Field()praise_num=scrapy.Field()comments_num=scrapy.Field()create_time=scrapy.Field()update_time=scrapy.Field()crawl_time=scrapy.Field()def get_insert_sql(self):insert_sql = """insert into zhihu_answer(zhihu_id,url,question_id,author_id,content,praise_num,comments_num,create_time,update_time,crawl_time) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)<strong>ON DUPLICATE KEY UPDATE content=VALUES(content), comments_num=VALUES(comments_num), praise_num=VALUES(praise_num),update_time=VALUES(update_time)</strong>"""**#将int_time变成datetime**create_time=datetime.datetime.<strong>fromtimestamp</strong>(self["create_time"]).strftime(SQL_DATETIME_FORMAT)update_time=datetime.datetime.<strong>fromtimestamp</strong>(self["update_time"]).strftime(SQL_DATETIME_FORMAT)params = (self["zhihu_id"], self["url"], self["question_id"],self["author_id"], self["content"], self["praise_num"],self["comments_num"], create_time, update_time,self["crawl_time"].strftime(SQL_DATETIME_FORMAT),)return insert_sql, params<strong> ##记得返回

pipelines.py

class MysqlTwistedPipeline(object):def __init__(self,dbpool):self.dbpool=dbpool#异步@classmethoddef from_settings(cls,settings):dbparms=dict(host=settings['MYSQL_HOST'],db=settings['MYSQL_DBNAME'],user=settings['MYSQL_USER'],passwd=settings['MYSQL_PASSWD'],charset='utf8',cursorclass=MySQLdb.cursors.DictCursor,use_unicode=True,)dbpool=adbapi.ConnectionPool("MySQLdb",**dbparms)return cls(dbpool)def process_item(self, item, spider):#使用Twisted将mysql插入变成异步执行query=self.dbpool.runInteraction(self.do_insert,item)query.addErrback(self.handle_error,item,spider) #处理异常def handle_error(self,failure,item,spider):#处理异步插入异常print(failure)def do_insert(self,cursor,item):#执行具体的插入# insert_sql = """#             insert into duwenzhang(title,create_time,url,url_object_id,belong,article_plot)#             VALUES (%s,%s,%s,%s,%s,%s)#         """# cursor.execute(insert_sql, (# item["title"], item["create_time"], item["url"], item["url_obj_id"], item["belong"], item["article_plot"]))insert_sql,params=item.get_insert_sql()cursor.execute(insert_sql,params)

settings.py加上

#格式化
SQL_DATETIME_FORMAT="%Y-%m-%d %H:%M:%S"
SQL_DATE_FORMAT="%Y-%m-%d"#MYSQL参数
MYSQL_HOST = "localhost"
MYSQL_DBNAME = "zhihu"
MYSQL_USER = "root"
MYSQL_PASSWD = "root"#设置为true
COOKIES_ENABLED = True#取消注释
DOWNLOADER_MIDDLEWARES = {# 'douban.middlewares.DoubanDownloaderMiddleware': 543,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':2}
#加上user_agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'

在这里插入图片描述
在这里插入图片描述
----后记-----
content标签给整忘去了~这样就可以了
在这里插入图片描述

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

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

相关文章

分享几个免费书籍的网站

最近的博客更新有些迟钝&#xff0c;原因是在学前端设计的时候&#xff0c;发现Javascript 和 PHP 不是很融洽&#xff01; PHP 是后台&#xff0c;是一种 “穿插” 式语言&#xff1b;对学过其他程式语言人而言&#xff0c;只要了解怎么做输出就可以解决一大半的学习时间。 但…

新版Kali-2020版本介绍及image镜像网站

今天在安装新版的kali发现&#xff0c;现在的2020版本和之前的版本有些不一样。 首先&#xff0c;附上两个链接一个是网易的image镜像&#xff0c;一个是论坛 之前的阿里也有image镜像&#xff0c;现在他们改版了&#xff0c;我觉得不是很好用&#xff0c;刚好又找到网易的&…

bootstrap-自适应企业网站demo(一)

1.获取bootstrap文件 英文官网&#xff1a;http://getboostrap.com 中文官网&#xff1a;http://www.bootcss.xom 2.开发工具 开发工具选择WebStorm 3.创建基础文件 在WebStorm创建一个空的项目。 将下载的bootstrap文件解压&#xff0c;将文件夹下的css、fronts、js文件夹拷…

鼠标事件 onmouseover、onmouseenter、onmouseleave和onmouseout

触发时机&#xff1a; onmouseout&#xff1a;鼠标滑出 onmouseover&#xff1a;鼠标滑过&#xff08;在表面经过即可&#xff09; onmouseenter&#xff1a;鼠标进入&#xff08;进入到里面&#xff09; onmouseleave&#xff1a;鼠标离开 onmouseover 和 onmouseenter 的区…

黑客攻防技巧:2分钟入侵网站全程实录(组图)

说起流光、溯雪、乱刀&#xff0c;可以说是大名鼎鼎无人不知无人不晓&#xff0c;这些都是小榕哥的作品。每次一提起小榕哥来&#xff0c;我的崇拜景仰就如滔滔江水&#xff0c;连绵不绝 ~~~~(又来了!) 让我们崇拜的小榕哥最新又发布了SQL注入 工具 &#xff0c;这回喜欢利用S…

SQL Server 2005全文检索技术在网站上的应用实录

SQL Server 2005全文检索技术在网站上的应用实录(1) 一、前言 “人类失去搜索&#xff0c;世界将会怎样?”&#xff0c;同样&#xff0c;很难想象一个拥有极大信息量的行业网站门户没有站内全文搜索将会出现怎样的局面&#xff0c;网站全文检索对于挖掘网站信息和整合网站资源…

部署创作的网站元素自定义项

http://technet.microsoft.com/zh-cn/library/cc262041.aspx 更新&#xff1a; 2008-01-17 本文内容&#xff1a; 使用内容部署功能部署内容 使用内容部署包部署内容 使用解决方案包部署内容 本文提供有关使用 Microsoft Office SharePoint Server 2007 部署创作的网站元素…

部署开发的网站元素自定义项

http://technet.microsoft.com/zh-cn/library/cc262995.aspx 更新&#xff1a; 2008-01-17 本文内容&#xff1a; 使用解决方案包部署开发的网站元素 使用功能部署开发的网站元素 本文提供有关使用 Microsoft Office SharePoint Server 2007 部署开发的网站元素自定义项的指…

【软创实验室大作业】学习小组网站

Java部分 封装一个数据结构&#xff0c;这里我选择了双向循环链表&#xff0c;也叫双链表。先简单介绍一下&#xff0c;双向循环链表的每个数据节点都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表的任意一个节点开始&#xff0c;都可以很方…

chatgpt赋能python:Python与SEO的奇妙关系

Python与SEO的奇妙关系 SEO(Search Engine Optimization)&#xff0c;中文翻译为搜索引擎优化&#xff0c;是指通过对网站进行各种技术和内容方面的优化&#xff0c;来提升网站在搜索引擎自然排名中的位置&#xff0c;进而吸引更多的潜在客户。而Python语言&#xff0c;则成为…

chatgpt赋能python:Python一直运行的SEO文章

Python一直运行的SEO文章 介绍 Python是一种高级编程语言&#xff0c;已经流行了近三十年。它拥有简单易读的语法和强大的功能&#xff0c;可以运行在Windows、Linux和MacOS等多个平台上。Python已经成为了Web开发、数据科学、人工智能和网络安全领域的首选语言。 在SEO领域…

chatgpt赋能python:Python开发在SEO的应用

Python 开发在 SEO 的应用 介绍 Python 是一种高级、可解释性、面向对象的编程语言&#xff0c;它具有可扩展性和良好的表示能力。Python 是一种广泛应用于网络开发、科学计算、人工智能、数据分析等领域的语言。Python 已经成为许多 SEO 网站的首选开发语言&#xff0c;因为…

学成在线网站知识分享

学成在线网站知识分享 学成在线网站是一个比较基础的网页布局&#xff0c;让刚刚学习前端的人通过使用工具测量大小&#xff0c;裁剪图片&#xff0c;使用盒子定位布局&#xff0c;利用浮动放置浮动盒子等各种知识点都会使用到。各大教学网站也会使用这个案例来教学基础的布局…

摄影图片分享网站制作

摄影图片分享网站制作 目录 前言 一、首页的制作 二、风景篇和美食篇 三、人物篇和联系我们篇 总结 前言 上一次分享了学成在线网站的制作知识分析&#xff0c;这一次我来分享我制作摄影图片分享网站的制作了。这一次的网页制作需要用到新的东西&#xff0c;让我们一起来看…

Java学习网站推荐

学习Java不仅依靠自身的努力,还要多看一些相关技术文档,那么必不可少的就是学习Java的网站,本人整理收集一些Java学习网站,这些网站可以提供一些最新Java的资料,有时定期开设讲座等线下活动,而且里面的一些Java相关的问题以及讨论,不仅适用于Java小白程序员,而且还适用…

java在线电影网站

Java在线电影网站 项目简介 这次分享一个电影网站&#xff0c;基于JspServletC3p0mysql&#xff0c;难度适中。网站内视频均是跳转到相应的平台播放&#xff08;如腾讯视频、爱奇艺、优酷等&#xff09;&#xff0c;后台管理员可观察在线人数&#xff0c;并添加新的视频&…

Vue入门——我的第一个vue网站

今天我们来谈一谈Vue的相关事宜。 环境的搭建&#xff0c;网上教程很多&#xff0c;而且也很方便&#xff0c;我就不细说了。 然后我们新建一个文件夹作为它的工作环境——workspace。之后控制台进入到这个文件夹里面&#xff0c;然后执行下面代码来创建我的第一个项目。 vu…

预编译解决vue-cli 4.0项目的seo问题

预编译解决vue-cli 4.0项目的seo问题# vue项目上线之后要求解决一下seo问题&#xff0c;现在总结一下 希望能帮到各位 ps&#xff1a;其实网上已经有很多的解释了 我这边就不多做介绍 贴一下vue-cli和依赖的版本 1&#xff0c;需要用到我们的prerender-spa-plugin 和 vue-meta…

前端学习demo网站

https://www.layui.com/demo/progress.html http://semantic-ui.com/

从 0 学习 Go 语言 - 3 个入门学习网站

阅读本文大概需要 3 分钟。 前几天上网找了一些 Go 语言的学习资料&#xff0c;最后筛选了 3 个&#xff0c;今天整理分享给大家。 1、Go 官网 龙哥我在学习一门新技术时候&#xff0c;首先去的就是它的官网&#xff0c;看它的官方原汁原味的英文文档。 这样的好处是可以锻炼…