文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)

1、实例化采集类后,自带一些header信息,类似user-agent、accept之类的,能不手动添加就不手动添加(已实现)

2、在执行了采集后,获取采集到的响应头,解析其中的数据,该记录的记录该执行的执行,在下次调用采集方法时继承获取到的信息(已实现)

3、可以采集纯文本内容,也可以采集二进制流,方便采集页面和下载相关文档(已实现)

4、支持不同的字符编码,响应编码,比如gbk、utf8等,比如gzip、deflate等(已实现)

5、支持不同的请求方法,比如get、put、post、delete、head等(已实现)

6、不管是否采集异常,都能返回状态码(已实现)

7、可以伪造、添加各种头信息,伪造、添加cookie之类的信息,类似 Oauth:xxxx,Signture:xxx等

8、支持301、302之类的自动跳转采集,支持meta自动跳转采集

9、自动完成网址补全,不需要我们在根据采集目标,提取到链接后自己再计算

10、如果可以,尽量支持异步采集

11、如果可以,尽量支持事件委托

12、如果可以,尽量支持proxy

13、如果可以,尽量支持断点续传下载和上传

前一片文章我们建立了一个自定义的爬虫类,已经实现了部分需求了,本文将继续实现剩余的需求。在继续修改我们的类之前,先谈谈spyder。

-----------------------------

为什么要先聊聊spyder呢,主要是因为,老顾找不到一个完整的python包的使用手册,资料都是太零碎的东西,整理起来很麻烦,没有像php手册,或者msdn命名空间介绍一样的东西。就像之前几篇文章一样,每次想做的什么,都要先百度半天,结果本系列文章极度难产。那么spyder有什么好聊的呢?我们来看看。。。

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第1张图片

打开spyder,如界面所示,他分成了几个不同的区域,通常,我们都在左边输入py代码,右下可以看输出结果,右上。。。没好好利用起来啊

比如左侧,我们输入一段代码

[n for n in range(1,100)]

选中并执行这段代码(F9),右下控制台就可以出现反馈信息

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第2张图片

这是一个很方便的调试方法了,当代码中存在交互指令,例如input的时候,右下控制台可以进行交互操作,录入一些信息,这个就不多说了,大家都会用

然后,来想办法利用上右上区域,来辅助我们的学习和工作

在代码区域输入代码

import requests
req = requests()

然后将鼠标指向 requests()这个方法,界面发生变动了

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第3张图片

当我们在浮动的这个提示上点一下后,右上区域就发生了内容改变,Help页里出现了好多信息

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第4张图片

嗯。。。这就很方便了,可以查看方法的具体使用方式了,可惜的是,他并没有像vs里一样,将类的方法全部列出,只能靠类.,然后等待spyder响应后,出现可以使用的属性或方法,然后去选择我们可能需要的内容

现在,我们把指令修改下

import requests
req = requests.Request(url='https://www.baidu.com',method='GET')

运行这些代码,将右上的区域切换到变量资源管理器里(Variable Explorer)

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第5张图片

我们在左侧运行的代码所产生的变量,都会在这里列出,只要没有清除,关闭,一直就保留在这里了,比如刚才的req,我们就可以看到的他描述,用鼠标双击这个变量看看

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第6张图片

这个就是一个比较完整的实例属性和方法了,他里面将这个实例所有可用的方法和属性列出,并可展开查看,这样,就能避免之前我们找不到方法的问题了,直接给一个变量赋值成该类,然后到这边查看,是不是可以代替了vs里的对象浏览器了。

嗯,就简单的说两句spyder,毕竟老顾学python完全是自己摸索,而且岁数大了,看其他视频感觉很不适应,所以就慢慢来吧。至于其他的python 相关的IDE有没有提供这样的查阅方式,老顾也不了解,刚转行的同学们可以自行摸索。然后,我们回归主题,继续搞我们的爬虫类。

------------------------------------------------

7、可以伪造、添加各种头信息,伪造、添加cookie之类的信息,类似 Oauth:xxxx,Signture:xxx等

一般来说,同一个站点很少有需要频繁改动头信息,cookie信息的地方,反爬的网站咱们另说,等进入采集实战的时候再进行应对,咱先说普通的网站。所以,实例化一次,并设置好这些信息,基本上这个实例就可以进行整站采集了,线程问题以后再说。

那么,我们这次把目光瞄准到天眼查这个站,试着根据他的响应,来调整我们的代码,使之能伪造cookie,接收header

先来次没调整前的采集

from spider import Ajax

ajax = Ajax()
html = ajax.Http('https://www.tianyancha.com',Ajax.Method.GET)
print(ajax.status,html)

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第7张图片

很好,可以正常采集天眼查首页,但我们知道,天眼查会返回一些cookie信息,我们现在并没有接收,所以,进行下查找,看看cookie到底存放在哪里

因为对各种包都不熟悉,所以先在爬虫类里面添加两个属性

	@property
	def ResposeHeader(self):
		return self.__headers
	
	@property
	def Session(self):
		return self.__session

一个是用来返回响应头信息的,一个是用来返回会话信息的,让我们看看

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第8张图片

好家伙。。。响应头居然有这么多数据么?548个?哦,展开一看,没那么多,548字节啊,吓我一大跳。

把响应头信息粘贴出来,整理一下看看

{
'Date': 'Wed, 30 Jun 2021 02:25:43 GMT', 
'Content-Type': 'text/html; charset=utf-8', 
'Transfer-Encoding': 'chunked', 
'Connection': 'keep-alive', 
'Set-Cookie': 'aliyungf_tc=8e44b1cb0fc5f37d29864918aa197ec6ed802b989655bf8732efdcd291861558; Path=/; HttpOnly, acw_tc=76b20f8c16250199433016427e4b75bd21ba7840934a083d22e010ebf1aedd;path=/;HttpOnly;Max-Age=1800, csrfToken=s4i4TN-WIKaLgWAXW3qHwbK5; path=/; secure, TYCID=784de430d94a11eb8216f7b2b73bb5b3; path=/; expires=Fri, 30 Jun 2023 02:25:43 GMT; domain=.tianyancha.com', 
'Content-Encoding': 'gzip'
}

哦吼,发现第一个关键信息,Set-Cookie,这个就是服务器发给浏览器的cookie信息了,Set-Cookie是其中的一种方式,记下,一会处理

然后,再看看会话里都有什么

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第9张图片

很显然,会话里也保持了cookies的信息,里面有4个cookie了

print(ajax.Session.cookies)

, , , ]>

得到了一个不知道什么对象的列表,先不管,总之,这里也有cookies,所以,现在我们需要自己定义一个cookies变量,存储这些信息,并在下次采集时继承进来,嗯,也得支持从外边添加cookie。另外,老顾注意到了这个cookie里的domain问题,伪造cookie,domain信息也很重要哦,参考老顾的另一个文章https://blog.csdn.net/superwfei/article/details/9198283?spm=1001.2014.3001.5502,部分网站对cookie验证时,会更严格一些,对不再特定domian的cookie是不予承认的,期待python的cookie处理。。。。

在__init__里,追加一个属性

self.cookies = requests.utils.cookiejar_from_dict({})

然后,我们就可以通过实例添加cookie了

import re
from spider import Ajax

ajax = Ajax()
# 为了获取初始cookie,先访问下天眼查首页
ajax.Http('https://www.tianyancha.com')
ajax.cookies.set('tyc-user-info', '{***********}', domain='.tianyancha.com')
ajax.cookies.set('auth_token', '****************', domain='.tianyancha.com')
html = ajax.Http('https://www.tianyancha.com/company/2968548568',Ajax.Method.GET)
# 显示现在已有cookies
print(ajax.cookies)
print(re.findall(r'
[\s\S]*?(?=
)',html,re.I))

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第10张图片

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第11张图片

很好,cookie伪造成功了,对于域名带前缀点的问题直接就不是问题,证据就是,他没提示登录,其次,电话号码没有星号隐藏。

在这段代码中,我们使用了两次Http方法,第一次是获取初始cookie,如果没有初始cookie,那么我们就需要通过cookies.set方法,自己添加初始cookie,老顾懒得添加,让他自动获取好了,然后第二次采集前,我们追加了两个cookie,并继承了第一次采集的cookie,所以,正确得到了我们的期望结果,而cookie在同一实例内,只需要添加一次,我们这个ajax实例再次使用Http访问天眼查其他企业信息时,就不需要再关注cookie信息了。

剩下的就是伪造请求头了,之前,我们的Header定义,是一个固定的词典,现在要对他进行改装一下,变成动态的词典,同样,在__init__里追加两个赋值

		self.__requestHeaders = {}
		self.__refreshRequestHeaders()

调整Header属性的实现

	@property
	def Header(self):
		return self.__requestHeaders

然后,增加一个私有方法,用来初始化请求头信息

	def __refreshRequestHeaders(self):
		self.__requestHeaders.update({'refer':self.refer
			,'user-agent':self.agent
			,'accept':self.accept
			,'accept-encoding':self.encoding
			,'accept-language':self.lang
			,'cache-control':self.cache})

最后,我们给Ajax类增加一个公开的方法,AddHeader,用来将信息添加到请求头中

	def AddHeader(self,key:str = None,val:str = None,dic:dict = None):
		if dic != None and isinstance(dic,dict):
			self.__requestHeaders.update(dic)
		if key != None and val != None:
			self.__requestHeaders.update({key:val})
from spider import Ajax

ajax = Ajax()
ajax.AddHeader(dic={'oauth':'userinfo'})
ajax.AddHeader('pwd','***')
print(ajax.Header)

运行一下,看看结果

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第12张图片

很好,请求头信息已更新了,虽然有时候需要删除一些请求头,我这里就不去实现了,大家有需求的话,自行实现就可以了,那么第七个需求也告一段落了,下边开始处理跳转问题。

8、支持301、302之类的自动跳转采集,支持meta自动跳转采集

让我们找一个带跳转的网址,比如:http://m6z.cn/6uVNKg,一个用短链接生成器生成的地址

来,我们尝试下,这个请求会发生什么

from spider import Ajax
ajax = Ajax()
html = ajax.Http('http://m6z.cn/6uVNKg')
print(ajax.status,ajax.ResposeHeader)
print(html)

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第13张图片

他自动跳过去了!返回的状态码也是200!中间301、302的过程省略掉了!https://blog.csdn.net/qq_36145663/article/details/101703090,原来,你不想自动301、302,还得设置这个参数allow_redirects=False,算了,让他自动跳吧,不过,我们还是加一个开关,可以用来关闭这个自动跳转,在__init__里追加一个属性

self.redirect = True

在发送请求位置修改 send 参数

res = self.__session.send(request=pre,allow_redirects=self.redirect)

然后就可以成功的禁止自动301,302了

然后,自动跳转,还需要支持meta的跳转,这个稍后再说吧,因为不管是meta跳转,还是js跳转,都涉及到一个网址补全的问题,咱们先解决了这个,再回来支持meta跳转和js跳转

9、自动完成网址补全,不需要我们在根据采集目标,提取到链接后自己再计算

在日常采集过程中,我们经常会碰到页面内链接地址缺少域名,有的则是有域名但没有协议。。。还有其他各种不应该出现的协议。。。。HMMMMMMM,反正经历的多了,自然就知道

这次,我们用政采网ccgp.gov.cn的首页来实验一下

from spider import Ajax
ajax = Ajax()
#html = ajax.Http('http://news.baidu.com/ns?word=school&ie=gb2312&cl=2&rn=20&ct=0&tn=newsrss&class=0')
html = ajax.Http('http://www.ccgp.gov.cn/')
print(html)

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第14张图片

可以看到,页面内N多的链接都是没有网址的,所以,我们需要在采集的时候就处理掉,得到的完整的链接地址,方便我们后续处理。这个时候,该正则大显身手了。对了,在做这个补全之前,我们看看scrapy有没有补全,好像用scrapy的人很多。

行吧,咱也来次最简单的 scrapy 采集,不管那么多,只采集各首页看看

先在命令行运行几个指令

d:\>pip install scrapy

d:\>scrapy startproject ccgp

d:\>cd ccgp

d:\ccgp>scrapy genspider ccgp_gather www.ccgp.gov.cn

的确是很简单就建立了一个针对 ccgp 的采集

然后修改其中一些文件

找到 settings.py,修改 robotstxt_obey,不验证robots.txt

找到 middlewares.py,修改 process_request 方法,在这里追加上 user-agent 信息

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第15张图片

找到 ccgp_gather.py,修改 parse 方法,保存我们采集到的首页内容

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第16张图片

然后回到命令行,运行采集

d:\ccgp>scrapy crawl ccgp_gather

很好,这个页面被采集下来了,我们来瞅瞅看

文盲的Python入门日记:第二十八天,封装一个自定义爬虫类,用来执行日常的采集(二)_第17张图片

得嘞,他也没有进行url补全,顺带一说,感觉用 scrapy 做采集相对来说更麻烦了一点,我以前已经建立了n多的xml,针对自己的采集规则有完整的内容了,什么翻页采集,什么时间范围内采集,什么标题过滤,我们做采集,很少有整站采集,也很少有无脑采集,所以这个scrapy如果要实现以上这些需求,感觉还是挺麻烦的,每个站点都这么搞一次。。。我不如把所有站点信息放到一个xml里,用统一的规则,使用自己的爬虫解析器来一次采集多个站点。总而言之,scrapy和老顾是有缘无分了。但是,如果使用scrapy也并不影响阅读本文哦,大家可不要放弃继续阅读哦。

回到我们自己的url补全上来,再在 Ajax 类里追加一个私有方法 __url_complemented,在 http方法,return html 前,用这个方法修正一下再返回

嗯。。。。。分析下,哪些地方是url?同学们自己列举下哦

有 href ,很常见的,a标签,link 标签

有 src ,也很常见的,script标签,img标签,embed等

还有一些容易被忽略的,url,存在于style中,样式文件中,meta中。。。。

以及更不容易发现的,location,open,存在于 js 之中。。。。action,存在于 form 标签

好了好了,越说越复杂了。。。我这里仅仅先实现前两个啊,再加一个meta,其他的我不考虑哦

做url补全其实也很简单,用正则把 url 提取出来,验证 url 是否是合法的 url,当然特例要排除,什么 about:blank 啦,什么 file:/// 这种本地文件啦,什么 base64 数据(图片src可能会有这个情况)啦。。。总之,只对需要进行补全的 url 进行计算,人本身已经是带协议的就不再操作了

哪些需要补全呢?

1、没有带协议的,比如 //blog.csdn.net,鬼知道他是 http还是https。。。其实这个是由当前页面协议决定的,你在 http域名页面点这个链接,这个结果就是 http://blog.csdn.net,你在https域名页面点开这个链接,结果就是 https://blog.csdn.net

2、链接地址路径不全的,比如 /superwfei,需要补全上域名,得到 blog.csdn.net/superwfei。这种情况相对来说比较复杂,有可能会碰到需要路径计算的时候,比如 ../../../image/xxx.shtml,也有可能碰到不太规范的路径 ..../image/xxx.shtml

老顾碰到的基本就这两种情况,如果有其它情况的,可以告知老顾,再继续研究研究

下面是实现代码 

	def __url_complemented(self,html):
		html = re.sub('''(url|src|href)\\s*=\\s*(['"]?)([^'"]*)(\\2|[\\s\\r\\n\\t])''',self.__url_replace,html,count=0,flags=re.I)
		return html

	def __url_replace(self,m):
		url = m.group(3).strip()
		# about:setting、about:blank 类型的,javascript:void(0) 类型的,#类型的,原样返回
		if re.search('^(#.*|javascript:.*|[a-z_-]+:[a-z_-]+)$',url,re.I):
			return m.string[m.span()[0]:m.span()[1]]
		# 带有协议的,原样返回,例如 https://、ftp://、file://、tencent://等
		if re.search('^[a-z]+://',url,re.I):
			return m.string[m.span()[0]:m.span()[1]]
		# base64 格式,原样返回
		if re.search('^base64',url,re.I):
			return m.string[m.span()[0]:m.span()[1]]
		root = re.sub(r'^([a-z]+:/{2,}[^/]+).*','\\1/',self.current_url.strip(),re.I)
		if re.search('^/(?!/)',url,re.I):
			url = re.sub('^/',root,url,re.I)
		elif re.search('^//',url):
			url = re.sub('^([a-z]+:)//.*$','\\1',root,re.I) + url
		else:
			path = re.sub('/[^/]*$','',self.current_url) + '/'
			p = re.search(r'^[\./]+',url,re.I)
			if p:
				# 具有 ./ 计算路径
				# 获取开头的全部计算路径
				p = p.string[p.span()[0]:p.span()[1]]
				# 去掉路径中 ./ 后,剩余的点的数量,就是路径向上路径的层级
				p = re.sub(r'\./','',p)
				# 获得剩余点的数量,得到层级
				p = len(p)
				pth = path
				for i in range(p):
					pth = re.sub('[^/]+/','',pth,re.I)
				if len(pth)
                    
                    
  • 使用Faiss进行高效相似度搜索 llzwxh888 faisspython
    在现代AI应用中,快速和高效的相似度搜索是至关重要的。Faiss(FacebookAISimilaritySearch)是一个专门用于快速相似度搜索和聚类的库,特别适用于高维向量。本文将介绍如何使用Faiss来进行相似度搜索,并结合Python代码演示其基本用法。什么是Faiss?Faiss是一个由FacebookAIResearch团队开发的开源库,主要用于高维向量的相似性搜索和聚类。Faiss
  • python是什么意思中文-在python中%是什么意思 编程大乐趣
    Python中%有两种:1、数值运算:%代表取模,返回除法的余数。如:>>>7%212、%操作符(字符串格式化,stringformatting),说明如下:%[(name)][flags][width].[precision]typecode(name)为命名flags可以有+,-,''或0。+表示右对齐。-表示左对齐。''为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填
  • Day1笔记-Python简介&标识符和关键字&输入输出 ~在杰难逃~ Pythonpython开发语言大数据数据分析数据挖掘
    大家好,从今天开始呢,杰哥开展一个新的专栏,当然,数据分析部分也会不定时更新的,这个新的专栏主要是讲解一些Python的基础语法和知识,帮助0基础的小伙伴入门和学习Python,感兴趣的小伙伴可以开始认真学习啦!一、Python简介【了解】1.计算机工作原理编程语言就是用来定义计算机程序的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作,编程
  • python八股文面试题分享及解析(1) Shawn________ python
    #1.'''a=1b=2不用中间变量交换a和b'''#1.a=1b=2a,b=b,aprint(a)print(b)结果:21#2.ll=[]foriinrange(3):ll.append({'num':i})print(11)结果:#[{'num':0},{'num':1},{'num':2}]#3.kk=[]a={'num':0}foriinrange(3):#0,12#可变类型,不仅仅改变
  • 每日算法&面试题,大厂特训二十八天——第二十天(树) 肥学 ⚡算法题⚡面试题每日精进java算法数据结构
    目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章
  • Python快速入门 —— 第三节:类与对象 孤华暗香 Python快速入门python开发语言
    第三节:类与对象目标:了解面向对象编程的基础概念,并学会如何定义类和创建对象。内容:类与对象:定义类:class关键字。类的构造函数:__init__()。类的属性和方法。对象的创建与使用。示例:classStudent:def__init__(self,name,age,major):self.name&#
  • pyecharts——绘制柱形图折线图 2224070247 信息可视化pythonjava数据可视化
    一、pyecharts概述自2013年6月百度EFE(ExcellentFrontEnd)数据可视化团队研发的ECharts1.0发布到GitHub网站以来,ECharts一直备受业界权威的关注并获得广泛好评,成为目前成熟且流行的数据可视化图表工具,被应用到诸多数据可视化的开发领域。Python作为数据分析领域最受欢迎的语言,也加入ECharts的使用行列,并研发出方便Python开发者使用的数据
  • Python 实现图片裁剪(附代码) | Python工具 剑客阿良_ALiang
    前言本文提供将图片按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章:windowsffmpeg安装部署_阿良的博客-CSDN博客本文主要使用到的不是ffmpeg,而是ffprobe也在上面这篇文章中的zip包中。ffmpy安装:pipinstallffmpy-ihttps://pypi.douban.com/simple代码不废话了,上代码
  • 【华为OD技术面试真题 - 技术面】- python八股文真题题库(4) 算法大师 华为od面试python
    华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法
  • python os 环境变量 CV矿工 python开发语言numpy
    环境变量:环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过os.environ.get()取出来就行了。os.environ是一个环境变量的字典。环境变量的相关操作importos"""设置/修改环境变量:os.environ[‘环境变量名称’]=‘环境变量值’#其中key和value均为string类
  • Python爬虫解析工具之xpath使用详解 eqa11 python爬虫开发语言
    文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门
  • ARM驱动学习之基础小知识 JT灬新一 ARM嵌入式arm开发学习
    ARM驱动学习之基础小知识•sch原理图工程师工作内容–方案–元器件选型–采购(能不能买到,价格)–原理图(涉及到稳定性)•layout画板工程师–layout(封装、布局,布线,log)(涉及到稳定性)–焊接的一部分工作(调试阶段板子的焊接)•驱动工程师–驱动,原理图,layout三部分的交集容易发生矛盾•PCB研发流程介绍–方案,原理图(网表)–layout工程师(gerber文件)–PCB板
  • 【华为OD技术面试真题 - 技术面】- python八股文真题题库(1) 算法大师 华为od面试python
    华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选1.数据预处理流程数据预处理的主要步骤工具和库2.介绍线性回归、逻辑回归模型线性回归(LinearRegression)模型形式:关键点:逻辑回归(LogisticRegression)模型形式:关键点:参数估计与评估:3.python浅拷贝及深拷贝浅拷贝(Shal
  • nosql数据库技术与应用知识点 皆过客,揽星河 NoSQLnosql数据库大数据数据分析数据结构非关系型数据库
    Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
  • 《Python数据分析实战终极指南》 xjt921122 python数据分析开发语言
    对于分析师来说,大家在学习Python数据分析的路上,多多少少都遇到过很多大坑**,有关于技能和思维的**:Excel已经没办法处理现有的数据量了,应该学Python吗?找了一大堆Python和Pandas的资料来学习,为什么自己动手就懵了?跟着比赛类公开数据分析案例练了很久,为什么当自己面对数据需求还是只会数据处理而没有分析思路?学了对比、细分、聚类分析,也会用PEST、波特五力这类分析法,为啥
  • Python中深拷贝与浅拷贝的区别 yuxiaoyu.
    转自:http://blog.csdn.net/u014745194/article/details/70271868定义:在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复
  • Python开发常用的三方模块如下: 换个网名有点难 python开发语言
    Python是一门功能强大的编程语言,拥有丰富的第三方库,这些库为开发者提供了极大的便利。以下是100个常用的Python库,涵盖了多个领域:1、NumPy,用于科学计算的基础库。2、Pandas,提供数据结构和数据分析工具。3、Matplotlib,一个绘图库。4、Scikit-learn,机器学习库。5、SciPy,用于数学、科学和工程的库。6、TensorFlow,由Google开发的开源机
  • TDengine 签约前晨汽车,解锁智能出行的无限潜力 涛思数据(TDengine) tdengine汽车大数据
    在全球汽车产业转型升级的背景下,智能网联和新能源技术正迅速成为商用车行业的重要发展方向。随着市场对环保和智能化需求的日益增强,企业必须在技术创新和数据管理上不断突破,以满足客户对高效、安全和智能出行的期待。在这一背景下,前晨汽车凭借其在新能源智能商用车领域的前瞻性布局和技术实力,成为行业中的佼佼者。前晨汽车采用整车数据采集和全车数据打通策略,能够实时将数据推送至APP端客户。然而,这导致整体写入和
  • Python编译器 鹿鹿~ Python编译器Pythonpython开发语言后端
    嘿嘿嘿我又来了啊有些小盆友可能不知道Python其实是有编译器的,也就是PyCharm。你们可能会问到这个是干嘛的又不可以吃也不可以穿好像没有什么用,其实你还说对了这个还真的不可以吃也不可以穿,但是它用来干嘛的呢。用来编译你所打出的代码进行运行(可能这里说的有点不对但是只是个人认为)现在我们来说说PyCharm是用来干嘛的。PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Pyt
  • 一文掌握python面向对象魔术方法(二) 程序员neil pythonpython开发语言
    接上篇:一文掌握python面向对象魔术方法(一)-CSDN博客目录六、迭代和序列化:1、__iter__(self):定义迭代器,使得类可以被for循环迭代。2、__getitem__(self,key):定义索引操作,如obj[key]。3、__setitem__(self,key,value):定义赋值操作,如obj[key]=value。4、__delitem__(self,key):定义
  • 一文掌握python常用的list(列表)操作 程序员neil pythonpython开发语言
    目录一、创建列表1.直接创建列表:2.使用list()构造器3.使用列表推导式4.创建空列表二、访问列表元素1.列表支持通过索引访问元素,索引从0开始:2.还可以使用切片操作访问列表的一部分:三、修改列表元素四、添加元素1.append():在末尾添加元素2.insert():在指定位置插入元素五、删除元素1.del:删除指定位置的元素2.remove():删除指定值的第一个匹配项3.pop():
  • Python实现简单的机器学习算法 master_chenchengg pythonpython办公效率python开发IT
    Python实现简单的机器学习算法开篇:初探机器学习的奇妙之旅搭建环境:一切从安装开始必备工具箱第一步:安装Anaconda和JupyterNotebook小贴士:如何配置Python环境变量算法初体验:从零开始的Python机器学习线性回归:让数据说话数据准备:从哪里找数据编码实战:Python实现线性回归模型评估:如何判断模型好坏逻辑回归:从分类开始理论入门:什么是逻辑回归代码实现:使用skl
  • 矩阵求逆(JAVA)利用伴随矩阵 qiuwanchi 利用伴随矩阵求逆矩阵
    package gaodai.matrix; import gaodai.determinant.DeterminantCalculation; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * 矩阵求逆(利用伴随矩阵) * @author 邱万迟
  • 单例(Singleton)模式 aoyouzi 单例模式Singleton
    3.1           概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式。这种情况在我们应用中经常碰到,例如缓存池,数据库连接池,线程池,一些应用服务实例等。在多线程环境中,为了保证实例的唯一性其实并不简单,这章将和读者一起探讨如何实现单例模式。 3.2
  • [开源与自主研发]就算可以轻易获得外部技术支持,自己也必须研发 comsci 开源
          现在国内有大量的信息技术产品,都是通过盗版,免费下载,开源,附送等方式从国外的开发者那里获得的。。。。。。        虽然这种情况带来了国内信息产业的短暂繁荣,也促进了电子商务和互联网产业的快速发展,但是实际上,我们应该清醒的看到,这些产业的核心力量是被国外的
  • 页面有两个frame,怎样点击一个的链接改变另一个的内容 Array_06 UIXHTML
    <a src="地址"  targets="这里写你要操作的Frame的名字" />搜索 然后你点击连接以后你的新页面就会显示在你设置的Frame名字的框那里 targerts="",就是你要填写目标的显示页面位置 ===================== 例如: <frame src=&
  • Struts2实现单个/多个文件上传和下载 oloz 文件上传struts
    struts2单文件上传:     步骤01:jsp页面 <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data,不然就会以二进制文本上传到服务器端-->   <form action="fileUplo
  • 推荐10个在线logo设计网站 362217990 logo
    在线设计Logo网站。 1、http://flickr.nosv.org(这个太简单) 2、http://www.logomaker.com/?source=1.5770.1 3、http://www.simwebsol.com/ImageTool 4、http://www.logogenerator.com/logo.php?nal=1&tpl_catlist[]=2 5、ht
  • jsp上传文件 香水浓 jspfileupload
    1. jsp上传 Notice: 1. form表单 method 属性必须设置为 POST 方法 ,不能使用 GET 方法 2. form表单 enctype 属性需要设置为 multipart/form-data 3. form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址或者servlet地址。例如 uploadFile.jsp 程序文件用来处理上传的文
  • 我的架构经验系列文章 - 前端架构 agevs JavaScriptWeb框架UIjQuer
    框架层面:近几年前端发展很快,前端之所以叫前端因为前端是已经可以独立成为一种职业了,js也不再是十年前的玩具了,以前富客户端RIA的应用可能会用flash/flex或是silverlight,现在可以使用js来完成大部分的功能,因此js作为一门前端的支撑语言也不仅仅是进行的简单的编码,越来越多框架性的东西出现了。越来越多的开发模式转变为后端只是吐json的数据源,而前端做所有UI的事情。MVCMV
  • android ksoap2 中把XML(DataSet) 当做参数传递 aijuans android
    我的android app中需要发送webservice ,于是我使用了 ksop2 进行发送,在测试过程中不是很顺利,不能正常工作.我的web service 请求格式如下     [html]  view plain copy   <Envelope xmlns="http://schemas.
  • 使用Spring进行统一日志管理 + 统一异常管理 baalwolf spring
    统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影! 统一日志异常实现类: [java]  view plain copy   package com.pilelot.web.util;      impor
  • Android SDK 国内镜像 BigBird2012 android sdk
    一、镜像地址: 1、东软信息学院的 Android SDK 镜像,比配置代理下载快多了。 配置地址, http://mirrors.neusoft.edu.cn/configurations.we#android 2、北京化工大学的: IPV4:ubuntu.buct.edu.cn  IPV4:ubuntu.buct.cn IPV6:ubuntu.buct6.edu.cn
  • HTML无害化和Sanitize模块 bijian1013 JavaScriptAngularJSLinkySanitize
    一.ng-bind-html、ng-bind-html-unsafe         AngularJS非常注重安全方面的问题,它会尽一切可能把大多数攻击手段最小化。其中一个攻击手段是向你的web页面里注入不安全的HTML,然后利用它触发跨站攻击或者注入攻击。         考虑这样一个例子,假设我们有一个变量存
  • [Maven学习笔记二]Maven命令 bit1129 maven
    mvn compile compile编译命令将src/main/java和src/main/resources中的代码和配置文件编译到target/classes中,不会对src/test/java中的测试类进行编译 MVN编译使用 maven-resources-plugin:2.6:resources maven-compiler-plugin:2.5.1:compile &nbs
  • 【Java命令二】jhat bit1129 Java命令
    jhat用于分析使用jmap dump的文件,,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。 jhat默认开启监听端口7000的HTTP服务,jhat是Java Heap Analysis Tool的缩写 1. 用法: [hadoop@hadoop bin]$ jhat -help Usage: jhat [-stack <bool&g
  • JBoss 5.1.0 GA:Error installing to Instantiated: name=AttachmentStore state=Desc ronin47
    进到类似目录 server/default/conf/bootstrap,打开文件 profile.xml找到: Xml代码<bean    name="AttachmentStore"  class="org.jboss.system.server.profileservice.repository.AbstractAtta
  • 写给初学者的6条网页设计安全配色指南 brotherlamp UIui自学ui视频ui教程ui资料
    网页设计中最基本的原则之一是,不管你花多长时间创造一个华丽的设计,其最终的角色都是这场秀中真正的明星——内容的衬托     我仍然清楚地记得我最早的一次美术课,那时我还是一个小小的、对凡事都充满渴望的孩子,我摆放出一大堆漂亮的彩色颜料。我仍然记得当我第一次看到原色与另一种颜色混合变成第二种颜色时的那种兴奋,并且我想,既然两种颜色能创造出一种全新的美丽色彩,那所有颜色
  • 有一个数组,每次从中间随机取一个,然后放回去,当所有的元素都被取过,返回总共的取的次数。写一个函数实现。复杂度是什么。 bylijinnan java算法面试
    import java.util.Random; import java.util.Set; import java.util.TreeSet; /** * http://weibo.com/1915548291/z7HtOF4sx * #面试题#有一个数组,每次从中间随机取一个,然后放回去,当所有的元素都被取过,返回总共的取的次数。 * 写一个函数实现。复杂度是什么
  • struts2获得request、session、application方式 chiangfai application
    1、与Servlet API解耦的访问方式。 a.Struts2对HttpServletRequest、HttpSession、ServletContext进行了封装,构造了三个Map对象来替代这三种对象要获取这三个Map对象,使用ActionContext类。 ----->   package pro.action; import java.util.Map; imp
  • 改变python的默认语言设置 chenchao051 python
    import sys sys.getdefaultencoding()  可以测试出默认语言,要改变的话,需要在python lib的site-packages文件夹下新建: sitecustomize.py, 这个文件比较特殊,会在python启动时来加载,所以就可以在里面写上: import sys sys.setdefaultencoding('utf-8') &n
  • mysql导入数据load data infile用法 daizj mysql导入数据
    我们常常导入数据!mysql有一个高效导入方法,那就是load data infile 下面来看案例说明 基本语法: load data  [low_priority] [local] infile 'file_name txt' [replace | ignore] into table tbl_name [fields [terminated by't'] [OPTI
  • phpexcel导入excel表到数据库简单入门示例 dcj3sjt126com PHPExcel
    跟导出相对应的,同一个数据表,也是将phpexcel类放在class目录下,将Excel表格中的内容读取出来放到数据库中 <?php error_reporting(E_ALL); set_time_limit(0); ?> <html> <head> <meta http-equiv="Content-Type"
  • 22岁到72岁的男人对女人的要求 dcj3sjt126com
    22岁男人对女人的要求是:一,美丽,二,性感,三,有份具品味的职业,四,极有耐性,善解人意,五,该聪明的时候聪明,六,作小鸟依人状时尽量自然,七,怎样穿都好看,八,懂得适当地撒娇,九,虽作惊喜反应,但看起来自然,十,上了床就是个无条件荡妇。 32岁的男人对女人的要求,略作修定,是:一,入得厨房,进得睡房,二,不必服侍皇太后,三,不介意浪漫蜡烛配盒饭,四,听多过说,五,不再傻笑,六,懂得独
  • Spring和HIbernate对DDM设计的支持 e200702084 DAO设计模式springHibernate领域模型
    A:数据访问对象     DAO和资源库在领域驱动设计中都很重要。DAO是关系型数据库和应用之间的契约。它封装了Web应用中的数据库CRUD操作细节。另一方面,资源库是一个独立的抽象,它与DAO进行交互,并提供到领域模型的“业务接口”。    资源库使用领域的通用语言,处理所有必要的DAO,并使用领域理解的语言提供对领域模型的数据访问服务。
  • NoSql 数据库的特性比较 geeksun NoSQL
    Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。目前由VMware主持开发工作。   1. 数据模型 作为Key-value型数据库,Redis也提供了键(Key)和值(Value)的映射关系。除了常规的数值或字符串,Redis的键值还可以是以下形式之一: Lists (列表) Sets
  • 使用 Nginx Upload Module 实现上传文件功能 hongtoushizi nginx
    转载自: http://www.tuicool.com/wx/aUrAzm   普通网站在实现文件上传功能的时候,一般是使用Python,Java等后端程序实现,比较麻烦。Nginx有一个Upload模块,可以非常简单的实现文件上传功能。此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面。下
  • spring-boot-web-ui及thymeleaf基本使用 jishiweili springthymeleaf
    视图控制层代码demo如下:   @Controller @RequestMapping("/") public class MessageController { private final MessageRepository messageRepository; @Autowired public MessageController(Mes
  • 数据源架构模式之活动记录 home198979 PHP架构活动记录数据映射
    hello!架构 一、概念 活动记录(Active Record):一个对象,它包装数据库表或视图中某一行,封装数据库访问,并在这些数据上增加了领域逻辑。 对象既有数据又有行为。活动记录使用直截了当的方法,把数据访问逻辑置于领域对象中。   二、实现简单活动记录 活动记录在php许多框架中都有应用,如cakephp。 <?php /** * 行数据入口类 *
  • Linux Shell脚本之自动修改IP pda158 linuxcentosDebian脚本
    作为一名 Linux SA,日常运维中很多地方都会用到脚本,而服务器的ip一般采用静态ip或者MAC绑定,当然后者比较操作起来相对繁琐,而前者我们可以设置主机名、ip信息、网关等配置。修改成特定的主机名在维护和管理方面也比较方便。如下脚本用途为:修改ip和主机名等相关信息,可以根据实际需求修改,举一反三! #!/bin/sh #auto Change ip netmask ga
  • 开发环境搭建 独浮云 eclipsejdktomcat
           最近在开发过程中,经常出现MyEclipse内存溢出等错误,需要重启的情况,好麻烦。对于一般的JAVA+TOMCAT项目开发,其实没有必要使用重量级的MyEclipse,使用eclipse就足够了。尤其是开发机器硬件配置一般的人。         &n
  • 操作日期和时间的工具类 vipbooks 工具类
       大家好啊,好久没有来这里发文章了,今天来逛逛,分享一篇刚写不久的操作日期和时间的工具类,希望对大家有所帮助。 /* * @(#)DataFormatUtils.java 2010-10-10 * * Copyright 2010 BianJing,All rights reserved. */ package test; impor