爬虫学习心得

爬虫学习心得

  • 下面给新学者分享一些爬虫的技巧
    • 1 xpath的学习
      • a xpath的基本用法
      • b xpath案例
    • 2.正则表达式学习
      • a 基本使用
      • b 12306提取省份成json格式
    • 3.Bs的学习
      • 3.1基础
      • 3.3基础案例
      • 3.5基本案例
    • 4.拿取数据技巧
      • 4.1通过标签获取
      • 4.2通过lamda表达式获取数据

下面给新学者分享一些爬虫的技巧

1 xpath的学习

	xpath为用的最广,也是最好用的,不过比较吃性能。

a xpath的基本用法

from lxml import etree
from lxml import html
etree=html. etree
#需要加载准备解析的数据
f=open("test.html",modle="r",encoding='utf-8')
pageSource = f.read()
#加载数据,返回element对象
et=etree.HTML(pageSource)
#xpath的语法
result =et.xpath('/html')#/html表示根节
result = et.xpath('/html/body')#表达式中间的/表示一层html节点
result= et.xpath('/html/body/span')
result =et.xpath('/html/body/span/text()')#获取span中的文字
#text()表示提取标签中的文本信息
result = et.xpath('/html/body/*/l/a/text()')
#*任意的.通配符
result =et.xpath('/htmi/body/*/li/a/@href')#@表示属性
result =et.xpath("//li/a/@href")#/表示任意位置
result=et.xpath('/div[@class=job]/text()') #[@xx=xxxx]属性的限定
print(result)
#带循环的
result= et.xpath('/html/body/ul/li')
for item in result:
    href= item.xpath("./a/@href")[0]#./表示当前这个元素
    text =item.xpath("./a/text()")[0]#./表示当前这个元素
    print(text, href)

b xpath案例

import requests
import re
import os
import json
from lxml import etree
from lxml import etree
url = "xxx"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
try:
    response = requests.get(url=url,headers=headers)
    # 设置编码为和父类一样
    response.encoding =response.apparent_encoding
    print(response.text)
    et = etree.HTML(response.text)
    #xpath匹配
    results = et.xpath(f'//*[@id="J-lemma-main-wrapper"]/div[2]/div/div[1]/div/*/*/*/dd/span/text()')
    print(results)
except:
    print("errrro")

2.正则表达式学习

a 基本使用

import re
result=re.search(r'\d+','今天我有100块,买了两个蛋糕')#返回match对象
print(result.group())

result=re.finditer(r'\d+','今天我有100块,买了两个蛋糕')#返回的是迭代器
print(result)
for item in result:
    print(item.group())
#预加载
obj=re.compile(r'\d+')
result=obj.findall('今天我有100块,买了两个蛋糕')
print(result)

match="divorce 分歧;diverse 各色各样;diversify 使多样化;divert 转入;divest 脱去;divorce 分开; divulge 泄露"
pattern=".*?&nbsp(.*?);"
match_1=re.search(pattern,match)
print(match_1.group())

b 12306提取省份成json格式

import requests
import re
url = "https://kyfw.12306.cn/otn/resources/js/framework/favorite_name.js"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
response = requests.get(url=url,headers=headers)
response.encoding =response.apparent_encoding
parr = re.compile(r"@.*?\|(.*?)\|(.*?)\|")
images = re.findall(parr,response.text)
len1=len(images)
print(response.text)
data={}
json_file = open('data.json', 'w+', encoding='UTF-8',newline='')
json_file.write("{")
json_file.write('\n')
for image in images:
    # print(image[0],end='')
    # print(image[1])
    name=image[0]
    id=image[1]
    json_file.write(f"\"{name}\":\"{id}\"")
    if name!=images[len1-1][0]:
        json_file.write(",")
    json_file.write("\n")
json_file.write('\n')
json_file.write("}")

3.Bs的学习

3.1基础

from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen('xxx.html')
bs=BeautifulSoup(html, 'html.parser')
# data=bs.select('li a[href="news/index.html"]')
# data=bs.select('title')
# print(data)
#1.通过标签名查找
data=bs.select('title')[0].get_text()
print('通过标签名查找:'+data)
print('----------'*30)
#2.通过类名查找
data1=bs.select('.infoPath a')[0].get_text()
print('通过类名查找:'+data1)
print('----------'*30)
#3.通过id名查找
data2=bs.select('#header_login_user a')[0].get_text()
print('通过id名查找:'+data2)
print('----------'*30)
#4.组合查找
data3=bs.select('.readAreaBox.content h1')[0].get_text()
print('通过组合查找查找:'+data3)
print('----------'*30)
#5.属性查找
data3=bs.select('div a[href="/man"]')[0].get_text()
print('通过属性查找查找:'+data3)

###3.2基础案例

import requests
from bs4 import BeautifulSoup
class Content:
    def __init__(self, url, title, body):
        self.url = url
        self.title = title
        self.body = body
def getPage(url):
        html = requests.get(url)
        return BeautifulSoup(html.content, 'html.parser')
def scrapeNew(url):#小说
    bs =getPage(url)
    title = bs.find('h1').text
    body = bs.select('#readArea > div.readAreaBox.content > div.p')[0].text
    return Content(url, title, body)
def scrapeNew1(url):#故事大全
    bs=getPage(url)
    title = bs.find('h1').text
    # print(title)
    # body=bs.select('#newsnr p')
    body=bs.find('div',class_='article_content').text
    # body=''.join(body)
    return Content(url,title,body)

def scrapeNew2(url):#新浪新闻
    bs=getPage(url)
    title = bs.find('h1').text
    print(title)
    body=bs.find('div',class_='article').text
    return Content(url,title,body)
url= 'xxxx'

content = scrapeNew(url)
print('Title:{}'.format(content.title))
print('URL:{}'.format(content.url))
print('body:{}'.format(content.body))
print("-" * 130)
url='xxxx'

content=scrapeNew1(url)
print('Title:{}'.format(content.title))
print('URL:{}' .format(content.url))
print('body:{}'.format(content.body))
print("-" * 130)
url='xxxx'

content=scrapeNew2(url)
print('Title:{}'.format(content.title))
print('URL:{}' .format(content.url))
print('body:{}'.format(content.body))

3.3基础案例

import requests
from bs4 import BeautifulSoup
class Content:
    def __init__(self, topic, url, title, body):
        self.topic=topic
        self.url=url
        self.title=title
        self.body=body
    def print(self):
        print("找到的相关关键字的文章:{}".format(self.topic))
        print("网站:{}".format (self.url))
        print("标题:{}".format (self.title))
        print("内容:{}".format (self.body))
class Website:
    def __init__(self, name, url, searchUrl, resultListing, resultUrl, absoluteUrl, titleTag, bodyTag):
        self.name=name#网站名
        self.urL=url#网站网址
        self.searchUrl=searchUrl#关键词的总界面
        self.resultListing=resultListing#存放每个信息的盒子,即每个结果链接的上层标签,例如di
        self.resultUrl=resultUrl#更细致的定位准确的URL,如div.result h3 a
        self.absoluteUrl=absoluteUrl#一个布尔值,判断绝对相对链接
        self.titleTag=titleTag#具体链接文章的标题标签
        self.bodyTag=bodyTag
headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61"
        }
class Crawler:
    def getPage (self, url):
        # print('测试'+url)
        try:
            req=requests.get (url,headers=headers)
        except requests.exceptions.RequestException:
            return None
        return BeautifulSoup(req.content,'html.parser')
    def safeGet (self, pageObj, selector):
        childObj=pageObj.select(selector)
        if len(childObj) > 0:
            return childObj[0].get_text()
        return ""
    def search(self, topic, site):
        bs=self.getPage(site.searchUrl+topic+'&type=web')
        # print(bs)
        searchResults=bs.select(site.resultListing)
        # print(searchResults)
        for result in searchResults:
            # print(result)
            url=result.select(site.resultUrl)[0].attrs['lanmu1']
            print(url)
            if (site.absoluteUrl):
                bs=self.getPage(url)
            else:
                bs=self.getPage(site.url+url)
            if bs is None:
                print("网页有错")
                return
            title=self.safeGet(bs,site.titleTag)
            # print(title)
            body=self.safeGet(bs,site.bodyTag)
            if title !="" and body !="":
                content=Content(topic,url,title,body)
                content.print()
# #news_list > table:nth-child(5) > tbody > tr:nth-child(1) > td:nth-child(2) > ul > li.news_title > a
crawler=Crawler()
sitedata=[['中国新闻网','https://news.cctv.com','https://search.cctv.com/search.php?qtext=','div .tright','h3.tit span',True,'h1','#content_area']]
sites=[]
for row in sitedata:
    site_obj=Website(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7])
    sites.append(site_obj)
    topics=['双十一']
    for topic in topics:
        print ('GETTING INFO ABOUT:'+topic)
        for targetSite in sites:
            crawler.search(topic,targetSite)

3.4基础案例

import requests
from bs4 import BeautifulSoup
import re
class Website:
    def __init__(self, name, url, targetPattern, absoluteUrl, titleTag, bodyTag) :
        self. name = name
        self.url = url
        self. targetPattern = targetPattern
        self.absoluteUrl=absoluteUrl
        self. titleTag = titleTag
        self.bodyTag = bodyTag
class Content:
    def __init__(self, url, title, body):
        self.url = url
        self.title=title
        self.body = body
    def print(self):
        print("URL: {}".format(self.url))
        print("TITLE:{}".format(self.title))
        print("BODY:{]".format(self.body))
class Crawler:
    def __init__(self, site):
        self.site = site
        self.visited=[]
    def getPage(self, url):
        try:
            req = requests.get(url)
        except requests.exceptions.RequestException:
            return None
        return BeautifulSoup(req.content,'html.parser')

    def safeGet (self, pageObj, selector):
        selectedElems = pageObj.select(selector)
        if selectedElems is not None and len(selectedElems) > 0:
            return '\n'.join([elem.get_text() for elem in selectedElems])
        return ''

    def parser(self, url):
        bs = self.getPage('http://zs.lywhxy.com'+url)
        print(bs)
        if bs is not None:
            title = self.safeGet(bs, self.site.titleTag)
            print(title)
            body = self.safeGet(bs, self.site.bodyTag)
            if title != '' and body != '':
                content = Content(url, title, body)
                content.print()

    def crawl(self): # 获取网站士贝的页面链投
        bs = self.getPage(self.site.url)
        targetPages = bs.findAll('a',href=re.compile(self.site.targetPattern))
        # print(targetPages)
        for targetPage in targetPages:
            targetPage = targetPage.attrs['href']
            # print(targetPage)
            if targetPage not in self.visited:
                self.visited.append(targetPage)
                if not self.site.absoluteUrl:
                    # targetPage = '{}{}'.format(self.site.url, targetPage)
                    # print(targetPage)
                    self.parser(targetPage)

#reuters = Website('brook.double', http://www.lywhy.com', '^(/Life/)', False, 'h4 span', 'dd.fr')
# reuters=Website('学院概況','http://ww.lywhxy.com','^(/about/)',False, 'h4 span','h1']
reuters = Website('Reuters','http://zs.lywhxy.com', '/.*?/', False,'h1', 'p')
crawler = Crawler(reuters)
crawler.crawl()

3.5基本案例

import requests
from bs4 import BeautifulSoup
import re
class Content:
    #所有文意人网页的共同基类
    def __init__(self,topic,url,title,body):
        self.topic=topic
        self.url=url
        self.title=title
        self.body=body
    def print(self):#打印函数,控制結果输出,友便烹服
        print("找到的相关关键字的文章:{}".format(self.topic))
        print("网址:{}".format(self.url))
        print("标题:{}".format(self.title))
        print("内容:{}".format(self.body))
class Website:
    def __init__(self, name, url, titleTag, bodyTag):
        self.name = name
        self.url = url
        self.titleTag = titleTag
        self.bodyTag = bodyTag
class Crawler:
    def getPage(self,url):
        try:
            html = requests.get(url)
            # html.encoding="UTF-8"
        except requests.exceptions.RequestException:
            return None
        return BeautifulSoup(html.content,'html.parser')
            #return BeautifulSoup(html.content, 'html.parser')

    def safeGet(self, pageObj, selector):
        #pageObj指bs对象
        selectedElems = pageObj.select(selector)
        if selectedElems is not None and len(selectedElems) > 0:
            return '\n'.join([elem.get_text() for elem in selectedElems])
        return ''

    def parse(self, site_obj, url):
        """
        调用 getPage()获取包含目标数据的 bs对象,使用 safeGet()解析 bs对象的 title和 body,非空时存储到 content里
        """
        bs = self.getPage(url)
        if bs is not None:
            title = self.safeGet(bs, site_obj.titleTag)
            print(title)
            body = self.safeGet(bs, site_obj.bodyTag)
            # print(body)
            if title != '' and body != '':
                content = Content(site_obj.name,url, title, body)
                content.print()  # 调用封装后的 print()
# 将要爬取的目标网页的 name,url,tag,cssselector等信息存储在嵌套列表里:
siteData = [
    # ['丽江文化旅游学院','https://lywhxy.com','h1','p']
    #readArea > div.readAreaBox.content > div.p  #readArea > div.readAreaBox.content body > div.wrap_q > div.main_r.floatleft_q > div.right_r.floatleft_q > div
    ['央视新闻', 'https://news.cctv.com', '.title_area h1', '.content_area p'],
    ['免费小说网','https://www.17k.com/chapter/3328785/44207503.html','div.readAreaBox.content h1','div.readAreaBox.content > div.p'],
    ['故事大全','https://www.qigushi.com/tonghuagushi/1067.html','h1','.article_content'],
    ['新浪新闻','https://news.sina.com.cn/gov/xlxw/2023-10-25/doc-imzshqvs2406187.shtml','h1','.article'],
    ['青年文摘','https://blog.csdn.net/csdnnews/article/details/134025189?spm=1000.2115.3001.5927','h1','.wznr_r'],
    ['领导留言板','','title','body > div.main > div.layout.rm_txt.cf > div.col.col-1.fl > div.rm_txt_con.cf']
]
#print(type(siteData))
# 将上述信息实例化成 website对象:
websites=[]
# print(type(websites))
for site in siteData:
    # site_obj=Website(site[0],site[1], site[2],site[3])
    site_obj = Website(site[0], site[1], site[2], site[3])
    websites.append(site_obj)
crawler = Crawler()
crawler.parse(websites[0],'https://news.cctv.com/2023/10/24/ARTIFCTydl9njIwEibuO0C2j231024.shtml?spm=C94212.P4YnMod9m2uD.ENPMkWvfnaiV.4')
crawler.parse(websites[1],'https://www.17k.com/chapter/3328785/44207503.html')
crawler.parse(websites[2],'https://www.qigushi.com/tonghuagushi/1067.html')
crawler.parse(websites[3],'https://news.sina.com.cn/gov/xlxw/2023-10-25/doc-imzshqvs2406187.shtml')
crawler.parse(websites[4],'http://www.cyp.com.cn/?viewnews-4481.html')
crawler.parse(websites[5],'http://henan.people.com.cn/n2/2023/1020/c351638-40610144.html')

4.拿取数据技巧

4.1通过标签获取

import time
import requests
import random
from bs4 import BeautifulSoup
import re
url='https://www.baidu.com/'
head={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
pages=set()
random.seed(time.time())
html=requests.get(url)
html.encoding='utf-8'
bs=BeautifulSoup(html.text,"html.parser")
#获取页面中所有内链的列表
includeUrl='baidu.com'
links=bs.find_all('a',href=re.compile('^(.*'+includeUrl+')'))
# print(resp.json())
for link in links:
    print(link.attrs['href'])

4.2通过lamda表达式获取数据

html = httpx.get(url, headers=header, verify=False)
bs = BeautifulSoup(html.text, 'html.parser')
# try:
#     bodys = bs.select('.detail_content p')
#     for body in bodys:
#         body = body.get_text()
#         print(body)
# except:
#     pass
#
#
# biaoge=bs.select('.wenben>table>tbody > tr')
# for bg in biaoge:
#     bg=bg.get_text()
#     bg=bg.replace('\n', '**')
#     print(bg)
#
#
# neirong=bs.select('#mycontent>div>span')
# for nr in neirong:
#     print(nr.text)

# txt=bs.find_all(lambda tag: tag.name=='p')
# for i in txt:
#     print(i.text)
#
# txt1=bs.find_all(lambda tag: tag.name=='tbody')
# for i in txt1:
#     print(i.text)

# txt2=bs.find_all(lambda tag: len(tag.attrs)==1 and tag.attrs[0]=='title')
# for i in txt2:
#     print(i.text)

# txt2=bs.find_all(lambda tag: tag.name == 'span' and tag.has_attr('class') and tag['class'][0] == 'title')
# print(len(txt2))
# for i in txt2:
#     print(i.text)
#
# txt4=bs.find_all(lambda tag: tag.name == 'span' and tag.has_attr('class')==False)
# print(len(txt4))
# for i in txt4:
#     print(i.text)

txt5=bs.find_all(lambda tag: tag.name == 'span')
print(len(txt5))
for i in txt5:
    print(i.text)
biaoge=bs.find_all(lambda tag: tag.name == 'tr')
for bg in biaoge:
    bg=bg.get_text()
    bg=bg.replace('\n', '**')
    print(bg)

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

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

相关文章

STM32-笔记35-DMA(直接存储器访问)

一、什么叫DMA? DMA(Direct Memory Access,直接存储器访问)提供在外设与内存、存储器和存储器之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU,在这个时间中,CPU对于…

代码管理助手-Git

前言 Git 是一个版本控制系统,可以帮助你记录文件的每一次修改。这样,如果你在编程时不小心把代码写错了,可以很容易地回退到之前的版本。最重要的是,Git 是完全免费的,用户可以在自己的计算机上安装和使用 Git&#x…

蓝耘:GPU算力云服务的技术探索与AIGC应用支持

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、蓝耘的核心优势 1. 行业领先的基础设施 …

Kubernetes Gateway API-4-TCPRoute和GRPCRoute

1 TCPRoute 目前 TCP routing 还处于实验阶段。 Gateway API 被设计为与多个协议一起工作,TCPRoute 就是这样一个允许管理TCP流量的路由。 在这个例子中,我们有一个 Gateway 资源和两个 TCPRoute 资源,它们按照以下规则分配流量&#xff1…

在不到 5 分钟的时间内将威胁情报 PDF 添加为 AI 助手的自定义知识

作者:来自 Elastic jamesspi 安全运营团队通常会维护威胁情报报告的存储库,这些报告包含由报告提供商生成的大量知识。然而,挑战在于,这些报告的内容通常以 PDF 格式存在,使得在处理安全事件或调查时难以检索和引用相关…

Unity学习之UGUI进阶

一、事件监听接口 1、作用 用于实现类型长按、双击、拖拽等基础控件无法实现的功能 所有控件都能够添加更多的事件监听来处理对应的逻辑 2、事件监听接口类型 (1)常用事件接口 (2)不常用事件接口 3、使用事件监听接口 &#…

Redis为 List/Set/Hash 的元素设置单独的过期时间

一.业务简介 我们知道,Redis 里面暂时没有接口给 List、Set 或者 Hash 的 field 单独设置过期时间,只能给整个列表、集合或者 Hash 设置过期时间。 这样,当 List/Set/Hash 过期时,里面的所有 field 元素就全部过期了。但这样并不…

【Notepad++】Notepad++如何删除包含某个字符串所在的行

Notepad如何删除包含某个字符串所在的行 一,简介二,操作方法三,总结 一,简介 在使用beyoundcompare软件进行对比的时候,常常会出现一些无关紧要的地方,且所在行的内容是变化的,不方便进行比较&…

APP上架之Android 证书 MD5 指纹

Android 证书 MD5 指纹 1. 什么是 Android 证书 MD5 指纹? Android 证书 MD5 指纹是对证书数据进行 MD5 哈希运算后得到的 128 位字符串。在 Android 开发中,每个证书在理论上都有一个唯一的 MD5 指纹,用于识别和验证证书的有效性。证书指纹…

软件安全性测试有哪些测试方法?

随着数字化进程的加速,软件在各个领域扮演着越来越重要的角色。软件的安全性测试作为保证软件质量和安全的重要环节,逐渐成为企业在开发和部署过程中不可或缺的一部分。 一、软件安全性测试的测试方法   1、静态分析法:通过分析源代码或二…

LabVIEW轴承性能测试系统

本文介绍了基于LabVIEW的高效轴承性能测试系统的设计与开发。系统通过双端驱动技术实现高精度同步控制,针对轴承性能进行全面的测试与分析,以提高轴承的可靠性和寿命。 项目背景 随着工业自动化程度的提高,对轴承的性能要求越来越高。传统的…

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景 实现效果 该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。 知识点 WebGLRenderer(WebGL渲染器) THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核…

如何使用vue引入three.js

在 Vue.js 项目中引入和使用 Three.js 是一个常见的需求,Three.js 是一个用于在浏览器中创建和显示动画 3D 计算机图形的 JavaScript 库。以下是一个基本的示例,展示如何在 Vue 项目中引入和使用 Three.js。 1. 创建 Vue 项目 如果你还没有一个 Vue 项…

9.4 visualStudio 2022 配置 cuda 和 torch (c++)

一、配置torch 1.Libtorch下载 该内容看了【Libtorch 一】libtorchwin10环境配置_vsixtorch-CSDN博客的博客,作为笔记用。我自己搭建后可以正常运行。 下载地址为windows系统下各种LibTorch下载地址_libtorch 百度云-CSDN博客 下载解压后的目录为: 2.vs…

【JavaEE进阶】获取Cookie/Session

🍀Cookie简介 HTTP协议自身是属于 "⽆状态"协议. "⽆状态"的含义指的是: 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的. 例如登陆⽹站成…

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考,oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场,主要考察 nmap的使用已经是否会看输出,以及是否会通过应用查找对应漏…

CSS——2.书写格式一

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中&#xff1a;--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…

IT面试求职系列主题-人工智能(一)

想成功求职&#xff0c;必要的IT技能一样不能少&#xff0c;再从人工智能基础知识来一波吧。 1&#xff09;您对人工智能的理解是什么&#xff1f; 人工智能是计算机科学技术&#xff0c;强调创造能够模仿人类行为的智能机器。这里智能机器可以定义为能够像人一样行动、像人一…

Gitee图形界面上传(详细步骤)

目录 1.软件安装 2.安装顺序 3.创建仓库 4.克隆远程仓库到本地电脑 提交代码的三板斧 1.软件安装 Git - Downloads (git-scm.com) Download – TortoiseGit – Windows Shell Interface to Git 2.安装顺序 1. 首先安装git-2.33.1-64-bit.exe&#xff0c;顺序不能搞错2. …

js迭代器模式

以前JS原生的集合类型数据结构&#xff0c;只有Array&#xff08;数组&#xff09;和Object&#xff08;对象&#xff09;&#xff1b; 而ES6中&#xff0c;又新增了Map和Set。四种数据结构各自有着自己特别的内部实现&#xff0c;但我们仍期待以同样的一套规则去遍历它们&…