从获取数据开始

第二节说到了爬虫的工作过程,可以分为四步:
分别是:获取数据;解析数据;提取数据;存储数据。

接下来,一步一个脚印往前走。

第0步:获取数据

我们用一个强大的第三方库来获取数据,它叫requests
在命令提示符中输入:pip install requests即可安装
如果速度慢的话,使用豆瓣镜像:

pip  install  -i  https://pypi.doubanio.com/simple/  --trusted-host pypi.doubanio.com requests

检查是否安装完毕:
在命令提示符(cmd)中输入:pip list (查看python所有已安装的包)看安装的第三方库中有没有requests

import requests
res = requests.get('URL')

首先import requests,引入第三方库。
然后调用requests中的get方法,获取网址url中的数据,并且将它赋值给变量res。

例如:获取心食谱网站的html源代码

import requests
res = requests.get('https://www.xinshipu.com/')
print(res.status_code)
if res.status_code == 200:with open('xinshipu.txt','w',encoding='utf-8') as file:file.write(res.text)

打开这个txt文件,就能看到获取到的html代码。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head><link rel="miphtml" href="https://m.xinshipu.com/mip/"/><meta property="qc:admins" content="21000737476016301056375" /><meta name="baidu-site-verification" content="xBZReDnVVC" /><title>菜谱|菜谱大全|家常菜谱 - 心食谱</title><meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//ali.xinshipu.cn">
<meta charset="utf-8"/>
<meta http-equiv="Content-Language" content="zh-CN" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<meta name='apple-mobile-web-app-capable' content='yes'/>
<meta name="HandheldFriendly" content="true"/>
<meta name="MobileOptimized" content="320"/>
<meta name="google" value="notranslate"/>
<meta http-equiv="Cache-Control"content="no-siteapp" /><meta http-equiv="Cache-Control" content="no-transform" />

简单演示完之后,我们来具体学一学requests库

Requests

requests是一个用于发送http请求的库,它是个第三方库,相比与python标准库urllib、urllib3来说,使用起来方便简单、方便,操作更加人性化。简单来讲,就是requests这个库更好用。

一、请求方式

常用的请求方式有两种:get和post

1、GET请求

简单的请求方式

import requests #导入requests库
res = requests.get('https://www.xinshipu.com/') #调用requests中get方法,并将请求内容赋值给res。
#我们先来看看res是个什么对象,因为只有知道它是啥,我们才能调用相应的方法和属性。
print(type(res))

输出结果是这样的:

<class 'requests.models.Response'>

它是一个response对象。常用的属性有

  • res.status_code:返回响应状态码
import requests
res =requests.get('https://www.xinshipu.com/')
print(res.status_code)
  • res.content:把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载。
    比如下载一张图片:
import requests
#请求图片的url
res =requests.get('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F8209506413%2F1000&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1612190464&t=7fa773eed87a6929f72243908c90d5be')
with open('demo.png','wb') as file :file.write(res.content)

这样子图片就下载成功了,在代码同目录下打开它看看吧。

  • res.text:把Response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
import requests
res =requests.get('https://www.xinshipu.com/')
print(res.text)

这样返回的就是网页的源代码了。

  • res.encoding:定义response对象的编码。
    编码就相当与计算机中不同的国家语言,字符串默认编码格式为unicode,服务器先通过一种编码方式对内容进行编码,客户端获得后要对其进行解码,试想一下,如果客户端与服务器的编码方式不一样,那是不是就交流不了,就会出现乱码的现象。但是不用担心,requests库能自动识别响应内容的编码方式,然后用对应的编码方式解码,就像上面 print(res.text) 获得网页的源代码,我们并没有规定response对象的编码格式。可是,requests也有识别错误的时候,这时候我们就要自己去定义了(但是响应内容的编码我们是不知道的,所以只能慢慢试…如果你们有比较高明的方法,一定要告诉我哦)。

还有一些出现频率不高的属性和方法:

  • res.raw:原始响应体
  • res.headers:服务器响应头
  • res.json():requests中内置的json解释器
  • res.raise_for__status():响应状态码不为200时,抛出异常
  • res.url:获取请求连接
  • res.cookies:获取请求后的cookies

复杂请求方式

网页纷繁复杂,简单的请求方式肯定时满足不了我们的需求。为了能应对各种情况,requesrs库将复杂的请求方式简化为参数的形式,我们只需在请求时添加相应参数即可。参数有以下:

1、params参数

上一节中关于url的介绍中,复杂的网址在域名后面后面会有一个?号,?后面跟着各种参数,以&分隔。它到底用处是什么,举个栗子。
在qq音乐上爬取周杰伦的歌曲页面的信息,作为一名狂热的粉丝,当然不能只爬一页,这时我们就可以带上params参数发起请求。
现在的任务是:爬取qq音乐周杰伦歌单前10页
qq音乐-周杰伦,点击打开
初步尝试:

import requests
from bs4 import BeautifulSoup
res =requests.get('https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E6%9E%97%E4%BF%8A%E6%9D%B0')
res.encoding = 'utf-8'
print(res.text)

打印出来一堆html代码,ctrl+f搜索一下所在页的歌曲,发现什么也没有,我们要的歌曲信息根本就不在里面。是不是哪里搞错了,再回去看一遍elements中的html代码,发现里面是有歌曲信息的啊,对比一下获得的代码和开发者选项中的代码,发现,两者是不一样的!这是什么情况?别急,咱慢慢来。
之前在开发者选项中介绍了两个常用标签,一个是elements,另一个是network,答案就在这个network中。重新进入网站,打开开发者选项,点击network标签。刷新页面,然后会出来一堆请求。

  • 最下面一栏是请求加载相关的信息:

    1、总共加载了60个请求,其中xhr类型的有20个
    2、总共36.5kb流量,xhr24.1kb
    3、耗时6.22s
  • 最上面一栏是请求类型,主要包括:
    all:查看全部请求
    xhr: 一种不借助刷新网页即可传输数据的对象
    js: javascript脚本
    css: css代码
    img: 仅查看图片
    Media: 仅查看媒体文件
    Font: 字体
    Doc:Document,第0个请求一般在里面

拓展:xhr是什么,xhr和fetch
Network中的xhr其实是查看xhr和fetch类型的请求。
我们平时使用浏览器上网的时候,经常有这样的情况:浏览器上方,它所访问的网址没变,但是网页里却新加了内容。如购物网站,下滑自动加载出更多商品。在线翻译网站,输入中文实时变英文。这个,叫做Ajax技术。应用这种技术,好处是显而易见的——更新网页内容,而不用重新加载整个网页。又省流量又省时间的,何乐而不为。
如今,比较新潮的网站都在使用这种技术来实现数据传输。只剩下一些特别老,或是特别轻量的网站,还在用老办法——加载新的内容,必须要跳转一个新网址。
这种技术在工作的时候,会创建一个XHR(或是Fetch)对象,然后利用XHR对象来实现,服务器和浏览器之间传输数据。在这里,XHR和Fetch并没有本质区别,只是Fetch出现得比XHR更晚一些,所以对一些开发人员来说会更好用,但作用都是一样的。

  • 左侧方框里是各种请求,点击可查看其详情。
  • 右侧是请求详情页面。
  • requests url是该请求的网址
  • Query String Parameters是请求参数,也就是requests url问号后面的参数,只不过换了一种方式来表达。

network中有很多请求,当这些请求完成,他们会一起构成elements中的源代码,而之前请求的那个,只是众多请求中的一个,准确来说是第0个,然而第0个当中没有我想要的歌曲信息。有些网站,特别是那种比较老的网站,轻量级的网站,通常会把所有信息都放在第0个请求中,但是,现在的大部分网页都不会这样子了。
一般来说,第0个请求相当于骨架,它先加载出来之后,再往里面填充东西(其他请求),完善网页。
所以,我们下一步就应该从总共60个请求中找到藏有信息的那一个…
可是,哪一个才是呢?
请求类型有很多种,我们要的信息不是img,不是media,不是js,不是css,不是doc(我们刚刚请求的那个就是doc),那只可能是xhr了啊。
那就从xhr中找,20个xhr请求。还是有点多。只能慢慢筛选了(或者一个一个看…),可以点击size,给请求按大小排个序,一般比较大的里面包含信息,或者可以看名字,每个请求都有一个描述性的名字。
最终找到的那个请求是
client-serarch(客户端搜索)
找到请求了,就可以上代码了:

import requests
from bs4 import BeautifulSoup
res =requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=61909973647710437&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0')
print(res.text)

这只是第一页的歌曲信息,要获取10页,就得用到params参数了。
首先分析一下请求url的参数:

ct: 24
qqmusic_ver: 1298
new_json: 1
remoteplace: txt.yqq.song
searchid: 61909973647710437
t: 0
aggr: 1
cr: 1
catZhida: 1
lossless: 0
flag_qc: 0
p: 1
n: 10
w: 周杰伦
g_tk_new_20200303: 5381
g_tk: 5381
loginUin: 0
hostUin: 0
format: json
inCharset: utf8
outCharset: utf-8
notice: 0
platform: yqq.json
needNewCode: 0

其中:
p的值对应的是页数
w的值对应的是搜索内容
通过修改这两个参数,即可请求不同的歌手,不同的页数。

下面,说一下添加params参数的相关要求:
1、格式:

res = requests.get(url , params = params)

2、params要求是字典类型的

把Query String Parameters参数一个一个输入进去,好像有点不太好,自己想想办法看怎么简单快速一点吧,这里我自己写了个转换代码,仅供参考。

import requestsdef switch_to_dict(page):#首先把Query String Parameters赋值到文本文档中,保存名为paramsfile = open('params.txt','r',newline = '',encoding = 'utf-8')lists = file.readlines()dic ={}for row in lists:#split的时候要在冒号后面加个空格,不然字典的值前面有个空格是不行的split_list = row.split(': ')if split_list[0] == 'p':dic[split_list[0]] = str(page)else:dic[split_list[0]]=split_list[1][:-2]return dicfor page in range(10):params = switch_to_dict(page)#目标网址就是requests url,只是把后面的参数以字典的形式加上url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?'res =requests.get(url , params = params)print('------'+'第'+str(page)+'页'+'------')print(res.text)

2、headers参数

每一个请求中,都有requests headers,它是用户的请求头,描述客户端向服务器发送请求时使用的协议类型、所使用的编码、以及发送内容的长度等。检测请求头是常见的反爬虫策略,因为服务器会对请求头做一次检测来判断这次请求是人为的还是非人为的,有时候无论怎么请求,都会返回403错误,这就是原因之一。为了形成良好的编写规范,无论网站是否做headers反爬虫检测,最好每次发送请求时都添加请求头。
请求头的参数如下:

常用的参数有三个:user-agent,referer,origin
1、user-agent(用户代理)
告诉服务器客户端使用的操作系统,浏览器版本等信息。
请求头一定要添加这个参数。
2、referer:请求来自哪个页面的Url
3、origin:请求的源头
简单说,referer指的是页面的上一级页面,origin指的是最初的页面。
注意:cookie不能添加到请求头中
现在给上面的代码加上headers

headers = {'origin':'https://y.qq.com','referer':'https://y.qq.com/','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',}
res =requests.get(url , params = params,headers = headers)

拓展:练习网络请求的网站:http://httpbin.org/get。
下面,来检验一下headers是否添加上去了:

import requestsheaders = {'origin':'https://y.qq.com','referer':'https://y.qq.com/','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',}url = 'http://httpbin.org/get'
res =requests.get(url ,headers = headers)
print(res.text)

输出结果:

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "Origin": "https://y.qq.com","Referer": "https://y.qq.com/","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","X-Amzn-Trace-Id": "Root=1-5ff29a61-45fc2c384ebd50070f67ff94"},"origin": "122.96.40.82","url": "http://httpbin.org/get"
}

3、cookies

指某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据。平常在网页上登录账号的时候,会有一个弹窗询问我们是否记住账号,当我们点记住后,下次登录(一段时间内)就不用输入账户密码了。
这里就是cookie在起作用。
下面,用cookies登录豆瓣网:

import requests
from bs4 import BeautifulSoup
headers = {'referer':'https://www.douban.com/','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',}
#首先在豆瓣网上登录自己的账号,在开发者选项中找到请求的cookies,请求名为'www.douban.com'
cookie_str = '填入自己的cookies'
#创建一个cookies_jar对象,用于存储cookies信息
cookies_jar = requests.cookies.RequestsCookieJar()def cookie_to_jar():split_list = cookie_str.split(';')for info in split_list:k,v = info.split('=',1)#将cookies存入cookies_jar对象中cookies_jar.set(k,v)cookie_to_jar()url = 'https://www.douban.com/'
res =requests.get(url ,headers = headers,cookies = cookies_jar)
bs = BeautifulSoup(res.text,'html.parser')
tag1 = bs.find('a', class_ ='bn-more')
print(tag1.span.string)

4、证书验证

现在很多网站都要求使用 HTTPS 协议,但是有些网站可能并没有设置好 HTTPS 证书,或者网站的 HTTPS 证书不被 CA 机构认可,这时候,这些网站可能就会出现 SSL 证书错误的提示。
那如果我们一定要爬取这个网站怎么办呢?我们可以使用 verify 参数 控制是否验证证书,如果将其设置为 False,在请求时就不会再验证证书是否有效。如果不加 verify 参数的话,默认值是 True,会自动验证。

import requests
res =requests.get(url ,verify = False)

5、网络超时与异常

如果服务器长时间不响应,或者响应慢的话,我们可以设置响应时间,超过这个时间会引发异常,否则如果某个站点长时间不响应的话会影响爬虫的效率。

#响应时间超过0.01引发异常
res = requests.get(url,timeout = 1)

针对异常信息,requests模块提供三种网络异常捕获类:

import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException
#循环进行50次请求
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
for i in range(50):try:res = requests.get('https://www.baidu.com/',timeout = 1,headers = headers)print(res.status_code)except ReadTimeout:  #超时异常print('timeout')except HTTPError:   #HTTP异常print('httperror')except RequestException:    #请求异常print('reqerror')print(i)

6、代理服务

在爬取网页的时候,可能刚开始爬虫工作正常,但一段时间后就会诸如403forbidden、您的ip访问频率太高了等字样。原因是服务器把我们的爬虫给封禁了。设置代理可以很好的解决这一问题。

import requests      # 导入网络请求模块
# 头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/72.0.3626.121 Safari/537.36'}
proxy = {'http': 'http://117.88.176.38:3000','https': 'https://117.88.176.38:3000'}  # 设置代理ip与对应的端口号
try:# 对需要爬取的网页发送请求response = requests.get('http://202020.ip138.com', headers= headers,proxies=proxy,verify=False,timeout=3)print(response.status_code)  # 打印响应状态码
except Exception as e:print('错误异常信息为:',e)    # 打印异常信息

当然,设置代理,我们得先获取一揽子代理ip,但是有些ip是不能用的,还要进行筛选,然后存进数据库中以供调用。
想要了解更多: 用python写爬虫 代理的设置

7 session会话维持

  • session:在服务器端,用来保存用户的Session信息,cookies携带了session id 信息,服务器检查该cookies即可找到对应的session是什么,并一次来判断用户状态
  • cookies:在客户端,浏览器下次发送请求时会带上它让服务器识别出是哪个用户。
    如果每次发送请求的时候携带从cookies信息,当然也是可以的。
    现在有另一种方法,保持会话,这样就不用每次携带cookies,只要这个会话没有结束,用户状态就一直保持着。

可以发现,尽管是两次请求,但上一次设置的cookies再第二次中仍然保留,因为它处于一个session中。

import requestss = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

8 身份认证

有些网站设置了身份认证

import requests# auth参数中传入用户名和密码即可
r = requests.get('https://static3.scrape.center/', auth=('admin', 'admin'))
print(r.status_code)

2、post请求

post请求也叫提交表单,表单中的请求参数就是对应的请求参数。post提交的参数是data(注意不要与get中的params弄混淆)。
params参数对应的是网址后面的参数,显示在Query string parameters中,data参数是要向网站提交的数据,显示在Form Data中。

进入知网后,打开开发者选项,搜索关键词,找到储存信息的请求,找到Form_Data。接下来就可以上代码了。

import bs4
import requests
from bs4 import BeautifulSoup
headers = {'referer':'https://kns.cnki.net/kns8/defaultresult/index','origin':'https://kns.cnki.net','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
url = 'https://kns.cnki.net/KNS8/Brief/GetGridTableHtml'
#其中有个value值,即为我们搜索的关键字
value_dic = {"Platform":"","DBCode":"SCDB","KuaKuCode":"CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CCVD,CJFN,CCJD","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":1,"Items":[{"Title":"主题","Name":"SU","Value":"人工智能","Operate":"%=","BlurType":""}],"ChildItems":[]}]}}
value_dic['QNode']['QGroup'][0]['Items'][0]['Value'] = input('输入你想搜索的关键字')
data = {'IsSearch': 'true', 'QueryJson': str(value_dic), 'PageName': 'DefaultResult', 'DBCode': 'SCDB', 'KuaKuCodes': 'CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CCVD,CJFN,CCJD', 'CurPage': '1', 'RecordsCntPerPage': '20', 'CurDisplayMode': 'listmode', 'CurrSortField': '%e5%8f%91%e8%a1%a8%e6%97%b6%e9%97%b4%2f(%e5%8f%91%e8%a1%a8%e6%97%b6%e9%97%b4%2c%27TIME%27)', 'CurrSortFieldType': 'desc', 'IsSentenceSearch': 'fals'}res = requests.post(url,headers = headers,data = data)
bs = BeautifulSoup(res.text,'html.parser')
article_list = bs.find_all(class_="fz14")
for i in article_list:print(i.text)

1 post请求上传文件

将文件字典出传入files参数,并通过网站测试。

import requestsurl = 'http://httpbin.org/post'
files = {'file':open('test.png', 'rb')}
res_obj = requests.post(url, files=files)
print(res_obj.text)

post请求的其他参数就跟get是一样了。

参考:
风变编程-----------一个很棒的python学习网站
实战python网络爬虫-------黄永祥
python网络爬虫从入门到实践------明日科技

用python写爬虫 (三)获取数据、requests库相关推荐

  1. python获取实时基金数据由银河证券提供_我用Python写了个金融数据爬虫,半小时干了组里实习生一周的工作量...

    原标题:我用Python写了个金融数据爬虫,半小时干了组里实习生一周的工作量 最近,越来越多的研究员.基金经理甚至财务会计领域的朋友,向小编咨询:金融人需要学Python么? 事实上在2019年,这已 ...

  2. 爬虫python 科研有用吗_为什么说用python写爬虫有优势?

    之前和做Java的小伙伴聊过对比Java和python,就以这个为开头,跟大家聊聊为什么要学习python,他有哪些优势吧~ 对比Java和python,两者区别: 1.python的requests ...

  3. python 写爬虫 美女照片(一)

    无意中可看到一个爬取煎蛋网的美女照片 博客,感觉很有趣,就仿照写了个,还几个 一.安装必要的库 1.1 beautifulsoup pip install beautifulsoup4 1.2 pip ...

  4. 小猪的Python学习之旅 —— 10.三分钟上手Requests库

    小猪的Python学习之旅 -- 10.三分钟上手Requests库 标签:Python 一句话概括本文: 本节讲解Requests库的常见使用,以及一个实战项目: 扒取某一篇微信文章里所有的图片,视 ...

  5. 用Python写爬虫有哪些好处?

    大家都知道,关于爬虫几乎每种编程语言都可以实现,比如:Java.C.C++.python等都可以实现爬虫,但是之所以会选择python写爬虫,是因为python具有独特的优势.那么用python语言写 ...

  6. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  7. python定时爬虫三种方法

    python定时爬虫三种方法 第一种 import timefrom scrapy import cmdlinedef doSth():# 把爬虫程序放在这个类里 zhilian_spider 是爬虫 ...

  8. 为什么多迪技术人员都喜欢用python写爬虫?

    有更加成熟的一种爬虫脚本语言,而非框架.是通用的爬虫软件ForeSpider,内部自带了一套爬虫脚本语言.很多同学学php的,但是也自学过python,对php了解还是比较深的,为什么多迪技术人员都喜 ...

  9. python基础代码库-python爬虫基础教程:requests库(二)代码实例

    get请求 简单使用 import requests ''' 想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载! ''' respons ...

  10. python+mysql库+json_用python写爬虫-5.1json用pandas入mysql库

    pandas是一个数据处理模块,前面也已经提到了好些,用python写爬虫--4.5pandas存入excel. 这次来统一说一说,使用感想. pandas主要是Seriers和Dataframe,S ...

最新文章

  1. 微软成功抵御峰值高达 2.4Tbps 的 DDoS 攻击
  2. Let's Encrypt 免费SSL配置
  3. webView 点击连接如何不让跳转到系统的 浏览器
  4. mysql优化概述4
  5. StarField模拟星空
  6. 美国留学计算机 奖学金,美国留学 计算机专业奖学金申请解析
  7. LINUX操作系统的内核编译内幕详解一
  8. JavaScript Promise对象
  9. IS-IS详解(一)——IS-IS基础
  10. Windows10中安装VMware Workstation Pro 15.x与使用Ubuntu 20.04 LTS
  11. 强化学习平台安装 Mujoco、mujoco-py、gym、baseline
  12. AntennaHome Launch 5G Combo Internal PCB Antenna /5G 全频 PCB天线
  13. 测试地势高低的手机软件_能测量海拔高度的手机软件有哪些?
  14. 基于Python语言豆瓣电影数据挖掘与分析
  15. 计算机一黑屏就显示当前账户已锁定,电脑黑屏用户已锁定账户怎么办?
  16. 【MC 网易-我的世界-mod开发基础笔记】 --- 常用的在线工具
  17. 微信扫描下载提示以及js判断用户手机系统
  18. word标题设置级别
  19. echarts 不显示x轴与y轴 及 x 、y 轴样式自定义
  20. 俄罗斯钓鱼服务器位置,俄罗斯钓鱼4《RussianFishing4》钓鱼地点攻略

热门文章

  1. 奥斯汀计算机专业排名,德克萨斯大学奥斯汀分校
  2. 计算机教室最适合的植物,适合放电脑前的植物 电脑前放什么植物比较好
  3. javascript中的交互效果
  4. 囍囍囍~~~ 以后可能用的着
  5. 李彦宏计算机领域的贡献,李彦宏:AI让计算机懂得人、响应人的需求
  6. 天牛须和贪心算法_BAS_optimization 天牛须算法的简单编写 - 下载 - 搜珍网
  7. 5分钟了解英文SEO做外链的正确姿势
  8. 根据VendorId 和DeviceId 查看PCI设备的名称
  9. 如何调换手机桌面位置_手机桌面很乱怎么整理?简单七招让你效率更高!
  10. 南京软件企业挨个介绍及计算机学习的一点经验交流