中企动力 > 头条 > python中title

网站性能检测评分

注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。

python中title

Python3中Selenium使用方法(连载) 行业视频课程

img

缪凌柏

关注

欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答、求职一站式搞定!

登陆天善社区查看更多系列:

Python3中BeautifulSoup的使用方法

Python3中PyQuery的使用方法

Python3中正则表达式使用方法

基本使用

首先我们来大体看一下Selenium有一些怎样的功能,先用一段实例代码来演示一下:

运行代码之后,如果正确配置好了ChromeDriver,可以发现会自动弹出一个浏览器,浏览器首先会跳转到百度,然后在搜索框中输入Python进行搜索,然后跳转到搜索结果页,等待搜索结果加载出来之后,控制台分别会输出当前的URL,当前的Cookies还有网页源代码。

控制台输出结果:

源代码过长在此省略,那么当前的URL,Cookies,源代码都是浏览器中的真实内容。所以说,如果我们用Selenium来驱动浏览器加载网页的话,我们就可以拿到JavaScrit渲染的结果了。

下面我们来详细介绍一下Selenium的用法。

Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有手机端的浏览器Android、BlackBerry等,另外无界面浏览器PhantomJS也同样支持。

我们可以用如下的方式初始化:

这样我们就完成了一个浏览器对象的初始化,接下来我们要做的就是调用browser对象,让其执行各个动作,就可以模拟浏览器操作了。

我们可以用get()方法来请求一个网页,参数传入链接URL即可,比如在这里我们用get()方法访问淘宝,然后打印出源代码,代码如下:

单个元素

Selenium可以驱动浏览器完成各种操作,比如填充表单,模拟点击等等,比如我们想要完成向某个输入框输入文字的操作,总得需要知道这个输入框在哪里吧?所以Selenium提供了一系列查找元素的方法,我们可以用这些方法来获取想要的元素,以便于下一步执行一些动作或者提取信息。

比如我们想要从淘宝页面中提取搜索框这个元素,首先观察它的源代码:

可以发现它的ID是q,Name也是q,还有许多其他属性,我们获取它的方式就有多种形式了,比如find_element_by_name()是根据Name值获取,ind_element_by_id()是根据ID获取,另外还有根据XPath、CSS Selector等获取。

我们代码实现一下:

在这里我们使用了三种方式获取输入框,根据ID,CSS Selector,和XPath获取,它们返回的结果是完全一致的。

运行结果:

可以看到三个元素都是WebElement类型,是完全一致的。

在这里列出所有获取单个元素的方法:

find_element_by_idfind_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_selector

另外Selenium还提供了通用的find_element()方法,它需要传入两个参数,一个是查找的方式By,另一个就是值,实际上它就是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID, id)。

我们用代码实现一下:

这样的查找方式实际上功能和上面列举的查找函数完全一致,不过参数更加灵活。

如果我们查找的目标在网页中只有一个,那么完全可以用find_element()方法,但如果有多个元素,再用find_element()方法查找就只能得到第一个元素了,如果要查找所有满足条件的元素,那就需要用find_elements()这样的方法了,方法名称中element多了一个s。

比如我们在这里查找淘宝导航条的所有条目就可以这样来写:

在此简化了一下输出结果,中间部分省略。

可以看到得到的内容就变成了list类型,list的每个元素都是WebElement类型。

也就是说,如果我们用find_element()方法,只能获取匹配的第一个元素,结果是WebElement类型,如果用find_elements()方法,则结果是list类型,listd每个元素是WebElement类型。

函数的列表如下:

find_elements_by_idfind_elements_by_namefind_elements_by_xpathfind_elements_by_link_textfind_elements_by_partial_link_textfind_elements_by_tag_namefind_elements_by_class_namefind_elements_by_css_selector

当然我们和刚才一样,也可可以直接find_elements()方法来选择,所以也可以这样来写:

结果是完全一致的。

Selenium可以驱动浏览器来执行一些操作,也就是说我们可以让浏览器模拟执行一些动作,比较常见的用法有:

输入文字用send_keys()方法,清空文字用clear()方法,另外还有按钮点击,用click()方法。

我们用一个实例来感受一下:

在这里我们首先驱动浏览器打开淘宝,然后用find_element_by_id()方法获取输入框,然后用send_keys()方法输入iPhone文字,等待一秒之后用clear()方法清空输入框,再次调用send_keys()方法输入iPad文字,之后再用find_element_by_class_name()方法获取搜索按钮,最后调用click()方法完成搜索动作。

通过上面的方法我们就完成了一些常见元素的动作操作,更多的操作可以参见官方文档的交互动作介绍:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

在上面的实例中,一些交互动作都是针对某个元素执行的,比如输入框我们就调用它的输入文字和清空文字方法,按钮就调用它的点击方法,其实还有另外的一些操作它是没有特定的执行对象的。比如鼠标拖拽,键盘按键等操作。所以这些动作我们有另一种方式来执行,那就是加到动作链中。

比如我们现在实现一个元素拖拽操作,将某个元素从一处拖拽到另外一处,我们用代码来感受一下:

首先我们打开网页中的一个拖拽实例,然后依次选中要被拖拽的元素和拖拽到的目标元素,然后声明了ActionChains对象赋值为actions变量,然后通过调用actions变量的drag_and_drop()方法,然后再调用perform()方法执行动作,就完成了拖拽操作。

更多的动作链操作可以参考官方文档的动作链介绍:http://selenium-python.readthedocs.io/api.html#module-selenium.webdrivermon.action_chains

另外对于某些操作,API没有提供的,如下拉进度条等,可以直接模拟运行JavaScript,使用execute_script()方法。

在这里我们就利用了execute_script()方法将进度条下拉到最底部,然后弹出alert提示框。

所以说有了这个,基本上API没有提供的所有的功能都可以用执行JavaScript的方式来实现了。

我们在前面说过通过page_source属性可以获取网页的源代码,获取源代码之后就可以使用解析库如正则、BeautifulSoup、PyQuery等来提取信息了。

不过既然Selenium已经提供了选择元素的方法,返回的是WebElement类型,那么它也有相关的方法和属性来直接提取元素信息,如属性、文本等等。这样的话我们能就不用通过解析源代码来提取信息了,非常方便。

那接下来我们就看一下可以通过怎样的方式来获取元素信息吧。

我们可以使用get_attribute()方法来获取元素的属性,那么这个的前提就是先选中这个元素。

我们用一个实例来感受一下:

运行之后程序便会驱动浏览器打开知乎的页面,然后获取知乎的LOGO元素,然后将它的class打印出来。

控制台输出结果:

我们通过get_attribute()方法,然后传入想要获取的属性名,就可以得到它的值了。

每个WebEelement元素都有text属性,我们可以通过直接调用这个属性就可以得到元素内部的文本信息了,就相当于BeautifulSoup的get_text()方法、PyQuery的text()方法。

我们用一个实例来感受一下:

在这里们依然是先打开知乎页面,然后获取提问按钮这个元素,再将其文本值打印出来。

控制台输出结果:

另外WebElement元素还有一些其他的属性,比如id属性可以获取元素id,location可以获取该元素在页面中的相对位置,tag_name可以获取标签名称 ,size可以获取元素的大小,也就是宽高,这些属性有时候还是很有用的。

我们用实例来感受一下:

在这里我们首先获得了提问按钮这个元素,然后调用其id、location、tag_name、size属性即可获取对应的属性值。

我们知道在网页中有这样一种标签叫做iframe,也就是子Frame,相当于页面的子页面,它的结构和外部网页的结构是完全一致的。Selenium打开页面后,它默认是在父级Frame里面操作,而此时如果页面中还有子Frame,它是不能获取到子Frame里面的元素的。所以这时候我们就需要使用switch_to.frame()方法来切换Frame。

我们首先用一个实例来感受一下:

我们还是以上文演示动作链操作的网页为实例,首先我们通过switch_to.frame()方法切换到子Frame里面,然后我们尝试获取父级Frame里的LOGO元素,是不能找到的,找不到的话就会抛出NoSuchElementException异常,异常被捕捉之后就会输出NO LOGO,接下来我们重新切换回父Frame,然后再次重新获取元素,发现就可以成功获取了。

所以,当页面中包含子Frame时,如果我们想获取子Frame中的元素,需要先调用switch_to.frame()方法切换到对应的Frame,然后再进行操作。

在Selenium中,get()方法会在网页框架加载结束之后就结束执行,此时如果获取page_source可能并不是浏览器完全加载完成的页面,如果某些页面有额外的Ajax请求,我们在网页源代码中也不一定能成功获取到。所以这里我们需要延时等待一定时间确保元素已经加载出来。

在这里等待的方式有两种,一种隐式等待,一种显式等待。

当使用了隐式等待执行测试的时候,如果Selenium没有在DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素而元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0。

我们用一个实例来感受一下:

在这里我们用implicitly_wait()方法实现了隐式等待。

隐式等待的效果其实并没有那么好,因为我们只是规定了一个固定时间,而页面的加载时间是受到网络条件影响的。

所以在这里还有一种更合适的显式等待方法,它指定好要查找的元素,然后指定一个最长等待时间。如果在规定时间内加载出来了这个元素,那就返回查找的元素,如果到了规定时间依然没有加载出该元素,则会抛出超时异常。

我们用一个实例来感受一下:

在这里我们首先引入了WebDriverWait这个对象,指定好最长等待时间,然后调用它的until()方法,传入要等待条件expected_conditions,比如在这里我们传入了presence_of_element_located这个条件,就代表元素出现的意思,其参数是元素的定位元组,也就是ID为q的元素搜索框。

所以这样可以做到的效果就是,在10秒内如果ID为q的元素即搜索框成功加载出来了,那就返回该元素,如果超过10秒还没有加载出来,那就抛出异常。

对于按钮,可以更改一下等待条件,比如改为element_to_be_clickable,也就是可点击,所以查找按钮时是查找CSS选择器为.btn-search的按钮,如果10秒内它是可点击的也就是成功加载出来了,那就返回这个按钮元素,如果超过10秒还不可点击,也就是没有加载出来,那就抛出异常。

运行代码,在网速较佳的情况下是可以成功加载出来的。

控制台输出:

可以看到控制台成功输出了两个元素,都是WebElement类型。

如果网络有问题,10秒内没有成功加载,那就抛出TimeoutException,控制台输出如下:

关于等待条件,其实还有很多,比如判断标题内容,判断某个元素内是否出现了某文字,在这里将所有的加载条件列举如下:

等待条件含义

title_is标题是某内容

title_contains标题包含某内容

presence_of_element_located元素加载出,传入定位元组,如(By.ID, 'p')

visibility_of_element_located元素可见,传入定位元组

visibility_of可见,传入元素对象

presence_of_all_elements_located所有元素加载出

text_to_be_present_in_element某个元素文本包含某文字

text_to_be_present_in_element_value某个元素值包含某文字

frame_to_be_available_and_switch_to_it frame加载并切换

invisibility_of_element_located元素不可见

element_to_be_clickable元素可点击

staleness_of判断一个元素是否仍在DOM,可判断页面是否已经刷新

element_to_be_selected元素可选择,传元素对象

element_located_to_be_selected元素可选择,传入定位元组

element_selection_state_to_be传入元素对象以及状态,相等返回True,否则返回False

element_located_selection_state_to_be传入定位元组以及状态,相等返回True,否则返回False

alert_is_present是否出现Alert

更多详细的等待条件的参数及用法介绍可以参考官方文档:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

我们平常使用浏览器都有前进和后退功能,使用Selenium也可以完成这个操作,使用back()方法可以后退,forward()方法可以前进。

我们用一个实例来感受一下:

在这里我们连续访问三个页面,然后调用back()方法就可以回到第二个页面,接下来再调用forward()方法又可以前进到第三个页面。

使用Selenium还可以方便地对Cookies进行操作,例如获取、添加、删除Cookies等等。

我们再用实例来感受一下:

首先我们访问了知乎,然后加载完成之后,浏览器实际上已经生成了Cookies了,我们调用get_cookies()方法就可以获取所有的Cookies,然后我们添加一个C...

六、python中字符串的常用方法 公司视频课程

img

黛儿

关注

1.capitalize()方法

s = 'jack and tom and jack''''capitalize() 方法:Return a capitalized version of the string. ---> 返回字符串的大写版本More specifically, make the first character have upper case and the rest lower case. --->更具体的说,使第一个字符具有大写字母,其余字母为小写字母'''print(s.capitalize())

2.title()方法

'''title() 方法:Return a version of the string where each word is titlecased.--> 返回一个字符串,其中每个单词的首字母大写More specifically, words start with uppercased characters and all remainingcased characters have lower case. -->更具体的说,每个单词以大写字母开始,其余都是小写字母'''print('abc*abc'.title())

3.center()方法

'''center() 方法:Return a centered string of length width.-->返回长度为宽度的居中字符串。Padding is done using the specified fill character (default is a space).-->填充是使用指定的填充字符完成的(默认为空格)'''print('abc'.center(9,'-'))

4.count()方法

'''count() 方法:S.count(sub[, start[, end]]) -> intReturn the number of non-overlapping occurrences of substring sub in string S[start:end]. Optional arguments start and end are interpreted as in slice notation.查找子字符串 sub 在字符串中出现的次数,可选参数,开始 和 结束 可理解为切片'''print(s.count('and',1,3))

5.endswith()方法

'''endswith() 方法:S.endswith(suffix[, start[, end]]) -> boolReturn True if S ends with the specified suffix, False otherwise. With optional start, test S beginning at that position. With optional end, stop comparing S at that position. suffix can also be a tuple of strings to try.如果S以指定后缀结尾,则返回True,否则返回False。可以指定起始和结束位置,后缀也可以是要尝试的字符串元组。 '''print('tom and jack'.endswith('jack',10))

6.find()方法

'''find() 方法:S.find(sub[, start[, end]]) -> intReturn the lowest index in S where substring sub is found, such that sub is contained within S[start:end]. Optional arguments start and end are interpreted as in slice notation.在字符串 S 中查找子字符串sub,如果找到,返回子字符串sub在字符串s中首次出现的索引,没有找到返回 -1参数start 和 end 可以理解为切片'''print('hello world python'.find('world',6))print('hello world python'.find('world',6))

7.format()方法:

'''format() 方法:S.format(*args, **kwargs) -> strReturn a formatted version of S, using substitutions from args and kwargs.The substitutions are identified by braces ('{' and '}').使用来自args和kwargs的替换返回S的格式化版本。替换用大括号(“{”和“}”)标识。'''s_format = '我的名字叫{},我的年龄是{}'.format('jack',19)print(s_format)s_format = '我的名字叫{name},我的年龄是{age},我的名字叫{name}'.format(name='jack',age=19)print(s_format)s_format = '我的名字叫{0},我的年龄是{1},我的名字叫{0}'.format('jack',19)print(s_format)

8.index()方法

'''index() 方法:S.index(sub[, start[, end]]) -> intReturn the lowest index in S where substring sub is found, such that sub is contained within S[start:end]. Optional arguments start and end are interpreted as in slice notation. Raises ValueError when the substring is not found.在字符串 s 中查找 子字符串 sub,在指定位置 start 和 end 之间查找,参数 start 和 end 可理解为切片,如果没有找到,则会抛出 ValueError错误。找到,返回最先出现的索引'''s_index = 'return the lowest index in S where'print(s_index.index('the'))

9.lower()方法:

'''lower() 方法:Return a copy of the string converted to lowercase.返回转换为小写的字符串副本。将字符串中的所有字符转换成小写字母'''print('AbCdddEfgjKH'.lower())

10.lstrip()方法:

'''lstrip() 方法:Return a copy of the string with leading whitespace removed. 返回一个删除前导(左侧)空白字符的副本。 If chars is given and not None, remove characters in chars instead. 如果这个字符chars是给定的,而不是None,则删除指定的字符,而不是空白字符'''print(' abdde'.lstrip())print('***abdcd'.lstrip('*'))

11.replace()方法:

'''replace() 方法:Return a copy with all occurrences of substring old replaced by new.返回一个字符串的副本,使用新的子字符串替换旧的子字符串count Maximum number of occurrences to replace. -1 (the default value) means replace all occurrences. 替换的次数,默认为-1 ,表示替换所有的子字符串If the optional argument count is given, only the first count occurrences are replaced.如果参数count给定的指定次数。则替换指定的次数'''print('abcabdabcabc'.replace('a','A',3))

12.split()方法:

'''split()方法:Return a list of the words in the string, using sep as the delimiter string. 将字符串使用指定分隔符进行拆分,并返回一个list sep 用作拆分的分隔符 The delimiter according which to split the string. None (the default value) means split according to any whitespace, and discard empty strings from the result. 参数为空,默认使用空白字符进行拆分,返回的结果中抛弃空白字符 maxsplit 表示要执行的最大拆分 Maximum number of splits to do. -1 (the default value) means no limit. 表示要执行的最大拆分次数,-1 默认值,表示没有限制'''print('Maximum number of splits to do'.split())

13.rstrip()方法

'''rstrip() 方法:去掉字符串右边的字符,默认去掉空白字符,同 lstrip()方法'''print('abc***'.rstrip('*'))'''startswith() 方法: S.startswith(prefix[, start[, end]]) -> boolReturn True if S starts with the specified prefix, False otherwise.With optional start, test S beginning at that position. With optional end, stop comparing S at that position. prefix can also be a tuple of strings to try. 如果以指定的字符串开头,则返回True,否则返回False. 同endswith()方法类似'''print('abc'.startswith('a'))

14.strip()方法

'''strip()方法: 同rstrip() 和 lstrip() 方法。去掉字符串首尾的空白字符,或者指定字符'''print('*%abc%'.strip('*%'))

15.upper()方法

'''upper()方法:Return a copy of the string converted to uppercase.将字符串中的所有字符转换成大写字母,并返回一个字符串副本 同lower()方法对应'''print('abcdaAKJFA'.upper())

Kaggle首次定义数据科学家:30岁,年薪5万刀,爱Python,最恨脏数据 行业视频课程

img

詹姆士

关注

大数据文摘作品

作者:龙牧雪 魏子敏

今日凌晨,全球最大的数据科学社群Kaggle发布了第一份数据科学/机器学习业界现状调查报告。这份调查问卷的受访者囊括了来自50多个国家的16,000+位从业者,根据他们的问卷结果,Kaggle给出了一些有趣的结论:

1、Python可能是机器学习最常用的编程语言,而统计学家更多地使用R语言;

2、数据科学家的年龄中位数是30岁,而各国差异巨大,比如,印度的受访人比澳大利亚平均年龄年轻9岁;

3、受访者中硕士学位所占比重最大,但薪水最高的从业者($150k)多数拥有博士学位。

本次报告的发布也别具一格地采用了交互数据集的方式,并提供了样本数据集供读者自行分析,大数据文摘也得以利用这一数据集分析出了一些与中国数据科学从业者相关的结论,比如:

1、中国从业者更年轻:中国数据玩家年龄中位数25岁,比这一统计值的全球数据(30岁)小五岁;

2、从业者男女比例更加不均:中国仅有72名女性数据玩家填写了问卷,而男性有387人。男女比5.4:1;

关注大数据文摘,在公众号后台对话框内回复“Kaggle”,即可直接下载这份数据集自己玩~

Kaggle同时为这份数据集设置了1000美金的奖项,如果你有新发现,可以将自己的分析上传至Kaggle,地址

https://kaggle/kaggle/kaggle-survey-2017

以下为报告精华:

数据科学从业者画像

定义数据科学从业者的方式很多,Kaggle将从工作和背景的两个方向进行统计:

“你的年龄多大?”

平均来看,问卷调查填写者的年龄中位数在30岁左右,但不同国家的这一数值也不尽相同,比如印度的受访者就比澳大利亚年轻9岁。

中国数据玩家年龄中位数尽管高于印度,但仍然低于全球平均值,只有25岁。

“你的性别是什么?”

在性别这一栏,这份报告给了我们比较符合预期的结论,男女比例不均。

在全球的问卷填写者中,共有13427位男性和2714位女性,男女比4.9:1。

而在中国,仅有72名女性数据玩家填写了问卷,而男性有387人。男女比5.4:1。

“你的就业情况如何?”

数据科学从业者的崛起让自由职业者和兼职工作成为一种新潮流,而这一报告也应证了这一结论。在全球,仅有65%的数据玩家拥有全职工作,而8%是自由职业。

相较之下,中国回答者的“没有工作也不在找工作”的比例非常高(考虑到中国的回答者人数较少-只有400人,文摘菌认为这个结果可能是学生比例较高造成的)。

“你的职位是什么?”

自从“数据科学家”被誉为全球最性感的职位后,这个职位也成为了很多从业者的奋斗目标。而从调查结果看,全球范围内,使用“数据科学家”作为自己Title的从业者比例最高,占到24.4%。

“你的年薪是多少?”

如果看薪酬,最高一级薪酬是年收入20万美元以上,这一档全球有166人,相对于不分薪酬的数据科学家比例(24.4%),数据科学家比例有显著提升(35.5%)。

全球数据相关从业者平均年薪55441美元(约合37万人民币)。

收入上也有男女不均:男性比女性多收入3000美金/年。

中国数据相关从业者平均年薪29835美元(约合20万人民币)。考虑到只有66人回答了这一问题,结果解读需谨慎。

“你的最高学历是什么?”

全球范围内,取得硕士学位的从业者最多。

按薪酬来看,年薪150k-200k美金和200k+美金的人群多数取得了博士学位。

这一题中国有420人回答,仍是取得硕士学位的人最多且比例和全球水平接近。博士的比例(11.2%)比全球(15.6%)少。

数据科学从业者日常工作内容

Kaggle给数据科学家的定义是,“写代码并且分析数据的人群”。通过问询问卷填写者的日常工作,报告得到了如下结论:

“你的工作中用到哪些数据科学方法?”

逻辑回归在数据科学从业者中最常被用到,占63.5%。

“工作中最常用到的工具?”

python python python

但职位是“统计学家”的人还是显著地喜欢用R。

“工作中常用的数据类型是?”

工作中用到的数据主要是关系型数据,主要使用Git共享代码。

“工作中遇到的最大的困难?”

脏数据!看来数据科学领域最大的问题还是脏数据。排名第二的困难是“缺少数据科学人才”。正在学习数据科学的小伙伴们,你们前途无量呀!请带文摘菌一起飞!

新手如何入行数据科学领域?

作为一个数据科学学习社区,Kaggle在这份报告中也提出了一些数据科学老司机给新手学习者的建议,可以说是非常良心了!(这一部分可能是本份报告中最有价值的部分,文摘菌敲黑板划重点啦!)

“你们会推荐新手先学哪门语言?”

先学Python!这是Kaggle综合了超一万名老司机的意见给出的结论。

“你最常使用哪种数据科学学习资源?”

数据科学是一个日新月异的领域,保持持续的学习能力非常重要。据调研问卷显示,数据科学老司机最常用到的学习资源包括Stack Overflow Q&A,相关论坛,以及Podcasts。而关于开源内容,数据科学从业者更多使用官方文档和观看 Youtube 视频。

“你从何获取开源数据?”

没有数据就没有数据科学,所以提到数据科学学习技能,不得不提到获取开源优质数据的能力。报告中提到了一些优质数据获取渠道,包括Dataset aggregator, Google Search等。

“怎么找工作?”

数据科学从业老司机在找工作上的忠告也非常有趣:去公司官网或相关网站的技术板块乃下下策,他们更建议的方式是,直接联系招聘人,或建立自己的关系网。

最后,对所有正在阅读问卷结果的人,文摘菌想特意说明Kaggle在问卷中备注的一句话:每个人都是独特的,不是一个个平均数就能代表的。问卷的结论建立在1.6万名Kaggle使用者的答案上,但他们只是数据从业者的一小部分——年龄、性别、所在地区、职位、薪酬、经验和所受教育的不同都无法阻止我们对数据科学的热爱!

python用正则爬取豆瓣电影排行榜,连老司机都不知道的奥秘 互联网视频课程

img

负荷

关注

使用了tkinter做了简单页面

首先分析要爬取的url, 发现每个页面有25条内容, 总共有十页, 第一页的URL为https://movie.douban/top250?start=0&filter=

第二页的url为https://movie.douban/top250?start=25&filter=

第三页第四页也是类似的URL, 只是修改了start后面的数字, 第一页是0, 往后每增加25, 所以url的格式为https://movie.douban/top250?start=+{ID}

然后分析如何爬取内容:

首先爬取标题:

查看源代码后, 发现标题是放在这样的代码:

肖申克的救赎 / The Shawshank Redemption / 月黑高飞(港) / 刺激1995(台)12345发现电影的名称一般都放在

电影名称1这样的标记对中, 所以根据这个可以写出正则表达式:

(.*?)1不过在后面的测试中发现这样写的话, 每个电影名称能获取两个信息

肖申克的救赎 / The Shawshank Redemption12显然第二条信息不是我们想要的, 经过对比发现第二条信息中都会有两个空格的代码, 所以把&给过滤掉就可以了:

(.[^&]*?)1接下来爬取评分, 评分一般放在这样的代码中:

9.6716019人评价

123456这个正则就很好写了:

"v:average">(.*?)1这样就ok啦, 这个程序还是非常简单的, 上源代码:

# -*- coding: utf-8 -*-from Tkinter import *from ScrolledText import ScrolledTextimport requests, re, threadingdef replite(ID): varl.set('正在获取第%d页内容' % (ID / 25 + 1)) html = 'https://movie.douban/top250?start=' + str(ID) response = requests.get(html).text # response = unicode(response, 'GBK').encode('UTF-8') response = response.encode('utf-8 ') # print response # reg = r'(.*?).*?"v:average">(.*?)' regTitle = r'(.[^&]*?)' regStars = r'.*?"v:average">(.*?)' regTitle = repile(regTitle) regStars = repile(regStars) titles = re.findall(regTitle, response) stars = re.findall(regStars, response) info = list(zip(titles, stars)) return infodef write(): varl.set('开始爬取内容') ID = 0 nums = 1 while ID < 250: res = replite(ID) ID += 25 for each in res: text.insert(END, 'No.%d\t%-30s%s分\n' % (nums, each[0], each[1])) nums += 1 varl.set('获取内容成功')def start(): t1 = threading.Thread(target=write) t1.start()def save(): content = text.get("0.0", "end").encode('GBK') textfile = open(u'E:\\豆瓣电影排行250.txt', 'w') textfile.write(content) textfile.close()root = Tk()root.title('豆瓣电影top250')root.geometry('820x500+400+200')text = ScrolledText(root, font=('楷体', 15), width=80, height=20)text.grid()frame = Frame(root)frame.grid()# 启动爬虫功能startButton = Button(frame, text='开始', font=('楷体', 18), command=start)startButton.grid()startButton.pack(side=LEFT)# 保存爬取信息saveButton = Button(frame, text='保存文件', font=('楷体', 18), command=save)saveButton.grid()saveButton.pack(side=LEFT)# 退出程序exitButton = Button(frame, text='退出', font=('楷体', 18), command=frame.quit)exitButton.grid()exitButton.pack(side=LEFT)varl = StringVar()info_label = Label(root, fg='red', textvariable=varl)info_label.grid()varl.set('准备中....')root.mainloop()

下面给大家分享python正则详解:

正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。下面,我来介绍一下python中的正则表达式是怎么使用的。

首先,python中的正则表达式大致分为以下几部分:

元字符模式函数re 内置对象用法分组用法环视用法  所有关于正则表达式的操作都使用 python 标准库中的 re 模块。

一、元字符 (参见 python 模块 re 文档)

. 匹配任意字符(不包括换行符)^ 匹配开始位置,多行模式下匹配每一行的开始$ 匹配结束位置,多行模式下匹配每一行的结束* 匹配前一个元字符0到多次+ 匹配前一个元字符1到多次? 匹配前一个元字符0到1次{m,n} 匹配前一个元字符m到n次\\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符[] 字符集,一个字符的集合,可匹配其中任意一个字符| 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b(...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值(?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I(?:...) 分组的不捕获模式,计算索引时会跳过这个分组(?P...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name(?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则(?#...) 注释,不影响正则表达式其它部分,用法参见 模式 I(?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则(?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则(?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则(?

I IGNORECASE, 忽略大小写的匹配模式, 样例如下

s = 'hello World!'regex = repile("hello world!", re.I)print regex.match(s).group()#output> 'Hello World!'#在正则表达式中指定模式以及注释regex = repile("(?#注释)(?i)hello world!")print regex.match(s).group()#output> 'Hello World!'

L LOCALE, 字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é" 或 "04"。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。M MULTILINE,多行模式, 改变 ^ 和 $ 的行为

s = '''first linesecond linethird line'''# ^regex_start = repile("^\w+")print regex_start.findall(s)# output> ['first']regex_start_m = repile("^\w+", re.M)print regex_start_m.findall(s)# output> ['first', 'second', 'third']#$regex_end = repile("\w+$")print regex_end.findall(s)# output> ['line']regex_end_m = repile("\w+$", re.M)print regex_end_m.findall(s)# output> ['line', 'line', 'line']

S  DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符

s = '''first linesecond linethird line'''#regex = repile(".+")print regex.findall(s)# output> ['first line', 'second line', 'third line']# re.Sregex_dotall = repile(".+", re.S)print regex_dotall.findall(s)# output> ['first line\nsecond line\nthird line']

X VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式email_regex = repile("[\w+\.]+@[a-zA-Z\d]+\.(com|cn)")email_regex = repile("""[\w+\.]+ # 匹配@符前的部分 @ # @符 [a-zA-Z\d]+ # 邮箱类别 \.(com|cn) # 邮箱后缀 """, re.X)U UNICODE,使用 \w, \W, \b, \B 这些元字符时将按照 UNICODE 定义的属性.正则表达式的模式是可以同时使用多个的,在 python 里面使用按位或运算符 | 同时添加多个模式

如 repile('', re.I|re.M|re.S)

每个模式在 re 模块中其实就是不同的数字

print re.I# output> 2print re.L# output> 4print re.M# output> 8print re.S# output> 16print re.X# output> 64print re.U# output> 32四、re 内置对象用法

SRE_Pattern 这个对象是一个编译后的正则表达式,编译后不仅能够复用和提升效率,同时也能够获得一些其他的关于正则表达式的信息属性:

flags 编译时指定的模式groupindex 以正则表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。groups 正则表达式中分组的数量

pattern 编译时用的正则表达式s = 'Hello, Mr.Gumby : 2016/10/26'p = repile('''(?: # 构造一个不捕获分组 用于使用 | (?P\w+\.\w+) # 匹配 Mr.Gumby | # 或 (?P\s+\.\w+) # 一个匹配不到的命名分组 ) .*? # 匹配 : (\d+) # 匹配 2016 ''', re.X)

好了,今天的知识就分享到这里,欢迎关注爱编程的南风,私信关键词:学习资料,获取更多学习资源,如果文章对你有有帮助,请收藏关注,在今后与你分享更多学习python的文章。同时欢迎在下面评论区留言如何学习python。

Python基础学习之常用六大数据类型 企业视频课程

img

子日

关注

刚开始学习一门编程语言,除了了解运行环境与语言类型之外,最基本还是从该语言的基本数据类型开始学起。

Python六大常用数据类型:

int 整数 float 浮点数 str 字符串 list 列表 tuple 元组 dict 字典

讲解这些先说一下python中的变量与变量名。

变量其实本质上是一个具有特殊格式的内存,变量名则是指向这个内存的别名。python中的变量不需要声明,所有的变量必须赋值了才能使用。赋值的步骤:

a = 100

第一步:准备好值100第二部:准备好变量名a第三部:将值与名字进行关联

一、整数python将其他一些静态语言中的int、long,也就是整型和长整型合并为了一个。python中的int是边长的,也就是说可以存储无限大的整数,但是这是不现实的,因为没有这么多的内存够分配。整型不仅支持十进制,还支持二进制、八进制、十六进制。可以通过下面的方式来互相转换:

print(bin(20)) #转换二进制print(oct(20)) #转换八进制print(hex(20)) #转换十六进制

二、浮点型浮点数也就是小数,如22.1,44.2,也可以使用科学计数法,比如:1.22e8。python支持对整数和浮点数直接进行四则混合运算。整数运算结果仍然是整数,浮点数运算结果仍然是浮点数,但整数和浮点数混合运算的结果就变成浮点数了。

a = 1b = 1.1print(type(a+b)) #

三、字符串字符串在任何编程语言中都是最常用的数据类型。字符串的创建很简单,也是上面所说的三步,但是要加上单引号或者双引号。

a = "hello python"

也可以使用 “”" 创建多行字符串:

a = """ hello python"""

字符串可以通过下面方式进行截取或者连接:

print (str[0:4]) 输出第一个到倒数第四个的所有字符 print (str[0]) 输出单字符 第1个字符print (str[3:]) 输出从第四个开始之后的所有字符print (str * 2) 输出字符串两次print (str + "bbbb") 连接字符串

字符串常用函数:str.strip() 消除字符串s左右两边的空白字符(包括’\t’,’\n’,’\r’,’’)len(str) 获取字符串长度str.upper() 转换为大写str.lower() 转换为小写str.title() 每个单词首字母大写str.capitalize() 首字母大写字符串翻转:

a = 'abcde'print(a[::-1])

字符串分割:

a = 'hello,python'print(a.split(',')) #['hello', 'python'] 返回一个列表

相对应的还有一个将列表元素连接成字符串:

a = ['hello', 'python']str = '-'print(str.join(a)) # hello-python

四、列表列表的写法是一个方括号内的值用逗号分隔。比如上面的[‘hello’, ‘python’]。列表的数据项不需要具有相同的类型,列表中的每个元素都分配一个数字索引,第一个索引是0,第二个索引是1,依此类推。访问列表中的值可以通过下面的方式:

list1 = [1, 2, 3, 4, 5, 6]print(list1[2])

同样可以通过索引截取

print ("list1[2:5]: ", list1[2:5])

列表常用操作:list1.append(‘7’) 追加一个元素在末尾,每次只能添加一个len(list1) 返回列表元素个数max(list1) 返回列表元素最大值min(list1) 返回列表元素最小值list1.count(obj) 统计某个元素在列表中出现的次数list1.index(obj) 从列表中找出某个值第一个匹配项的索引位置list1.reverse() 反向列表中元素list1.clear() 清空列表list1.extend(seq) 在列表末尾一次性追加另一个序列中的多个值,也就是扩充了列表 append与extend的区别:

A = ['a', 'b', 'c']A.append(['d', 'e'])print(A) # ['a', 'b', 'c', ['d', 'e']]B = ['a', 'b', 'c']B.extend(['d', 'e'])print(B) # ['a', 'b', 'c', 'd', 'e']

extend方法只能接收list类型,它是把这个列表中的每个元素添加到原list中。append可以接收任意类型,追加到原list的末尾。

五、元组元组的创建也很简单,和list类似,只是把’[]‘换成了’()’。

tup1 = ('hello', 'python')

元组中只有一个元素的时候要注意:

tup2 = (10)tup3 = ('a')print(type(tup2)) #print(type(tup3)) #

因为这样会被解释器当做运算符,所以正确的方法是在第一个元素后面添加逗号。

tup4 = ('a',)print(type(tup4)) #

元组同样可以使用下标索引来访问元组中的值:

tup5 = ('hello', 'python', 'hello', 'word')print(tup5[1]) #pythonprint(tup5[1:3]) #('python', 'hello')

注意:元组是不可以被修改的。

tup6 = ('hello', 'python', 'hello', 'word')tup6[2] = 'aaa'

上面会出现一个异常: TypeError: ‘tuple’ object does not support item assignment.但是元组中如果包含了一个列表,那么这个列表是可以被修改的。

tup7 = ('hello', 'python', 'hello', 'word', ['aa', 'bb', 'cc'])tup7[-1][1] = 'ddd'print(tup7) # ('hello', 'python', 'hello', 'word', ['aa', 'ddd', 'cc'])

元组运算符:len(tup) 计算元素个数tup1 + tup2 连接生成新元组tup * 4 元组复制num in tup 元素是否存在,返回True/False

六、字典python中的字典就是key,value的形式。使用大括号包含起来。字典中的成员的键是唯一的,如果出现多个同名的键,那么写在后面覆盖前面的值。形式如下:

dict1 = {'a' : 1, 'b' : 2}

字典的常用操作最基本的也就是增删改查:获取:直接通过键来获取。

dict['b'] # 2

dict.keys() 获取字典中所有的键dict.values() 获取字典中的所有的值增加:

dict1['c'] = 3 #{'a': 1, 'b': 2, 'c': 3} #如果键存在则更新对应的值

修改:直接给键进行再次赋值就可以修改键对应的值了。如果键不存在,则变成添加成员。还可以通过:

dict1.update({"a":"11"})dict1.setdefault("a", "222") # 已存在的键则修改无效dict1.setdefault("d","222") # 不存在的话则创建dict1.setdefault("e") # 没有设置值为None

删除:使用pop删除指定键对应的成员,同时返回该值

print(dict1) # {'a': '11', 'b': 2, 'c': 3, 'd': '222', 'e': None}print(dict1.pop("a")) # aprint(dict1) # {'b': 2, 'c': 3, 'd': '222', 'e': None}#在不设置默认值的情况下,使用pop删除不存在的键,会报错。print(dict1.pop("f")) # 报错 KeyError: 'f'

如果设置了默认值, print(dict1.pop(“f”, None)),则不会报错,返回这个默认值。判断是否删除成功可以通过下面方式来判断:

if dict1.pop("f", None) == None: print('键不存在')else: print('删除成功')

以上则是python中最基本的数据类型以及用法,当然还有其他的数据类型,作者暂时只列举了这些。

更过python文章,关注作者哦!干货多多!!

技术分享|利用Python和BeautifulSoup进行网页爬取(新手教程) 新手视频课程

img

Pamela

关注
数据观世界

在大数据、人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一。而Python则是目前数据科学项目中最常用的编程语言之一。使用Python与BeautifulSoup可以很容易的进行网页爬取,通过网站爬虫获取信息可以帮助企业或个人节省很多的时间和金钱。学习本文之后,我相信大部分新手都能根据自己的需求来开发出相应的网页爬虫。

python

基础条件

了解简单的Python编程规则(Python 3.x)了解简单的网页Html标签

如果您是完全的新手也不用担心,通过本文您可以很容易地理解。

安装所需包

首先,您需要先安装好Python 3.x,Python安装包可以从python.org下载,然后我们需要安装requests和beautifulsoup4两个包,安装代码如下:

$ pip install requests

$ pip install beautifulsoup4

爬取网页数据

现在我们已经做好了一切准备工作。在本教程中,我们将演示从没被墙的维基百科英文版页面中获取历届美国总统名单。

转到此链接(https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States#Presidents)并右键单击包含有关美国总统的所有信息的表格,然后单击“检查”选项(我用的是Chrome浏览器,其他浏览器右键单击页面后也会具有类似或相同的选项)。

wikipedia

由下图可知,表格的内容位于class属性为wikitable的table标签下,我们需要了解这些标签信息来获取我们所需内容。

检察元素

了解网页信息之后,我们就可以编写代码了。首先,我们要导入我们安装的包:

import requests

from bs4 import BeautifulSoup

为了获取网页数据我们要使用requests的get()方法:

url = "https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States"

page = requests.get(url)

检查http响应状态,来确保我们能正常获取网页,如果输出状态代码为200则为正常:

print(page.status_code)

现在我们已经获取了网页数据,让我们看看我们得到了什么:

print(page.content)

上面的代码会显示http相应的全部内容,包括html代码和我们需要的文本数据信息。通过使用beautifulsoup的prettify()方法可以将其更美观的展示出来:

soup = BeautifulSoup(page.content, 'html.parser')

print(soup.prettify())

这会将数据按照我们上面“检查”中看到的代码形式展示出来:

page

目前获得的是包含我们所需数据的网页源码,我们接下来要将有用的信息提取出来。上面已经知道我们所需的内容在class属性为wikitable的table标签下,因此,接下来我们将使用bs4对象的find方法提取table标签中的数据,此方法返回bs4对象:

tb = soup.find('table', class_='wikitable')

table标签下有很多嵌套标签,通过网页检查中的代码可以发现,我们最终是需要获得title元素中的文本数据,而title元素位于a标签下,a标签位于b标签下,b标签位于table标签下。为了获取所有我们所需的数据,我们需要提取table标签下的所有b标签,然后找到b标签下的所有a标签,为此,我们使用find_all方法来迭代获取所有b标签下的a标签:

for link in tb.find_all('b'):

name = link.find('a')

print(name)

这将获取所有a标签下的数据:

a

可以看出,这并不是我们所要的最终结果,其中掺杂着html代码,不用担心,我们只需为上面的代码添加get_text()方法,即可提取出所有a标签下title元素的文本信息,代码改动如下:

for link in tb.find_all('b'):

name = link.find('a')

print(name.get_text('title'))

最终获得所有总统的名单如下:

George Washington

John Adams

Thomas Jefferson

James Monroe

...

...

Barack Obama

Donald Trump

将Python代码合并在一起:

import requests

from bs4 import BeautifulSoup

url = "https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States"

page = requests.get(url)

soup = BeautifulSoup(page.content, 'html.parser')

tb = soup.find('table', class_='wikitable')

for link in tb.find_all('b'):

name = link.find('a')

print(name.get_text('title'))

仅仅9行代码,我们就实现了网页信息的爬取,我相信您从中已经学到了Python、html的基础知识,并且已经懂得了网页爬虫的基本原理,如果想更深入的学习网页爬虫,你可以尝试对以上代码进行改进,尝试爬取更多的网站,欢迎与我留言交流。

END

Kaggle首次定义数据科学家:30岁,年薪5万刀,爱Python,最恨脏数据 公司视频课程

img

纪念

关注

大数据文摘作品

作者:龙牧雪 魏子敏

今日凌晨,全球最大的数据科学社群Kaggle发布了第一份数据科学/机器学习业界现状调查报告。这份调查问卷的受访者囊括了来自50多个国家的16,000+位从业者,根据他们的问卷结果,Kaggle给出了一些有趣的结论:

1、Python可能是机器学习最常用的编程语言,而统计学家更多地使用R语言;

2、数据科学家的年龄中位数是30岁,而各国差异巨大,比如,印度的受访人比澳大利亚平均年龄年轻9岁;

3、受访者中硕士学位所占比重最大,但薪水最高的从业者($150k)多数拥有博士学位。

本次报告的发布也别具一格地采用了交互数据集的方式,并提供了样本数据集供读者自行分析,大数据文摘也得以利用这一数据集分析出了一些与中国数据科学从业者相关的结论,比如:

1、中国从业者更年轻:中国数据玩家年龄中位数25岁,比这一统计值的全球数据(30岁)小五岁;

2、从业者男女比例更加不均:中国仅有72名女性数据玩家填写了问卷,而男性有387人。男女比5.4:1;

关注大数据文摘,在公众号后台对话框内回复“Kaggle”,即可直接下载这份数据集自己玩~

Kaggle同时为这份数据集设置了1000美金的奖项,如果你有新发现,可以将自己的分析上传至Kaggle,地址

https://kaggle/kaggle/kaggle-survey-2017

以下为报告精华:

数据科学从业者画像

定义数据科学从业者的方式很多,Kaggle将从工作和背景的两个方向进行统计:

“你的年龄多大?”

平均来看,问卷调查填写者的年龄中位数在30岁左右,但不同国家的这一数值也不尽相同,比如印度的受访者就比澳大利亚年轻9岁。

中国数据玩家年龄中位数尽管高于印度,但仍然低于全球平均值,只有25岁。

“你的性别是什么?”

在性别这一栏,这份报告给了我们比较符合预期的结论,男女比例不均。

在全球的问卷填写者中,共有13427位男性和2714位女性,男女比4.9:1。

而在中国,仅有72名女性数据玩家填写了问卷,而男性有387人。男女比5.4:1。

“你的就业情况如何?”

数据科学从业者的崛起让自由职业者和兼职工作成为一种新潮流,而这一报告也应证了这一结论。在全球,仅有65%的数据玩家拥有全职工作,而8%是自由职业。

相较之下,中国回答者的“没有工作也不在找工作”的比例非常高(考虑到中国的回答者人数较少-只有400人,文摘菌认为这个结果可能是学生比例较高造成的)。

“你的职位是什么?”

自从“数据科学家”被誉为全球最性感的职位后,这个职位也成为了很多从业者的奋斗目标。而从调查结果看,全球范围内,使用“数据科学家”作为自己Title的从业者比例最高,占到24.4%。

“你的年薪是多少?”

如果看薪酬,最高一级薪酬是年收入20万美元以上,这一档全球有166人,相对于不分薪酬的数据科学家比例(24.4%),数据科学家比例有显著提升(35.5%)。

全球数据相关从业者平均年薪55441美元(约合37万人民币)。

收入上也有男女不均:男性比女性多收入3000美金/年。

中国数据相关从业者平均年薪29835美元(约合20万人民币)。考虑到只有66人回答了这一问题,结果解读需谨慎。

“你的最高学历是什么?”

全球范围内,取得硕士学位的从业者最多。

按薪酬来看,年薪150k-200k美金和200k+美金的人群多数取得了博士学位。

这一题中国有420人回答,仍是取得硕士学位的人最多且比例和全球水平接近。博士的比例(11.2%)比全球(15.6%)少。

数据科学从业者日常工作内容

Kaggle给数据科学家的定义是,“写代码并且分析数据的人群”。通过问询问卷填写者的日常工作,报告得到了如下结论:

“你的工作中用到哪些数据科学方法?”

逻辑回归在数据科学从业者中最常被用到,占63.5%。

“工作中最常用到的工具?”

python python python

但职位是“统计学家”的人还是显著地喜欢用R。

“工作中常用的数据类型是?”

工作中用到的数据主要是关系型数据,主要使用Git共享代码。

“工作中遇到的最大的困难?”

脏数据!看来数据科学领域最大的问题还是脏数据。排名第二的困难是“缺少数据科学人才”。正在学习数据科学的小伙伴们,你们前途无量呀!请带文摘菌一起飞!

新手如何入行数据科学领域?

作为一个数据科学学习社区,Kaggle在这份报告中也提出了一些数据科学老司机给新手学习者的建议,可以说是非常良心了!(这一部分可能是本份报告中最有价值的部分,文摘菌敲黑板划重点啦!)

“你们会推荐新手先学哪门语言?”

先学Python!这是Kaggle综合了超一万名老司机的意见给出的结论。

“你最常使用哪种数据科学学习资源?”

数据科学是一个日新月异的领域,保持持续的学习能力非常重要。据调研问卷显示,数据科学老司机最常用到的学习资源包括Stack Overflow Q&A,相关论坛,以及Podcasts。而关于开源内容,数据科学从业者更多使用官方文档和观看 Youtube 视频。

“你从何获取开源数据?”

没有数据就没有数据科学,所以提到数据科学学习技能,不得不提到获取开源优质数据的能力。报告中提到了一些优质数据获取渠道,包括Dataset aggregator, Google Search等。

“怎么找工作?”

数据科学从业老司机在找工作上的忠告也非常有趣:去公司官网或相关网站的技术板块乃下下策,他们更建议的方式是,直接联系招聘人,或建立自己的关系网。

最后,对所有正在阅读问卷结果的人,文摘菌想特意说明Kaggle在问卷中备注的一句话:每个人都是独特的,不是一个个平均数就能代表的。问卷的结论建立在1.6万名Kaggle使用者的答案上,但他们只是数据从业者的一小部分——年龄、性别、所在地区、职位、薪酬、经验和所受教育的不同都无法阻止我们对数据科学的热爱!

Python基础学习之常用六大数据类型 公司视频课程

img

许问兰

关注

刚开始学习一门编程语言,除了了解运行环境与语言类型之外,最基本还是从该语言的基本数据类型开始学起。

Python六大常用数据类型:

int 整数 float 浮点数 str 字符串 list 列表 tuple 元组 dict 字典

讲解这些先说一下python中的变量与变量名。

变量其实本质上是一个具有特殊格式的内存,变量名则是指向这个内存的别名。python中的变量不需要声明,所有的变量必须赋值了才能使用。赋值的步骤:

a = 100

第一步:准备好值100第二部:准备好变量名a第三部:将值与名字进行关联

一、整数python将其他一些静态语言中的int、long,也就是整型和长整型合并为了一个。python中的int是边长的,也就是说可以存储无限大的整数,但是这是不现实的,因为没有这么多的内存够分配。整型不仅支持十进制,还支持二进制、八进制、十六进制。可以通过下面的方式来互相转换:

print(bin(20)) #转换二进制print(oct(20)) #转换八进制print(hex(20)) #转换十六进制

二、浮点型浮点数也就是小数,如22.1,44.2,也可以使用科学计数法,比如:1.22e8。python支持对整数和浮点数直接进行四则混合运算。整数运算结果仍然是整数,浮点数运算结果仍然是浮点数,但整数和浮点数混合运算的结果就变成浮点数了。

a = 1b = 1.1print(type(a+b)) #

三、字符串字符串在任何编程语言中都是最常用的数据类型。字符串的创建很简单,也是上面所说的三步,但是要加上单引号或者双引号。

a = "hello python"

也可以使用 “”" 创建多行字符串:

a = """ hello python"""

字符串可以通过下面方式进行截取或者连接:

print (str[0:4]) 输出第一个到倒数第四个的所有字符 print (str[0]) 输出单字符 第1个字符print (str[3:]) 输出从第四个开始之后的所有字符print (str * 2) 输出字符串两次print (str + "bbbb") 连接字符串

字符串常用函数:str.strip() 消除字符串s左右两边的空白字符(包括’\t’,’\n’,’\r’,’’)len(str) 获取字符串长度str.upper() 转换为大写str.lower() 转换为小写str.title() 每个单词首字母大写str.capitalize() 首字母大写字符串翻转:

a = 'abcde'print(a[::-1])

字符串分割:

a = 'hello,python'print(a.split(',')) #['hello', 'python'] 返回一个列表

相对应的还有一个将列表元素连接成字符串:

a = ['hello', 'python']str = '-'print(str.join(a)) # hello-python

四、列表列表的写法是一个方括号内的值用逗号分隔。比如上面的[‘hello’, ‘python’]。列表的数据项不需要具有相同的类型,列表中的每个元素都分配一个数字索引,第一个索引是0,第二个索引是1,依此类推。访问列表中的值可以通过下面的方式:

list1 = [1, 2, 3, 4, 5, 6]print(list1[2])

同样可以通过索引截取

print ("list1[2:5]: ", list1[2:5])

列表常用操作:list1.append(‘7’) 追加一个元素在末尾,每次只能添加一个len(list1) 返回列表元素个数max(list1) 返回列表元素最大值min(list1) 返回列表元素最小值list1.count(obj) 统计某个元素在列表中出现的次数list1.index(obj) 从列表中找出某个值第一个匹配项的索引位置list1.reverse() 反向列表中元素list1.clear() 清空列表list1.extend(seq) 在列表末尾一次性追加另一个序列中的多个值,也就是扩充了列表 append与extend的区别:

A = ['a', 'b', 'c']A.append(['d', 'e'])print(A) # ['a', 'b', 'c', ['d', 'e']]B = ['a', 'b', 'c']B.extend(['d', 'e'])print(B) # ['a', 'b', 'c', 'd', 'e']

extend方法只能接收list类型,它是把这个列表中的每个元素添加到原list中。append可以接收任意类型,追加到原list的末尾。

五、元组元组的创建也很简单,和list类似,只是把’[]‘换成了’()’。

tup1 = ('hello', 'python')

元组中只有一个元素的时候要注意:

tup2 = (10)tup3 = ('a')print(type(tup2)) #print(type(tup3)) #

因为这样会被解释器当做运算符,所以正确的方法是在第一个元素后面添加逗号。

tup4 = ('a',)print(type(tup4)) #

元组同样可以使用下标索引来访问元组中的值:

tup5 = ('hello', 'python', 'hello', 'word')print(tup5[1]) #pythonprint(tup5[1:3]) #('python', 'hello')

注意:元组是不可以被修改的。

tup6 = ('hello', 'python', 'hello', 'word')tup6[2] = 'aaa'

上面会出现一个异常: TypeError: ‘tuple’ object does not support item assignment.但是元组中如果包含了一个列表,那么这个列表是可以被修改的。

tup7 = ('hello', 'python', 'hello', 'word', ['aa', 'bb', 'cc'])tup7[-1][1] = 'ddd'print(tup7) # ('hello', 'python', 'hello', 'word', ['aa', 'ddd', 'cc'])

元组运算符:len(tup) 计算元素个数tup1 + tup2 连接生成新元组tup * 4 元组复制num in tup 元素是否存在,返回True/False

六、字典python中的字典就是key,value的形式。使用大括号包含起来。字典中的成员的键是唯一的,如果出现多个同名的键,那么写在后面覆盖前面的值。形式如下:

dict1 = {'a' : 1, 'b' : 2}

字典的常用操作最基本的也就是增删改查:获取:直接通过键来获取。

dict['b'] # 2

dict.keys() 获取字典中所有的键dict.values() 获取字典中的所有的值增加:

dict1['c'] = 3 #{'a': 1, 'b': 2, 'c': 3} #如果键存在则更新对应的值

修改:直接给键进行再次赋值就可以修改键对应的值了。如果键不存在,则变成添加成员。还可以通过:

dict1.update({"a":"11"})dict1.setdefault("a", "222") # 已存在的键则修改无效dict1.setdefault("d","222") # 不存在的话则创建dict1.setdefault("e") # 没有设置值为None

删除:使用pop删除指定键对应的成员,同时返回该值

print(dict1) # {'a': '11', 'b': 2, 'c': 3, 'd': '222', 'e': None}print(dict1.pop("a")) # aprint(dict1) # {'b': 2, 'c': 3, 'd': '222', 'e': None}#在不设置默认值的情况下,使用pop删除不存在的键,会报错。print(dict1.pop("f")) # 报错 KeyError: 'f'

如果设置了默认值, print(dict1.pop(“f”, None)),则不会报错,返回这个默认值。判断是否删除成功可以通过下面方式来判断:

if dict1.pop("f", None) == None: print('键不存在')else: print('删除成功')

以上则是python中最基本的数据类型以及用法,当然还有其他的数据类型,作者暂时只列举了这些。

更过python文章,关注作者哦!干货多多!!

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP