【python爬虫】15.Scrapy框架实战(热门职位爬取)

文章目录

  • 前言
  • 明确目标
  • 分析过程
    • 企业排行榜的公司信息
    • 公司详情页面的招聘信息
  • 代码实现
    • 创建项目
    • 定义item
  • 创建和编写爬虫文件
    • 存储文件
    • 修改设置
  • 代码实操
  • 总结

前言

上一关,我们学习了Scrapy框架,知道了Scrapy爬虫公司的结构和工作原理。
在这里插入图片描述
在Scrapy爬虫公司里,引擎是最大的boss,统领着调度器、下载器、爬虫和数据管道四大部门。

这四大部门都听命于引擎,视引擎的需求为最高需求。

在这里插入图片描述
我们还通过实操爬取豆瓣Top250图书的项目,熟悉了Scrapy的用法。
在这里插入图片描述
这一关,我会带你实操一个更大的项目——用Scrapy爬取招聘网站的招聘信息。

你可以借此体验一把当Scrapy爬虫公司CEO的感觉,用代码控制并操作整个Scrapy的运行。

那我们爬取什么招聘网站呢?在众多招聘网站中,我挑选了职友集。这个网站可以通过索引的方式,搜索到全国上百家招聘网站的最新职位。

在这里插入图片描述
现在,请你用浏览器打开职友集的网址链接(一定要打开哦):

https://www.jobui.com/rank/company/view/beijing/

我用的是北京的页面,大家可以根据自己的需要来进行更换地区。

我们先对这个网站做初步的观察,这样我们才能明确项目的爬取目标。

明确目标

打开网址后,你会发现:这是职友集网站的地区企业排行榜,里面含有本月人气企业榜。

在这里插入图片描述
点击【北京痘印信息服务有限公司】,会跳转到这家公司的详情页面,再点击【招聘】,就能看到这家公司正在招聘的所有岗位信息。

在这里插入图片描述
初步观察后,我们可以把爬取目标定为:先爬取企业排行榜四个榜单里的公司,再接着爬取这些公司的招聘信息。

每个榜单有10家公司,四个榜单一共就是40家公司。也就是说,我们要先从企业排行榜爬取到这40家公司,再跳转到这40家公司的招聘信息页面,爬取到公司名称、职位、工作地点和招聘要求。

分析过程

明确完目标,我们开始分析过程。首先,要看企业排行榜里的公司信息藏在了哪里。

企业排行榜的公司信息

请你右击打开“检查”工具,点击Network,刷新页面。点开第0个请求beijing/,看Response,找一下有没有榜单的公司信息在里面。

在这里插入图片描述
一找,发现四个榜单的所有公司信息都在里面。说明企业排行榜的公司信息就藏在html里。

现在请你点击Elements,点亮光标,再把鼠标移到【北京抖音信息服务有限公司】,这时就会定位到含有这家公司信息的<a>元素上。

在这里插入图片描述
点击href=“/company/10375749/”,会跳转到字节跳动这家公司的详情页面。详情页面的网址是:

https://www.jobui.com/company/17376344/

我们可以猜到:/company/+数字/应该是公司id的标识。这么一观察,榜单上的公司详情页面的网址规律我们就得出来了。

在这里插入图片描述

那么,我们只要把<a>元素的href属性的值提取出来,就能构造出每家公司详情页面的网址。

构造公司详情页面的网址是为了后面能获得详情页面里的招聘信息。

现在,我们来分析html的结构,看看怎样才能把<a>元素href属性的值提取出来。

在这里插入图片描述

仔细观察html的结构,你会发现,每个公司信息都藏在一个<div class="c-company-list">元素里,这个div标签中包<div class="company-logo-box"><div class="company-content-box">两个div。

我们想要的<a>标签,就在<div class="company-logo-box">里面。

我们想拿到所有<a>元素href属性的值。我们当然不能直接用find_all()抓取<a>标签,原因也很简单:这个页面有太多的<a>标签,会抓出来很多我们不想要的信息。

一个稳妥的方案是:先抓取最外层的<div>标签,再抓取<div>标签里的<a>元素,最后提取到<a>元素href属性的值。就像剥洋葱,要从最外面的一层开始剥一样。

分析到这里,我们已经知道公司详情页面的网址规律,和如何提取<a>元素href属性的值。

接下来,我们需要分析的就是,每家公司的详情页面。

公司详情页面的招聘信息

我们打开【北京字节跳动科技有限公司】的详情页面,点击【招聘】。这时,网址会发生变化,多了jobs的参数。

在这里插入图片描述

如果你多点击几家公司的详情页面,查看招聘信息,就会知道:公司招聘信息的网址规律也是有规律的。

在这里插入图片描述
接着,我们需要找找看公司的招聘信息都存在了哪里。

还是在字节跳动公司的招聘信息页面,右击打开“检查”工具,点击Network,刷新页面。我们点击第0个请求jobs/,查看Response,翻找看看里面有没有这家公司的招聘信息。

在这里插入图片描述

在Response里我们找到了想要的招聘信息。这说明公司的招聘信息依旧是藏在了html里。

接下来,你应该知道要分析什么了吧。

分析的套路都是相同的,知道数据藏在html后,接着是分析html的结构,想办法提取出我们想要的数据。

那就按照惯例点击Elements,然后点亮光标,把鼠标移到公司名称吧。

在这里插入图片描述
公司名称藏在<div class="company-banner-title">标签下的<a>元素的文本中。按道理来说,我们可以通过class属性,定位到<div>的这个标签,取出<div>标签的文本,就能拿到公司名称。

不过经过我几次的操作试验,发现职友集这个网站间隔一段时间就会更换这个标签的名字(可能你此时看到的标签名不一定是

)。

为了保证一定能取到公司名称,我们改成用id属性(id=“companyH1”)来定位这个标签。这样,不管这个标签名字如何更换,我们依旧能抓到它。

下面,再把鼠标移到岗位名称,看看招聘的岗位信息可以怎么提取。

在这里插入图片描述
你会发现:每个岗位的信息都藏在一个<div>标签下,职位名称在<a>元素的文本中,工作地点和职位要求在<div class="job-desc">元素中,工作地点在第 1 个<span>标签里,职位要求在第 2 个<span>标签里。

这样分析下来,我们想要的招聘信息,包括公司名称、职位名称、工作地点和职位要求,都定位清楚了。

在这里插入图片描述
至此,我们分析完了整个爬取过程,接下来就是代码实现啦。

代码实现

在这里插入图片描述
我们按照Scrapy正常的用法一步步来。首先,我们必须创建一个Scrapy项目。

创建项目

还记得怎么创建吗?打开本地电脑的终端(windows:Win+R,输入cmd;mac:command+空格,搜索“终端”),跳转到你想要保存项目的目录下,输入创建Scrapy项目的命令:scrapy startproject jobui(jobui是职友集网站的英文名,在这里我们把它作为Scrapy项目的名字)。

创建好项目后,你在本地电脑的编译器打开这个Scrapy项目,会看到如下的结构:

在这里插入图片描述

定义item

我们刚刚分析的时候,已经确定要爬取的数据是公司名称、职位名称、工作地点和招聘要求。

那么,现在请你写出定义item的代码。

下面,是我写的定义item的代码。

import scrapyclass JobuiItem(scrapy.Item):
#定义了一个继承自scrapy.Item的JobuiItem类company = scrapy.Field()#定义公司名称的数据属性position = scrapy.Field()#定义职位名称的数据属性address = scrapy.Field()#定义工作地点的数据属性detail = scrapy.Field()#定义招聘要求的数据属性

创建和编写爬虫文件

定义好item,我们接着要做的是在spiders里创建爬虫文件,命名为jobui_ jobs。

在这里插入图片描述
现在,我们可以开始在这个爬虫文件里编写代码。

先导入所需的模块:

import scrapy  
import bs4
from ..items import JobuiItem

接下来,是编写爬虫的核心代码。我会先带着你理清代码的逻辑,这样等下你才能比较顺利地理解和写出代码。

在前面分析过程的步骤里,我们知道要先抓取企业排行榜40家公司的id标识,比如字节跳动公司的id标识是/company/17376344/。

在这里插入图片描述

再利用抓取到的公司id标识构造出每家公司招聘信息的网址。比如,字节跳动公司的招聘信息网址就是https://www.jobui.com/company/17376344/jobs/

我们需要再把每家公司招聘信息的网址封装成requests对象。这里你可能有点不理解为什么要封装成requests对象,我解释一下。

如果我们不是使用Scrapy,而是使用requests库的话,一般我们得到一个网址,需要用requests.get(),传入网址这个参数,才能获取到网页的源代码。

在这里插入图片描述
而在Scrapy里,获取网页源代码这件事儿,会由引擎交分配给下载器去做,不需要我们自己处理。我们之所以要构造新的requests对象,是为了告诉引擎,我们新的请求需要传入什么参数。

这样才能让引擎拿到的是正确requests对象,交给下载器处理。

既然构造了新的requests对象,我们就得定义与之匹配的用来处理response的新方法。这样才能提取出我们想要的招聘信息的数据。

好啦,核心代码的逻辑我们理清楚了。

在这里插入图片描述
我们接着往下写核心代码。

#导入模块
import scrapy
import bs4
from ..items import JobuiItemclass JobuiSpider(scrapy.Spider):  
#定义一个爬虫类JobuiSpidername = 'jobui'                  #定义爬虫的名字为jobuiallowed_domains = ['www.jobui.com']#定义允许爬虫爬取网址的域名——职友集网站的域名start_urls = ['https://www.jobui.com/rank/company/view/beijing/']#定义起始网址——职友集企业排行榜的网址(北京)def parse(self, response):#parse是默认处理response的方法bs = bs4.BeautifulSoup(response.text, 'html.parser')#用BeautifulSoup解析response(企业排行榜的网页源代码)company_list = bs.find('div',id="companyList").find_all('div',class_='c-company-list')#用find_all提取所有<div class="c-company-list">标签for company in company_list:#遍历company_listdata = company.find('a')# 找到其中第一个<a>标签,即<div class="company-logo-box">下的<a>标签company_id = data['href']#提取出所有<a>元素的href属性的值,也就是公司id标识url = 'https://www.jobui.com{id}jobs'real_url = url.format(id=company_id)#构造出公司招聘信息的网址链接

第6-13行代码:定义了爬虫类JobuiSpider、爬虫的名字jobui、允许爬虫爬取的域名和起始网址。

剩下的代码,你应该都能看懂。我们用默认的parse方法来处理response(企业排行榜的网页源代码);用BeautifulSoup来解析response;用find_all方法提取数据(公司id标识)。

公司id标识就是<a>元素的href属性的值,我们想要把它提取出来,就得先抓到所有最外层的<div class="c-company-list">标签,再从中抓取<a>元素。

所以这里用了个for循环,把元素的href属性的值提取了出来,并成功构造了公司招聘信息的网址。

代码写到这里,我们已经完成了核心代码逻辑的前两件事:提取企业排行榜的公司id标识和构造公司招聘信息的网址。

在这里插入图片描述
接下来,就是构造新的requests对象和定义新的方法处理response。

继续来完善核心代码(请你重点看第30行代码及之后的代码)。

#导入模块
import scrapy
import bs4
from ..items import JobuiItemclass JobuiSpider(scrapy.Spider):  
#定义一个爬虫类JobuiSpidername = 'jobui'                  #定义爬虫的名字为jobuiallowed_domains = ['www.jobui.com']#定义允许爬虫爬取网址的域名——职友集网站的域名start_urls = ['https://www.jobui.com/rank/company/view/beijing/']#定义起始网址——职友集企业排行榜的网址def parse(self, response):#parse是默认处理response的方法bs = bs4.BeautifulSoup(response.text, 'html.parser')#用BeautifulSoup解析response(企业排行榜的网页源代码)company_list = bs.find('div',id="companyList").find_all('div',class_='c-company-list')#用find_all提取所有<div class="c-company-list">标签for company in company_list:#遍历company_listdata = company.find('a')# 找到其中第一个<a>标签,即<div class="company-logo-box">下的<a>标签company_id = data['href']#提取出所有<a>元素的href属性的值,也就是公司id标识url = 'https://www.jobui.com{id}jobs'real_url = url.format(id=company_id)#构造出公司招聘信息的网址链接yield scrapy.Request(real_url, callback=self.parse_job)
#用yield语句把构造好的request对象传递给引擎。用scrapy.Request构造request对象。callback参数设置调用parsejob方法。def parse_job(self, response):#定义新的处理response的方法parse_job(方法的名字可以自己起)bs = bs4.BeautifulSoup(response.text, 'html.parser')#用BeautifulSoup解析response(公司招聘信息的网页源代码)company = bs.find(id="companyH1").text#用find方法提取出公司名称datas = bs.find_all('div',class_="c-job-list")#用find_all提取<div class_="c-job-list">标签,里面含有招聘信息的数据for data in datas:#遍历datasitem = JobuiItem()#实例化JobuiItem这个类item['company'] = company#把公司名称放回JobuiItem类的company属性里item['position']=data.find('a').find('h3').text#提取出职位名称,并把这个数据放回JobuiItem类的position属性里item['address'] = data.find_all('span')[0].text#提取出工作地点,并把这个数据放回JobuiItem类的address属性里item['detail'] = data.find_all('span')[1].text#提取出招聘要求,并把这个数据放回JobuiItem类的detail属性里yield item#用yield语句把item传递给引擎

你应该不理解第30行代码:yield scrapy.Request(real_url, callback=self.parse_job)的意思。我跟你解释一下。

scrapy.Request是构造requests对象的类。real_url是我们往requests对象里传入的每家公司招聘信息网址的参数。

callback的中文意思是回调。self.parse_job是我们新定义的parse_job方法。往requests对象里传入callback=self.parse_job这个参数后,引擎就能知道response要前往的下一站,是parse_job()方法。

yield语句就是用来把这个构造好的requests对象传递给引擎。

第34行代码,是我们定义的新的parse_job方法。这个方法是用来解析和提取公司招聘信息的数据。

对照下面的招聘信息的数据定位表格,你应该能比较好地理解之后的代码。

在这里插入图片描述
上图中的工作地点和招聘要求 的属性,已经修正为了 text 请大家注意。

提取出公司名称、职位名称、工作地点和招聘要求这些数据,并把这些数据放进我们定义好的JobuiItem类里。

最后,用yield语句把item传递给引擎,整个核心代码就编写完啦!ヽ(゚∀゚)メ(゚∀゚)ノ

存储文件

至此,我们整个项目还差存储数据这一步。在第7关,我们学过用csv模块把数据存储csv文件,用openpyxl模块把数据存储Excel文件。

其实,在Scrapy里,把数据存储成csv文件和Excel文件,也有分别对应的方法。我们先说csv文件。

存储成csv文件的方法比较简单,只需在settings.py文件里,添加如下的代码即可。

FEED_URI='./storage/data/%(name)s.csv'
FEED_FORMAT='csv'
FEED_EXPORT_ENCODING='ansi'

FEED_URI是导出文件的路径。‘./storage/data/%(name)s.csv’,就是把存储的文件放到与main.py文件同级的storage文件夹的data子文件夹里。

FEED_FORMAT 是导出数据格式,写csv就能得到csv格式。

FEED_EXPORT_ENCODING 是导出文件编码,ansi是一种在windows上的编码格式,你也可以把它变成utf-8用在mac电脑上。

存储成Excel文件的方法要稍微复杂一些,我们需要先在settings.py里设置启用ITEM_PIPELINES,设置方法如下:

#需要修改`ITEM_PIPELINES`的设置代码:# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
#     'jobui.pipelines.JobuiPipeline': 300,
# }

只要取消ITEM_PIPELINES的注释(删掉#)即可。

#取消`ITEM_PIPELINES`的注释后:# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'jobui.pipelines.JobuiPipeline': 300,
}

接着,我们就可以去编辑pipelines.py文件。存储为Excel文件,我们依旧是用openpyxl模块来实现,代码如下,注意阅读注释:

import openpyxlclass JobuiPipeline(object):
#定义一个JobuiPipeline类,负责处理itemdef __init__(self):#初始化函数 当类实例化时这个方法会自启动self.wb =openpyxl.Workbook()#创建工作薄self.ws = self.wb.active#定位活动表self.ws.append(['公司', '职位', '地址', '招聘信息'])#用append函数往表格添加表头def process_item(self, item, spider):#process_item是默认的处理item的方法,就像parse是默认处理response的方法line = [item['company'], item['position'], item['address'], item['detail']]#把公司名称、职位名称、工作地点和招聘要求都写成列表的形式,赋值给lineself.ws.append(line)#用append函数把公司名称、职位名称、工作地点和招聘要求的数据都添加进表格return item#将item丢回给引擎,如果后面还有这个item需要经过的itempipeline,引擎会自己调度def close_spider(self, spider):#close_spider是当爬虫结束运行时,这个方法就会执行self.wb.save('./jobui.xlsx')#保存文件self.wb.close()#关闭文件

修改设置

在最后,我们还要再修改Scrapy中settings.py文件里的默认设置:添加请求头,以及把ROBOTSTXT_OBEY=True改成ROBOTSTXT_OBEY=False。

#需要修改的默认设置:# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'jobui (+http://www.yourdomain.com)'# Obey robots.txt rules
ROBOTSTXT_OBEY = True

还有一处默认设置我们需要修改,代码如下:

# Configure a delay for requests for the same website (default: 0)
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 0

我们需要取消DOWNLOAD_DELAY = 0这行的注释(删掉#)。DOWNLOAD_DELAY翻译成中文是下载延迟的意思,这行代码可以控制爬虫的速度。因为这个项目的爬取速度不宜过快,我们要把下载延迟的时间改成0.5秒。

改好后的代码如下:

# Configure a delay for requests for the same website (default: 0)
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 0.5

修改完设置,我们已经可以运行代码。

在这里插入图片描述

温馨提示:由于网站反爬策略升级,如果发现请求的响应结果不是200,那就参照之前的文章来进行解决即可。

代码实操

我带你完成了核心代码的编写,现在是时候到你自己动手编写一遍这个项目的核心代码。

提示1:除了编写核心代码,还要定义item、修改设置和运行Scrapy。

提示2:运行Scrapy的方法,在main.py文件里导入cmdline模块,用execute方法执行终端的命令行:scrapy crawl+项目名

提示3:如果是使用main.py作为入口来进行运行的话,只有main.py文件是能点击运行的。

提示4:存储为csv还是Excel,你可以自己决定。存储为csv只需要更改settings文件,存储为Excel则还需要修改pipelines.py文件。

开始代码实操吧~

怎么样,完成了吗?

不管代码有没有运行成功,我都为你鼓掌!ヾ(o´∀`o)ノ

总结

至此,我们使用Scrapy完成了一个完整项目。它涉及了一个爬虫的全程:获取数据,解析数据,提取数据和存储数据。

但是必须要指出的是,受篇幅所限,还有许多内容没展开讲:Scrapy的自带解析器怎么用?如何带参数请求数据?如何写入cookies?如何发送邮件?如何与selenium联动?如何完成超厉害的分布式爬虫……如是种种。

如是种种,全都讲出来可能还要新增好几个关卡。但是我认为,这不是必要的。

一来,你已经学习过用BS解析数据、带参数请求数据、加入cookies、发邮件、协程……你明白它们的工作原理。

二来,你已经明白Scrapy框架的组成和工作原理。

只要将两者加以组合,辅以练习,就能轻松掌握。

今日的你,只是不知道语法怎么写罢了。而语法问题,是最容易解决的问题,我们可以去阅读官方文档。因为你已具备上述知识,所以这文档读起来也会非常简单。

在下一关,我为你准备了对过往知识的总复习、反爬虫策略汇总、对未来爬虫学习的指引,以及一封书信。

我们下一关见!

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

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

相关文章

配置本地maven

安装maven安装包 修改环境变量 vim ~/.bash_profile export JMETER_HOME/Users/yyyyjinying/apache-jmeter-5.4.1 export GOROOT/usr/local/go export GOPATH/Users/yyyyjinying/demo-file/git/backend/go export GROOVY_HOME/Users/yyyyjinying/sortware/groovy-4.0.14 exp…

手写Mybatis:第10章-使用策略模式,调用参数处理器

文章目录 一、目标&#xff1a;参数处理器二、设计&#xff1a;参数处理器三、实现&#xff1a;参数处理器3.1 工程结构3.2 参数处理器关系图3.3 入参数校准3.4 参数策略处理器3.4.1 JDBC枚举类型修改3.4.2 类型处理器接口3.4.3 模板模式&#xff1a;类型处理器抽象基类3.4.4 类…

linux 进程隔离Namespace 学习

一、linux namespace 介绍 1.1、概念 Linux Namespace是Linux内核提供的一种机制&#xff0c;它用于隔离不同进程的资源视图&#xff0c;使得每个进程都拥有独立的资源空间&#xff0c;从而实现进程之间的隔离和资源管理。 Linux Namespace的设计目标是为了解决多个进程之间…

微服务设计和高并发实践

文章目录 1、微服务的设计原则1.1、服务拆分方法1.2、微服务的设计原则1.3、微服务架构 2、高并发系统的一些优化经验2.1、提高性能2.1.1、数据库优化2.1.2、使用缓存2.1.3、服务调用优化2.1.4、动静分离2.1.5、数据库读写分离 2.2、服务高可用2.2.1、限流和服务降级2.2.2、隔离…

C语言插入排序

前言&#xff1a; 本文主要讲解插入排序中的直接插入排序和希尔排序。 1、直接插入排序&#xff1a; 1.1基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是把待排序的数值按照大小顺序逐个插入到一个已经排好序的有序序列中&#xff0c;直到将所有记录…

Spring Cloud--从零开始搭建微服务基础环境【四】

&#x1f600;前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【四】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;…

QT day5

服务器&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); }Widget::~Widget() {delete ui…

Java“牵手”京东商品评论数据接口方法,京东商品评论接口,京东商品评价接口,行业数据监测,京东API实现批量商品评论内容数据抓取示例

京东平台商品评论数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、评论内容、评论日期、评论图片、追评内容等详细信息 。 获取商品评论接口API是一种用于获取…

el-select 加多选框使用

解决方法&#xff1a; el-select 添加属性 multiple&#xff0c; <el-form-item label"订单来源&#xff1a;"><el-selectv-model"tableFrom.userType"clearablemultipleplaceholder"请选择"class"selWidth"><el-opt…

LeetCode-53-最大子数组和-贪心算法

贪心算法理论基础&#xff1a; 局部最优推全局最优 贪心无套路~ 没有什么规律~ 重点&#xff1a;每个阶段的局部最优是什么&#xff1f; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#…

开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿

近期换了工作电脑&#xff0c;公司的IT团队不够给力&#xff0c;不能复制电脑系统&#xff0c;所以又到了需要重装IDE配置开发环境的时候了&#xff1b;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题&#xff0c;这里整理下解决方法以备不时之需&#xff1b; …

【python爬虫】16.爬虫知识点总结复习

文章目录 前言爬虫总复习工具解析与提取&#xff08;一&#xff09;解析与提取&#xff08;二&#xff09;更厉害的请求存储更多的爬虫更强大的爬虫——框架给爬虫加上翅膀 爬虫进阶路线指引解析与提取 存储数据分析与可视化更多的爬虫更强大的爬虫——框架项目训练 反爬虫应对…

Linux的命令

Linux的命令分为四个类型&#xff1a;文件操作命令、系统操作命令、文本处理命令和网络操作命令。下面简单介绍一下常用的Linux命令&#xff1a; 文件操作命令 ls&#xff1a;列出目录下的所有文件和目录。 cd&#xff1a;切换当前目录。 mkdir&#xff1a;创建一个新目录。…

Linux系统的安装

文章目录 1 Linux介绍1.1 Linux是什么1.2 Linux的特点1.3 Linux的应用1.4 Linux的发行版本1.5 Linux的Shell 2 Linux安装2.1 安装方式2.2 什么是VMware2.3 VMware主要功能2.4 什么是CentOS2.5 VMware与CentOS与Linux的关系2.6 VMware安装CentOS的步骤 1 Linux介绍 1.1 Linux是…

Jenkins详解(三)

Jenkins详解(三) 目录 Jenkins详解(三) 1、Jenkins介绍2、Jenkins CI/CD 流程3、部署环境 3.1 环境准备3.2 安装GitLab3.3 初始化GitLab3.4 GitLab中文社区版补丁包安装3.5 修改GitLab配置文件/etc/gitlab/gitlab.rb3.6 在宿主机输入 http://192.168.200.26:88 地址就可以访问了…

【Unity-Cinemachine相机】虚拟相机旋转Composer属性详解

Look At和Aim本质是控制虚拟相机自身的旋转&#xff0c;并不一定非要看着&#xff0c;或者并不一定非要瞄着这里的游戏对象 Look At和Aim是以Look At里面的对象作为参考来旋转自身 Do nothing&#xff1a;表现出来的行为和Look At空出来一样 Composer&#xff1a;是一个标准的…

机器学习(吴恩达第一课)

课程链接 文章目录 第一周1、机器学习定义2、监督学习(Supervised learning)1、回归(Regression)2、分类(Classification) 3、无监督学习(Unsupervised learning)4、线性回归模型5、代价函数6、梯度下降(Gradient descent)1、学习率2、用于线性回归的梯度下降 第二周(多维特征…

2605. 从两个数字数组里生成最小数字

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;枚举比较法方法二&#xff1a;集合的位运算表示法 写在最后 Tag 【贪心】【位运算】【数组】 题目来源 2605. 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组&#xff0c;每个数组…

静态路由:配置和使用详解

文章目录 一、静态路由的配置和使用详解1. 配置要点1.1 点到点接口配置1.2 以太网接口配置 2. 默认路由3. 静态路由的配置命令4. 静态路由实现路由备份和负载分担 二、静态路由的优先级和比较1. 静态路由的优先级设置2. 静态路由与动态路由的比较2.1 静态路由优缺点2.2 动态路由…

【STM32】学习笔记-SPI通信

SPI通信 SPI通信&#xff08;Serial Peripheral Interface&#xff09;是一种同步的串行通信协议&#xff0c;用于在微控制器、传感器、存储器、数字信号处理器等之间进行通信。SPI通信协议需要使用4个线路进行通信&#xff1a;时钟线(SCLK)、主输入/主输出线(MISO)、主输出/主…