[Python从零到壹] 六.网络爬虫之BeautifulSoup爬取作者个人博客网站详解

2023-05-16

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

前一篇文章讲述了BeautifulSoup技术,它是一个可以从HTML或XML文件中提取数据的Python库,一个分析HTML或XML文件的解析器,包括安装过程和基础语法。这篇文章之前是详细讲解 BeautifulSoup 爬取DB数据,但因为某些原因,先修改为对作者个人博客网站的爬取,并结合翻页和详情页面进行讲解。本案例非常适合入门的案例,也能普及简单的预处理知识,希望对您有所帮助。

本文参考了作者CSDN的文章,链接如下:

  • https://blog.csdn.net/Eastmount
  • https://github.com/eastmountyxz/Python-zero2one

同时,作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。

文章目录

  • 一.分析网页DOM树结构
    • 1.分析网页结构及简单爬取
    • 2.定位节点及网页翻页分析
  • 二.爬取作者个人博客网站信息
  • 三.链接跳转分析及详情页面爬取
  • 四.总结

前文赏析:

  • [Python从零到壹] 一.为什么我们要学Python及基础语法详解
  • [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
  • [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
  • [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
  • [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
  • [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取作者个人博客网站详解


前文作者详细介绍了BeautifulSoup技术,这篇文章主要结合具体实例进行深入分析,讲述一个基于BeautifulSoup技术的爬虫,爬取作者个人博客信息,主要内容包括:

  • 分析网页DOM树结构
  • 爬取作者个人博客列表
  • 链接跳转分析
  • 爬取每篇文字对应的详细信息

本文从实战出发,让读者初步了解分析网页结构方法并调用BeautifulSoup技术爬取网络数据,后面章节将进一步深入讲解。

一.分析网页DOM树结构

1.分析网页结构及简单爬取

作者的个人网站主要是对博客的介绍,其它网站类似,大家要学会如何进行网站的DOM树结构分析,包括DB。本文主要介绍BeautifulSoup技术爬取作者博客信息。第一部分将介绍分析网页DOM树结构。爬取作者博客的地址为:

  • http://www.eastmountyxz.com

在这里插入图片描述

上图中显示了作者的博客信息,包括博客名称、博客原文链接、博客摘要等信息,接下来需要对其进行DOM树结构分析。HTML网页是以标签对的形式出现,如< html >< /html >、< div >< /div >等,这种标签对呈树形结构显示,通常称为DOM树结构

在得到一个网页之后,我们需要结合浏览器对其进行元素分析。比如作者博客网站,选中第一篇博客《再见北理工:忆北京研究生的编程时光》,右键鼠标“检查”(Chrome浏览器称为“检查”,其他浏览器可能称为“审查元素”等),如下图2所示。

在这里插入图片描述

显示结果如图3所示,可以发现它是在< div class=”essay”>< /div >路径下,它包括一个< h1>< /h1>记录标题,一个< p>< /p>记录摘要信息,每一个< div class=”essay”>< /div >分别对应一篇论文的信息。其中,博客《再见北理工:忆北京研究生的编程时光》HTML中对应内容为:

<div class=”essay”>
	<h1>....</h1>
	<p>.....</p>
</div >

在这里插入图片描述

通过class值为“essay”可以定位博客的信息。调用BeautifulSoup扩展包的find_all(attrs={“class”:“essay”}) 函数可以获取其信息。对应的HTML部分代码如下:

<div class="essay">
	<h1 style="text-align:center">
	<a href="http://blog.csdn.net/eastmount/article/details/52201984">再见北理工:忆北京研究生的编程时光</a>
	</h1>
	<p style="text-indent: 2em;">  两年前,我本科毕业写了这样一篇文章:《 回忆自己的大学四年得与失 》,
	感慨了自己在北理软院四年的所得所失;两年后,我离开了帝都,回到了贵州家乡,准备开启一段新的教师生涯,
	在此也写一篇文章纪念下吧!还是那句话:这篇文章是写给自己的,希望很多年之后,回想起自己北京的六年时光,
	也是美好的回忆。文章可能有点长,但希望大家像读小说一样耐心品读,....
	</p>
</div>

下面通过Python3代码可以获取博客的信息,调用BeautifulSoup中的find_all()函数获取< div class=’essay’ >的信息,其结果如图4所示。

代码soup.find_all(attrs={“class”:“essay”})用于获取节点< div class=“essay”>的内容,然后采用循环输出,但该class类型只包括了一段内容。接着再定位div中的超链接,通过tag.find(“a”).get_text()获取内容,tag.find(“a”).attrs[‘href’]获取超链接url,最后获取段落摘要。

test01.py

# -*- coding: utf-8 -*-
import re 
import urllib.request
from bs4 import BeautifulSoup

# 爬虫函数
def crawl(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    contents = page.read()
    
    soup = BeautifulSoup(contents, "html.parser")
    print("个人博客爬取:")
    essay0 = soup.find_all(attrs={"class":"essay"})
    for tag in essay0:
        print(tag)
        print('')
        print(tag.a)
        print("博客标题:\n", tag.find("a").get_text())
        print("超链接:\n", tag.find("a").attrs['href'])
        content = tag.find("p").get_text()
        print("博客摘要:\n", content.replace(' ',''))
    print('')

# 主函数
if __name__ == '__main__':
    url = "http://www.eastmountyxz.com/"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    crawl(url, headers)

运行结构如图4所示,爬取了作者第一篇博客的信息,包括序号、博客标题、超链接、摘要等。

在这里插入图片描述

注意:urllib.error.HTTPError: HTTP Error 418
如果直接使用urllib.request.urlopen(url)会提示该错误,这是因为爬虫被拦截,需要模拟浏览器访问,这里可以打开浏览器按下F12,找到对应Headers内容,然后在Python代码中设置User-Agent即可模拟该浏览器请求。

在这里插入图片描述

urlopen()函数:

  • Python2:urllib2.urlopen(url)
  • Python3:urllib.request.urlopen(url)
  • urlopen()函数用于创建一个表示远程url的类文件对象,然后像操作本地文件一样操作这个类文件对象来获取远程数据

read()函数:

  • 调用read()读取网页内容并赋值给contents变量

BeautifulSoup函数:

  • soup = BeautifulSoup(contents, “html.parser”)
  • 调用BeautifulSoup解析所抓取网页源码的DOM树结构

find_all()函数:

  • 调用BeautifulSoup的find_all()函数获取属性class为“item”的所有值,并调用代码content.replace(‘\n’,‘’)将换行符替换为空值,从而实现删除多余换行,最后循环输出结果。

2.定位节点及网页翻页分析

通过前一部分我们获取了第一篇博客的简介信息,但是这些信息是融合在一起的,而在数据分析时,通常需要将某些具有使用价值的信息提取出来,并存储至数组、列表或数据库中,比如博客标题、发表时间、博客点赞数、博客阅读量等特征。尤其是电影、微博等数据。

作者简单归纳了两种常见的方法:

  • (1) 文本分析。从获取的博客简介文本信息中提取某些特定的值,通常采用字符串处理方法进行提取。
  • (2) 节点定位。在写爬虫过程中定位相关节点,然后进行爬取所需节点操作,最后赋值给变量或存储到数据库中。

同理,爬取其余文章的代码如下,通过循环获取essay1、essay2、essay3内容,这些div布局中的格式都一样,包括一个标题和一个摘要信息,代码如下:

# -*- coding: utf-8 -*-
import re 
import urllib.request
from bs4 import BeautifulSoup

# 爬虫函数
def crawl(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    contents = page.read()
    
    soup = BeautifulSoup(contents, "html.parser")
    print("个人博客爬取:")
    
    #整理输出
    i = 0
    while i<=3:
        if i==0:
            num = "essay"
        else:
            num = "essay" + str(i)
        essay = soup.find_all(attrs={"class":num})
        for tag in essay:
            print("博客序号:", i)
            print("博客标题:", tag.find("a").get_text())
            print("超链接:", tag.find("a").attrs['href'])
            content = tag.find("p").get_text()
            print("博客摘要:\n", content.replace(' ',''))
        i += 1
        print('')

# 主函数
if __name__ == '__main__':
    url = "http://www.eastmountyxz.com/"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    crawl(url, headers)

输出结果如下图所示:

在这里插入图片描述

讲到这里,我们第一页的4篇博客信息就爬取成功了,如果网站存在翻页怎么办呢?这就涉及到链接跳转和网站的翻页分析。网站的翻页分析通常有四种方法:

  • 点击下一页分析url网址,分析它们之间的规律,这种方法的网站通常采用GET方法进行传值,而有的网站采用局部刷新技术,翻页后的url仍然不变。
  • 获取“下一页”或页码的超链接,再依次调用urllib2.urlopen(url)函数访问URL并实现网页跳转。
  • 分析网站Networks提交请求的参数,通过Python设置参数实现翻页,常用于POST表单。
  • 采用网页自动操作技术,获取下一页按钮或超链接进行自动点击跳转,如selenium技术中的鼠标点击事件。

本文主要采用第一种分析方法,后面讲述Selenium技术时,会介绍鼠标模拟点击事件操作的跳转方法。

在这里插入图片描述

通常,我们点击不同页面,可以看到网页URL的变化情况。比如:

1页URL:http://www.eastmountyxz.com/page=12页URL:http://www.eastmountyxz.com/page=2
...14页URL:http://www.eastmountyxz.com/page=1415页URL:http://www.eastmountyxz.com/page=15

其它方式:

1页URL:http://www.eastmountyxz.com/blog250?start=25&filter=2页URL:http://www.eastmountyxz.com/blog250?start=25&filter=3页URL:http://www.eastmountyxz.com/blog250?start=50&filter= 
...10页URL:http://www.eastmountyxz.com/blog250?start=225&filter=

它是存在一定规律的,blog250?start=25表示获取第2页(序号为26到50号)的博客信息;blog250?start=50表示获取第3页(序号为51到75号)的博客信息,依次类推,我们写一个循环即可获取完整的博客信息。核心代码如下:

i = 0  
while i<10:  
    num = i*25
    url = 'http://www.eastmountyxz.com/blog?start=' + str(num) + '&filter='  
    crawl(url)  
    i = i + 1

注意:当i初始值为0,num值为0,获取第1页信息;当i增加为1,num值为25,获取第2页信息;当i增加为9,num值为225,获取第10页的信息。

讲到这里,爬取作者博客网站信息的DOM树结构分析、网页链接跳转已经分析完成,下一小节是讲解完整的代码。


二.爬取作者个人博客网站信息

完整代码为test02.py文件,如下所示。

test02.py

# -*- coding: utf-8 -*-
import re 
import urllib.request
from bs4 import BeautifulSoup
import codecs

# 爬虫函数
def crawl(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    contents = page.read()
    
    soup = BeautifulSoup(contents, "html.parser")
    print("个人博客爬取:")
    infofile.write("")
    
    #整理输出
    i = 0
    while i<=3:
        if i==0:
            num = "essay"
        else:
            num = "essay" + str(i)
        essay = soup.find_all(attrs={"class":num})
        for tag in essay:
            print("博客序号:", i)
            infofile.write(str(i) + "\r\n")

            title = tag.find("a").get_text()
            print("博客标题:", title)
            infofile.write(title + "\r\n")

            url_ = tag.find("a").attrs['href']
            print("超链接:", url_)
            infofile.write(url_ + "\r\n")
            
            content = tag.find("p").get_text()
            print("博客摘要:\n", content.replace(' ',''))
            infofile.write(content + "\r\n")
        i += 1
        print('')

# 主函数
if __name__ == '__main__':
    #存储文件
    infofile = codecs.open("Result_Douban.txt", 'a', 'utf-8')
    url = "http://www.eastmountyxz.com/"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    crawl(url, headers)
    infofile.close()

运行结果如图9所示,成功将爬取的博客信息存储到“Result_Douban.txt”文件中,如下图所示。

在这里插入图片描述

在代码中,主函数定义循环依次获取不同页码的URL,然后调用crawl(url)函数对每页的博客信息进行定向爬取。在crawl(url)函数中,通过urlopen()函数访问CSDN博客网址,然后调用BeautifulSoup函数进行HTML分析,前面第一部分讲解了每篇博客都位于 < div class=“essay” >…< /div >节点下,故采用如下for循环依次定位到每篇博客,然后再进行定向爬取。

for tag in soup.find_all(attrs={"class":"item"}):
    #分别爬取每篇博客具体的信息

三.链接跳转分析及详情页面爬取

在第二部分我们详细分析了如何爬取个人博客信息,同时爬取了每篇博客对应详细页面的超链接。本小节主要结合每篇博客的超链接url网站,定位到具体的博客页面,进行深一步的详情页面爬取。这里作者还是采用第一篇博客举例,前面爬取了该博客的超链接地址为:

  • https://blog.csdn.net/eastmount/article/details/52201984

该网页打开如图10所示。

在这里插入图片描述

1.爬取详情页面基本信息
下面对详情页面进行DOM树节点分析,其基本信息位于< div id=‘article_content’ >…< /div >标签下,核心内容位于该节点下的子节点中,即< div id=‘content_views’ >…< /div >。使用如下代码获取内容:

info = soup.find(attrs={"id":"content_views"})
print(info.get_text())

在这里插入图片描述

2.爬取详情博客标题
同样,通过浏览器审查元素,可以得到如图11所示的标题HTML源码,其标题位于< div class=‘title-article >…< /div >节点下。同时可以利用代码 replace(’\n’,‘’).replace(’ ‘,’') 过滤所爬取HTML中多余的空格和换行符号。

other = soup.find(attrs={"class":"title-article"}).get_text()
print other.replace('\n','').replace(' ','')  #过滤空格和换行

在这里插入图片描述

讲到这里,使用BeautifulSoup技术分析爬取作者个人网站的博客信息实例已经讲解完毕,但在实际爬取过程中可能由于某些页面不存在会导致爬虫停止,这时需要使用异常语句“try-except-finally”进行处理。

同时,爬取过程中需要结合自己所需数据进行定位节点,存储至本地文件中,也需要结合字符串处理过滤一些多余的空格或换行。


四.总结

在学习网络爬虫之前,读者首先要掌握分析网页节点、审查元素定位标签,甚至是翻页跳转、URL分析等知识,然后才是通过Python、Java或C#实现爬虫的代码。本文作者结合自己多年的网络爬虫开发经验,深入讲解了BeautifulSoup技术网页分析并爬取了作者个人博客信息,读者可以借用本章的分析方法,结合BeautifulSoup库爬取所需的网页信息,并学会分析网页跳转,尽可能爬取完整的数据集。

同时,本章所爬取的内容是存储至TXT文件中的,读者也可以尝试着存储至Excel、CSV、Json文件中,甚至存储至数据库,这将为您后面的数据分析提供强大的数据支撑,数据处理起来更为方便。那么,Python究竟怎么将所爬取的文本存储至数据库呢?后续作者将带给您答案。

该系列所有代码下载地址:

  • https://github.com/eastmountyxz/Python-zero2one

扩充代码:

# -*- coding: utf-8 -*-
# By:Eastmount CSDN
import urllib.request
import re 
from bs4 import BeautifulSoup
import codecs

#-----------------------------------爬取详细信息-------------------------------------
def getInfo(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    content = page.read()
    soup = BeautifulSoup(content, "html.parser")
    
    print('简介:')
    info = soup.find(attrs={"id":"info"})
    print(info.get_text())
    other = soup.find(attrs={"class":"related-info"}).get_text()
    print(other.replace('\n','').replace(' ',''))
    
    #评论
    print('\n评论信息:')
    for tag in soup.find_all(attrs={"id":"hot-comments"}):
        for comment in tag.find_all(attrs={"class":"comment-item"}):
            com = comment.find("p").get_text()
            print(com.replace('\n','').replace(' ',''))
    print("\n\n\n----------------------------------------------------------------")
            
#-------------------------------------爬虫函数-------------------------------------
def crawl(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    contents = page.read()
    soup = BeautifulSoup(contents, "html.parser") 
    
    for tag in soup.find_all(attrs={"class":"item"}):
        num = tag.find('em').get_text()
        print(num)
        
        name = tag.find_all(attrs={"class":"title"})
        zwname = name[0].get_text()
        print('[中文名称]', zwname)
        
        url_movie = tag.find(attrs={"class":"hd"}).a
        urls = url_movie.attrs['href']
        print('[网页链接]', urls)
        
        info = tag.find(attrs={"class":"star"}).get_text()
        info = info.replace('\n',' ')
        info = info.lstrip()
        
        mode = re.compile(r'\d+\.?\d*')
        i = 0
        for n in mode.findall(info):
            if i==0:
                print('[分数]', n)
            elif i==1:
                print('[评论]', n)
            i = i + 1
            
        getInfo(urls, headers)
        
#-------------------------------------主函数-------------------------------------
if __name__ == '__main__':
    #消息头
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

    #翻页
    i = 0
    while i<10:
        print('页码', (i+1))
        num = i*25
        url = 'http://www.eastmountyxz.com/blog250?start=' + str(num) + '&filter='
        crawl(url, headers)
        i = i + 1

2020年在github的绿瓷砖终于贴完了第一年提交2100余次,获得1500多+stars,开源93个仓库,300个粉丝。挺开心的,希望自己能坚持在github打卡五年,督促自己不断前行。简单总结下,最满意的资源是YQ爆发时,去年2月分享的舆情分析和情感分析,用这系列有温度的代码为武汉加油;最高赞的是Python图像识别系列,也获得了第一位来自国外开发者的贡献补充;最花时间的是Wannacry逆向系列,花了我两月逆向分析,几乎成为了全网最详细的该蠕虫分析;还有AI系列、知识图谱实战、CVE复现、APT报告等等。当然也存在很多不足之处,希望来年分享更高质量的资源,也希望能将安全和AI顶会论文系列总结进来,真诚的希望它们能帮助到大家,感恩有你,一起加油~

在这里插入图片描述

(By:娜璋之家 Eastmount 2021-02-17 夜于贵阳 https://blog.csdn.net/Eastmount )


参考文献如下:

  • 作者书籍《Python网络数据爬取及分析从入门到精通》
  • 作者博客:https://blog.csdn.net/Eastmount
  • Crummy.com网站. BeautifulSoup 4.2.0文档
  • [python知识] 爬虫知识之BeautifulSoup库安装及简单介绍 - Eastmount
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python从零到壹] 六.网络爬虫之BeautifulSoup爬取作者个人博客网站详解 的相关文章

  • 实战尚硅谷项目——尚医通(4)

    本文章仅做个人项目学习过程记录 xff0c 不做详细介绍哈 一 搭建项目目录 xff0c 引入相关依赖 完成后项目目录结构如下 xff1a 二 完成数据库表的建立和实体类model 完成后数据库表如下 xff1a 完成后实体类model目录
  • C++学习之路之(变量命名规则)

    简单变量 变量的命名规则 变量名中只能用字母 abc 数字 0123456789 和下划线 名称的第一个字符不能是数字区分大小写不能将C 43 43 关键字用作名称尽量避免以下划线开头 系统头文件里将宏名 变量名 内部函数名用 开头就是为了
  • ROS2学习笔记(八)-- ROS2参数应用实现道路识别调试

    简介 xff1a 参数也是ROS2系统中很重要的一项功能 xff0c 主要是用来对节点进行配置 xff0c 一般用在调试过程中 xff0c 通过命令行的方式修改节点的一些配置 xff0c 用以辅助调试 xff0c 另外节点参数也支持导入和导
  • 删除docker容器和镜像的命令

    在删除docker容器的时候需要先停止docker xff0c 先删docker容器然后再删除镜像 然后docker rm docker容器的名字 xff08 docker rm mysql xff09 docker rmi 镜像的id
  • 精通SOA:基于服务总线的Struts+EJB+WebService整合应用开发(网上书店系统 - SOA实施)

    目前全球最大的软件服务商IBM 在实施SOA 方面一直处于领先地位 xff0c 因此通过介绍如何用IBM 的服务总线产品来构建SOA 架构更能使开发人员把握SOA 的精髓 服务总线是实现SOA 架构最核心的部分 xff0c 它将对系统内部或
  • 离散LQR:原理,求解与拓展

    该文档用以总结离散LQR的基本原理 xff0c 反馈控制率的求解和一些拓展 xff08 时变系统 xff0c 跟踪命题等 xff09 主要参考的是Stanford的课程EE363 Linear Dynamical Systems的部分课件
  • CMake添加不同目录文件的方法

    三种使用CMake构建工程添加子目录的方法 文件目录结构 span class token punctuation span CMakeLists span class token punctuation span txt inc ansi
  • 使用readdir函数读取一个文件夹的子文件,打印并统计个数

    readdir一般与opendir结合使用 readdir包含的头文件 xff1a include lt dirent h gt readdir函数的原型 xff1a struct dirent readdir DIR dirp 函数的作用
  • ModelSim 仿真常见问题及解决办法

    下面介绍一下使用ModelSim仿真时经常出现的一些问题的解决方法 xff1a 1 Can 39 t launch the ModelSim Altera software 这是由于Quartus II 软件中与 Modelsim 关联设置
  • 蓝牙协议栈

    蓝牙协议栈 蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作 互操作的远端设备需要使用相同的协议栈 xff0c 不同的应用需要不同的协议栈 但是 xff0c 所有的应用都要使用蓝牙技术规范中的数据链路层和物理层 完整的蓝牙协议栈
  • vscode 结合git基础操作之代码冲突解决

    在branch demo 1上面提交一个var d 61 xxx xff0c 假设不是我提交的 既然不是我提交的 xff0c 我在本地的代码并没有git pull 把最新的代码拉下来 xff0c 我就写了一个var f 61 xxx xff
  • Nextcloud使用手册

    1 用户登陆 访问地址 xff1a http 127 0 0 1 8080 管理员用户名 xff1a admin 密码 xff1a 2 面板介绍 边就是分享的链接 收藏 地址 xff0c 中间就是我们上传的图片 文档 程序等了 xff0c
  • 布谷鸟算法(cuckoo_search)可能会遇到的问题

    1 布谷鸟算法是先进行在pa的判断 xff0c 然后决定是进行Levy飞行还是做出相应毁坏蛋的行为 xff0c 再所有的粒子一起输出 2 布谷鸟算法里面的gamma函数在有的地方可能不能使用 xff0c 比如S Function xff0c
  • protues仿真常见问题解决方案

    目录 1 如何确定自己的仿真版本 2 仿真软件破解 3 仿真工程格式 4 未加载HEX文件 5 缺失元件模型 6 低版本无法打开高版本问题 7 仿真结果异常问题 8 仿真图打开失败 9 仿真运行过程中闪退 10 缺失 SDF文件 仿真出问题
  • 第20章 USART—串口通讯—零死角玩转STM32-F429系列

    第20章 USART 串口通讯 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege 本章参考
  • UC/OS-II 源码下载【资源】

    目录 1 前序 2 官网下载源代码 3 STM32F1示例代码 1 前序 你是不是也在学习ucos相关知识 xff0c 想要去网上下载源码 xff0c 但是又不知道去哪里下载 xff0c 网上冲浪大半天也没找到源码 xff0c 结果键盘无故
  • 文件系统编译进内核

    1 利用busybox制作根文件目录 需要有init 和 linuxrc 2 makemenuconfig 在general setup 中设置 initial ram filesystem and RAM disk 后指定文件系统源文件路
  • 零基础制作平衡小车【连载】13---平衡小车代码讲解(附源码)

    前言 今天聊一聊代码 xff0c 只有直立功能的代码 代码总体思路 给定一个目标值 xff0c 单片机通过IIC和mpu6050通信 xff0c 得知数据后 xff0c 根据角度环计算出一个PWM值给电机驱动器 xff0c 从而控制单机转动
  • NRF51822---开发板介绍(连载1)

    无线遥控器项目先放一放吧 xff0c 要学习的东西太多了 xff0c 一开始以为很简单 xff0c 结果坑越挖越深 还保持采用NRF51822的方案做手柄 xff0c 在做之前先把51822这个骨头啃下来 我又重新开了一个专题 xff0c
  • nrf51822+rfx2401c系统板(开源原理图、PCB)

    快过年了 xff0c 没啥东西可送的 xff0c 就把刚做的射频板子开源了吧 原理图 3D图 板子还有点毛病 xff0c 不过问题不大 把PCB隔断 xff0c 飞根线就行了 xff0c 等你拿到手就能看到了 下图中画黑色圈的两个过孔把信号

随机推荐

  • 无名小哥对无名飞控中的问题回答总结

    文章目录 IIR二阶数字低通陀螺仪数据噪声传感器矫正姿态解算惯性导航控制滤波性能系统响应巴特沃斯滤波器的截止频率如何取累计漂移姿态估计精度误差大控制周期时间保证传感器数据不丢帧 IIR二阶数字低通 对于IIR而言 xff0c 阶次越高 xf
  • Vue反向代理服务器

    在项目中创建 vue config js 文件 module exports 61 devServer proxy 39 api 39 target 39 http localhost 3000 39 pathRewrite 39 api
  • putty连接centos7 Network error:connection timed out

    首先说明一下 xff0c centos7系统下的开机服务不再在 etc inittab的管理之下了 xff0c centos7使用systemd模块管理系统的服务 xff0c 所有的服务文件都改为 etc systemd system的 s
  • ESP32_使用天猫精灵利用巴法云控灯例程测试

    1 说明 虽然官方例程写的是ESP8266 xff0c 但是改一下就能直接用到ESP32的 xff0c 参考这个链接 xff1a esp8266接入天猫精灵教程 xff0c 附开源app控制 巴法开放论坛 xff0c 整个过程非常非常简单
  • 附录A 进阶游戏编程书籍总结与推荐

    章节导读 很多游戏编程书籍都有一个通病 xff0c 一本书写完 xff0c 读者看完之后 xff0c 不知道下一步该如何前进 这里的附录就是让大家看完这本书后 xff0c 知道自己接下来可以学习什么 xff0c 如何进一步提升自己 为学习思
  • 最受欢迎的菜品

    7 2 最受欢迎的菜品 20分 某自助餐厅要求餐厅的客人在就餐后进行投票 xff0c 选出一款最喜爱的菜品 xff0c 每日营业结束后进行投票统计 xff0c 选出投票数最多的菜品为最受欢迎的菜品 请编写一个程序帮助餐厅快速完成这个统计工作
  • 利用grafana&prometheus 快速配置k8s监控面板 & 主机监控面板

    系列文章目录 1 使用helm快速安装 grafana amp prometheus 2 利用grafana amp prometheus 快速配置 k8s amp 主机监控 3 grafana amp prometheus 快速配置报警规
  • 使用idea创建一个简单的servlet项目

    在创建一个简易的项目之前首先需要在idea配置好tomcat的环境 xff08 1 xff09 点击add configuration xff08 2 xff09 点击 xff0b 号 xff08 3 xff09 选择好你的tomcat版本
  • 为什么我们需要uCos?带你透彻理解RTOS

    与uCos见面还是大学的时候 xff0c 老师让我为毕业设计选一个课题 xff0c 要求有关嵌入式实时操作系统 xff0c 于是开始在网上搜索 xff0c 顺理成章的就发现了uCos xff0c 于是开始了uCos之路 xff0c 但后来由
  • 多旋翼PID控制器笔记

    多旋翼PID控制器笔记 高度控制垂向速度环加速度指令到油门指令的映射垂向加速度环 水平控制水平速度环水平加速度到姿态的映射姿态环欧拉运动学方程角速度环欧拉动力学方程 高度控制 垂向速度环 垂向速度指令在NED坐标系下给出 xff0c 采用P
  • WGS-84坐标系

    WGS 84坐标系 WGS84坐标系基本参数地理坐标曲率半径WGS 84与NED坐标系的转换 WGS84坐标系 WGS 84坐标系 xff08 World Geodetic System一1984 Coordinate System xff
  • MPU6050在ROS中应用

    arduino下读取MPU6050数据 参考 xff1a http diyhacking com arduino mpu 6050 imu sensor tutorial 硬件 arduino uno或arduino mega2560mpu
  • 工作空间目录

    PathGo导航模块的默认固定IP是192 168 31 200 xff0c 默认用户名为eaibot xff0c 密码为 eaibot span class hljs variable span ssh eaibot span class
  • 嵌入式软件工程师求职需要的基本技能

    总结一下 嵌入式软件工程师 一般需要会的技能 xff0c 也可以为自己接下来的学习做一个规划 xff1a 1 C C 43 43 编程基础扎实 xff1b 2 熟悉ARM体系结构 熟悉Linux操作系统 xff1b 3 熟悉多线程编程 xf
  • 信号量、邮箱和消息队列

    信号量像一把钥匙 xff0c 任务要运行下去 xff0c 需先拿到这把钥匙 消息邮箱是一个指针型变量 可以向一个任务或一个中断服务子程序发送一则消息 xff08 一个指针 xff09 xff0c 同样 xff0c 一个或多个任务通过内核服务
  • ROS单线程与多线程处理

    ROS wiki xff1a http wiki ros org ROS API xff1a https docs ros org en api roscpp html index html ROS单线程与多线程处理 xff1a http
  • Linux 完全卸载重装opencv

    一 完全卸载opencv 1 先到opencv编译安装的目录下 sudo make uninstall cd sudo rm r build 2 上面最后一行命令有的文件夹不存在会有提示 xff0c 但是不影响 xff0c 只要把已安装的o
  • [Python黑帽] 三.编程实现IP及端口扫描器、实现多线程C段扫描器

    Python黑帽第三篇文章将分享网络扫描基础知识 xff0c 编程实现IP及端口扫描器 实现多线程C段扫描器 本文参考了 Python绝技 书籍和i春秋ADO老师的课程内容 xff0c 这里真心推荐大家去学习ichunqiu课程 xff0c
  • [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解

    欢迎大家来到 Python从零到壹 xff0c 在这里我将分享约200篇Python系列文章 xff0c 带大家一起去学习和玩耍 xff0c 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 xff0c 真心想把自
  • [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取作者个人博客网站详解

    欢迎大家来到 Python从零到壹 xff0c 在这里我将分享约200篇Python系列文章 xff0c 带大家一起去学习和玩耍 xff0c 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 xff0c 真心想把自