• Golang爬虫入门指南


    引言

    网络爬虫是一种自动化程序,用于从互联网上收集信息。随着互联网的迅速发展,爬虫技术在各行各业中越来越受欢迎。Golang作为一种高效、并发性好的编程语言,也逐渐成为爬虫开发的首选语言。本文将介绍使用Golang编写爬虫的基础知识和技巧。

    一、环境准备

    在开始编写Golang爬虫之前,我们需要先准备好开发环境。首先,确保你已经安装了Golang,并配置好了GOPATH。其次,我们需要安装一些必要的库,比如net/http用于发送HTTP请求,golang.org/x/net/html用于解析HTML等。可以使用go get命令来安装这些库。

    go get -u golang.org/x/net/html
    
    • 1

    二、发送HTTP请求

    在编写爬虫之前,我们需要先了解如何发送HTTP请求。Golang提供了net/http包,可以方便地发送GET和POST请求。

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"net/http"
    )
    
    func main() {
    	resp, err := http.Get("https://www.example.com")
    	if err != nil {
    		fmt.Println("请求发送失败:", err)
    		return
    	}
    	defer resp.Body.Close()
    
    	body, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		fmt.Println("读取响应失败:", err)
    		return
    	}
    
    	fmt.Println(string(body))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    上面的代码中,我们使用http.Get发送了一个GET请求,并得到了响应。然后我们使用ioutil.ReadAll来读取响应的内容,并将其打印出来。

    三、解析HTML

    一般来说,我们爬取的数据都是存储在HTML中的。因此,我们需要学会如何解析HTML。Golang提供了golang.org/x/net/html包来帮助我们解析HTML。

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"golang.org/x/net/html"
    )
    
    func main() {
    	resp, err := http.Get("https://www.example.com")
    	if err != nil {
    		fmt.Println("请求发送失败:", err)
    		return
    	}
    	defer resp.Body.Close()
    
    	doc, err := html.Parse(resp.Body)
    	if err != nil {
    		fmt.Println("解析HTML失败:", err)
    		return
    	}
    
    	// 在这里进行HTML解析操作...
    
    }
    
    • 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

    上面的代码中,我们使用html.Parse函数来解析HTML,并得到一个表示整个HTML文档的树状结构。在这个树状结构中,我们可以使用不同的方法来查找和提取我们需要的数据。

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"golang.org/x/net/html"
    )
    
    func main() {
    	resp, err := http.Get("https://www.example.com")
    	if err != nil {
    		fmt.Println("请求发送失败:", err)
    		return
    	}
    	defer resp.Body.Close()
    
    	doc, err := html.Parse(resp.Body)
    	if err != nil {
    		fmt.Println("解析HTML失败:", err)
    		return
    	}
    
    	findLinks(doc)
    }
    
    func findLinks(n *html.Node) {
    	if n.Type == html.ElementNode && n.Data == "a" {
    		for _, a := range n.Attr {
    			if a.Key == "href" {
    				fmt.Println(a.Val)
    			}
    		}
    	}
    
    	for c := n.FirstChild; c != nil; c = c.NextSibling {
    		findLinks(c)
    	}
    }
    
    • 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

    上面的代码中,我们定义了一个递归函数findLinks来查找HTML中的所有链接。我们使用html.NodeTypeData属性来判断当前节点是否为标签,并使用Attr属性来获取链接的地址。

    四、并发爬虫

    并发是Golang的一个重要特性,能够提高爬虫的效率。我们可以使用Golang的并发机制来同时发送多个HTTP请求,加快网页的爬取速度。

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"golang.org/x/net/html"
    )
    
    func main() {
    	urls := []string{
    		"https://www.example.com/page1",
    		"https://www.example.com/page2",
    		"https://www.example.com/page3",
    	}
    
    	ch := make(chan string)
    
    	for _, url := range urls {
    		go fetch(url, ch)
    	}
    
    	for range urls {
    		fmt.Println(<-ch)
    	}
    }
    
    func fetch(url string, ch chan<- string) {
    	resp, err := http.Get(url)
    	if err != nil {
    		ch <- fmt.Sprintf("请求 %s 发送失败:%v", url, err)
    		return
    	}
    	defer resp.Body.Close()
    
    	doc, err := html.Parse(resp.Body)
    	if err != nil {
    		ch <- fmt.Sprintf("解析 %s 失败:%v", url, err)
    		return
    	}
    
    	// 在这里进行HTML解析操作...
    
    	ch <- fmt.Sprintf("请求 %s 完成", url)
    }
    
    • 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

    上面的代码中,我们定义了一个ch通道用于接收爬虫的结果。然后,我们使用go关键字来开启多个协程,每个协程负责爬取一个网页的内容并进行解析。最后,我们使用<-ch来从通道中获取结果并打印出来。

    五、数据存储

    爬取到的数据通常需要保存到数据库或者文件中。Golang提供了各种数据库驱动和文件操作函数,可以方便地进行数据存储。

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"golang.org/x/net/html"
    	"os"
    	"io"
    )
    
    func main() {
    	resp, err := http.Get("https://www.example.com")
    	if err != nil {
    		fmt.Println("请求发送失败:", err)
    		return
    	}
    	defer resp.Body.Close()
    
    	file, err := os.Create("output.html")
    	if err != nil {
    		fmt.Println("创建文件失败:", err)
    		return
    	}
    	defer file.Close()
    
    	_, err = io.Copy(file, resp.Body)
    	if err != nil {
    		fmt.Println("保存文件失败:", err)
    		return
    	}
    
    	fmt.Println("文件保存成功")
    }
    
    • 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

    上面的代码中,我们使用os.Create函数创建了一个名为output.html的文件,并使用io.Copy函数将HTTP响应的内容保存到文件中。

    六、案例

    案例一:爬取网页标题

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"golang.org/x/net/html"
    )
    
    func main() {
    	resp, err := http.Get("https://www.example.com")
    	if err != nil {
    		fmt.Println("请求发送失败:", err)
    		return
    	}
    	defer resp.Body.Close()
    
    	doc, err := html.Parse(resp.Body)
    	if err != nil {
    		fmt.Println("解析HTML失败:", err)
    		return
    	}
    
    	title := findTitle(doc)
    	fmt.Println("网页标题:", title)
    }
    
    func findTitle(n *html.Node) string {
    	if n.Type == html.ElementNode && n.Data == "title" {
    		return n.FirstChild.Data
    	}
    
    	for c := n.FirstChild; c != nil; c = c.NextSibling {
    		title := findTitle(c)
    		if title != "" {
    			return title
    		}
    	}
    
    	return ""
    }
    
    • 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

    在上面的例子中,我们使用findTitle函数来查找网页的标题。我们通过递归遍历HTML树,如果遇到</code>标签,我们就返回其内容。</p> <h4><a name="t8"></a><a id="_259"></a>案例二:爬取图片链接</h4> <pre data-index="7" class="set-code-show prettyprint"><code class="prism language-go has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"net/http"</span> <span class="token string">"golang.org/x/net/html"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> resp<span class="token punctuation">,</span> err <span class="token operator">:=</span> http<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"https://www.example.com"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{<!-- --></span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"请求发送失败:"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token keyword">defer</span> resp<span class="token punctuation">.</span>Body<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> doc<span class="token punctuation">,</span> err <span class="token operator">:=</span> html<span class="token punctuation">.</span><span class="token function">Parse</span><span class="token punctuation">(</span>resp<span class="token punctuation">.</span>Body<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{<!-- --></span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"解析HTML失败:"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> images <span class="token operator">:=</span> <span class="token function">findImages</span><span class="token punctuation">(</span>doc<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"图片链接:"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> img <span class="token operator">:=</span> <span class="token keyword">range</span> images <span class="token punctuation">{<!-- --></span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>img<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">findImages</span><span class="token punctuation">(</span>n <span class="token operator">*</span>html<span class="token punctuation">.</span>Node<span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">var</span> images <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token keyword">if</span> n<span class="token punctuation">.</span>Type <span class="token operator">==</span> html<span class="token punctuation">.</span>ElementNode <span class="token operator">&&</span> n<span class="token punctuation">.</span>Data <span class="token operator">==</span> <span class="token string">"img"</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> attr <span class="token operator">:=</span> <span class="token keyword">range</span> n<span class="token punctuation">.</span>Attr <span class="token punctuation">{<!-- --></span> <span class="token keyword">if</span> attr<span class="token punctuation">.</span>Key <span class="token operator">==</span> <span class="token string">"src"</span> <span class="token punctuation">{<!-- --></span> images <span class="token operator">=</span> <span class="token function">append</span><span class="token punctuation">(</span>images<span class="token punctuation">,</span> attr<span class="token punctuation">.</span>Val<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> c <span class="token operator">:=</span> n<span class="token punctuation">.</span>FirstChild<span class="token punctuation">;</span> c <span class="token operator">!=</span> <span class="token boolean">nil</span><span class="token punctuation">;</span> c <span class="token operator">=</span> c<span class="token punctuation">.</span>NextSibling <span class="token punctuation">{<!-- --></span> images <span class="token operator">=</span> <span class="token function">append</span><span class="token punctuation">(</span>images<span class="token punctuation">,</span> <span class="token function">findImages</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token operator">...</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> images <span class="token punctuation">}</span> <div class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li><li style="color: rgb(153, 153, 153);">9</li><li style="color: rgb(153, 153, 153);">10</li><li style="color: rgb(153, 153, 153);">11</li><li style="color: rgb(153, 153, 153);">12</li><li style="color: rgb(153, 153, 153);">13</li><li style="color: rgb(153, 153, 153);">14</li><li style="color: rgb(153, 153, 153);">15</li><li style="color: rgb(153, 153, 153);">16</li><li style="color: rgb(153, 153, 153);">17</li><li style="color: rgb(153, 153, 153);">18</li><li style="color: rgb(153, 153, 153);">19</li><li style="color: rgb(153, 153, 153);">20</li><li style="color: rgb(153, 153, 153);">21</li><li style="color: rgb(153, 153, 153);">22</li><li style="color: rgb(153, 153, 153);">23</li><li style="color: rgb(153, 153, 153);">24</li><li style="color: rgb(153, 153, 153);">25</li><li style="color: rgb(153, 153, 153);">26</li><li style="color: rgb(153, 153, 153);">27</li><li style="color: rgb(153, 153, 153);">28</li><li style="color: rgb(153, 153, 153);">29</li><li style="color: rgb(153, 153, 153);">30</li><li style="color: rgb(153, 153, 153);">31</li><li style="color: rgb(153, 153, 153);">32</li><li style="color: rgb(153, 153, 153);">33</li><li style="color: rgb(153, 153, 153);">34</li><li style="color: rgb(153, 153, 153);">35</li><li style="color: rgb(153, 153, 153);">36</li><li style="color: rgb(153, 153, 153);">37</li><li style="color: rgb(153, 153, 153);">38</li><li style="color: rgb(153, 153, 153);">39</li><li style="color: rgb(153, 153, 153);">40</li><li style="color: rgb(153, 153, 153);">41</li><li style="color: rgb(153, 153, 153);">42</li><li style="color: rgb(153, 153, 153);">43</li><li style="color: rgb(153, 153, 153);">44</li><li style="color: rgb(153, 153, 153);">45</li><li style="color: rgb(153, 153, 153);">46</li></ul></pre> <p>在上面的例子中,我们使用<code>findImages</code>函数来查找网页中的所有图片链接。我们通过递归遍历HTML树,如果遇到<code><img></code>标签,我们就将其<code>src</code>属性的值添加到结果集中。</p> <h4><a name="t9"></a><a id="_312"></a>案例三:爬取动态生成内容</h4> <pre data-index="8" class="set-code-show prettyprint"><code class="prism language-go has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"net/http"</span> <span class="token string">"io/ioutil"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> resp<span class="token punctuation">,</span> err <span class="token operator">:=</span> http<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"https://api.example.com/data"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{<!-- --></span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"请求发送失败:"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token keyword">defer</span> resp<span class="token punctuation">.</span>Body<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> body<span class="token punctuation">,</span> err <span class="token operator">:=</span> ioutil<span class="token punctuation">.</span><span class="token function">ReadAll</span><span class="token punctuation">(</span>resp<span class="token punctuation">.</span>Body<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{<!-- --></span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"读取响应失败:"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"动态生成内容:"</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <div class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li><li style="color: rgb(153, 153, 153);">9</li><li style="color: rgb(153, 153, 153);">10</li><li style="color: rgb(153, 153, 153);">11</li><li style="color: rgb(153, 153, 153);">12</li><li style="color: rgb(153, 153, 153);">13</li><li style="color: rgb(153, 153, 153);">14</li><li style="color: rgb(153, 153, 153);">15</li><li style="color: rgb(153, 153, 153);">16</li><li style="color: rgb(153, 153, 153);">17</li><li style="color: rgb(153, 153, 153);">18</li><li style="color: rgb(153, 153, 153);">19</li><li style="color: rgb(153, 153, 153);">20</li><li style="color: rgb(153, 153, 153);">21</li><li style="color: rgb(153, 153, 153);">22</li><li style="color: rgb(153, 153, 153);">23</li><li style="color: rgb(153, 153, 153);">24</li></ul></pre> <p>在上面的例子中,我们通过发送HTTP请求获取了一个动态生成的内容。这个内容可能是通过API接口返回的,而不是直接通过HTML页面展示的。我们使用<code>ioutil.ReadAll</code>函数来读取响应的内容,并将其打印出来。</p> <p>以上就是三个使用Golang编写爬虫的案例。通过这些案例,你可以更好地理解和应用Golang爬虫的基础知识和技巧。当然,实际的爬虫开发还需要根据具体的需求和场景进行更复杂的处理和优化。希望这些案例对你有所启发,让你能够更好地掌握Golang爬虫的开发。</p> <h3><a name="t10"></a><a id="_344"></a>结论</h3> <p>通过学习本文介绍的知识和技巧,我们可以使用Golang编写一个简单但功能强大的爬虫。当然,爬虫的开发还有很多其他的技术和工具可以学习和使用,但是本文所介绍的内容已经足够帮助我们入门和实践了。希望本文对你有所帮助,也希望你能够继续深入学习和探索爬虫技术的更多细节。</p> </div> </div> </li> <li class="list-group-item ul-li"> <b>相关阅读:</b><br> <nobr> <a href="/Article/Index/1671853">springboot整合IBM的detect-secrets</a> <br /> <a href="/Article/Index/942463">力扣——链表简单题目</a> <br /> <a href="/Article/Index/1448066">【开题报告】基于SpringBoot的美术馆预约平台的设计与实现</a> <br /> <a href="/Article/Index/956825">【PAT甲级】1098 Insertion or Heap Sort</a> <br /> <a href="/Article/Index/1053209">5-2.Binding指定源</a> <br /> <a href="/Article/Index/1733754">G882磁力仪拖鱼位置是如何计算的?</a> <br /> <a href="/Article/Index/1181293">java锁</a> <br /> <a href="/Article/Index/1361457">conda安装的使用</a> <br /> <a href="/Article/Index/1650084">MySQL之创建高性能的索引(四)</a> <br /> <a href="/Article/Index/1234445">【TypeScript学习】—编译选项(三)</a> <br /> </nobr> </li> <li class="list-group-item from-a mb-2"> 原文地址:https://blog.csdn.net/hitpter/article/details/133957394 </li> </ul> </div> <div class="col-lg-4 col-sm-12"> <ul class="list-group" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 最新文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/1484446">攻防演习之三天拿下官网站群</a> <br /> <a href="/Article/Index/1515268">数据安全治理学习——前期安全规划和安全管理体系建设</a> <br /> <a href="/Article/Index/1759065">企业安全 | 企业内一次钓鱼演练准备过程</a> <br /> <a href="/Article/Index/1485036">内网渗透测试 | Kerberos协议及其部分攻击手法</a> <br /> <a href="/Article/Index/1877332">0day的产生 | 不懂代码的"代码审计"</a> <br /> <a href="/Article/Index/1887576">安装scrcpy-client模块av模块异常,环境问题解决方案</a> <br /> <a href="/Article/Index/1887578">leetcode hot100【LeetCode 279. 完全平方数】java实现</a> <br /> <a href="/Article/Index/1887512">OpenWrt下安装Mosquitto</a> <br /> <a href="/Article/Index/1887520">AnatoMask论文汇总</a> <br /> <a href="/Article/Index/1887496">【AI日记】24.11.01 LangChain、openai api和github copilot</a> <br /> </nobr> </li> </ul> <ul class="list-group pt-2" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 热门文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/888177">十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!</a> <br /> <a href="/Article/Index/797680">奉劝各位学弟学妹们,该打造你的技术影响力了!</a> <br /> <a href="/Article/Index/888183">五年了,我在 CSDN 的两个一百万。</a> <br /> <a href="/Article/Index/888179">Java俄罗斯方块,老程序员花了一个周末,连接中学年代!</a> <br /> <a href="/Article/Index/797730">面试官都震惊,你这网络基础可以啊!</a> <br /> <a href="/Article/Index/797725">你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法</a> <br /> <a href="/Article/Index/797702">心情不好的时候,用 Python 画棵樱花树送给自己吧</a> <br /> <a href="/Article/Index/797709">通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!</a> <br /> <a href="/Article/Index/797716">13 万字 C 语言从入门到精通保姆级教程2021 年版</a> <br /> <a href="/Article/Index/888192">10行代码集2000张美女图,Python爬虫120例,再上征途</a> <br /> </nobr> </li> </ul> </div> </div> </div> <!-- 主体 --> <!--body结束--> <!--这里是footer模板--> <!--footer--> <nav class="navbar navbar-inverse navbar-fixed-bottom"> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="text-muted center foot-height"> Copyright © 2022 侵权请联系<a href="mailto:2656653265@qq.com">2656653265@qq.com</a>    <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备2022015340号-1</a> </div> <div style="width:300px;margin:0 auto; padding:0px 5px;"> <a href="/regex.html">正则表达式工具</a> <a href="/cron.html">cron表达式工具</a> <a href="/pwdcreator.html">密码生成工具</a> </div> <div style="width:300px;margin:0 auto; padding:5px 0;"> <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502049817" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;"> <img src="" style="float:left;" /><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">京公网安备 11010502049817号</p></a> </div> </div> </div> </div> </nav> <!--footer--> <!--footer模板结束--> <script src="/js/plugins/jquery/jquery.js"></script> <script src="/js/bootstrap.min.js"></script> <!--这里是scripts模板--> <!--scripts模板结束--> </body> </html>