学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
02 爬虫
首先要做的是爬取b站的所有短评,包括评论用户名、评论时间、星级(评分)、评论内容、点赞数等内容,本部分内容为爬虫代码的说明,不感兴趣的读者可以直接跳过,阅读下一部分的分析。
爬的过程写了很久,b站短评不需要登陆直接就可以爬,刚开始用类似之前爬豆瓣的方法,用Selenium+xpath定位爬
但b站短评用这种方法并不好处理。网站每次最多显示20条短评,滚动条移动到最下面才会加载之后的20条,所以刚开始用了每次爬完之后将定位到当前爬的位置的方法,这样定位到当前加载的最后一条时,就会加载之后的20条短评。
逻辑上是解决了这个问题,但真的爬的时候就出现了问题,一个是爬的慢,20条需要十来秒的样子,这个没关系,大不了爬几个小时,但问题是辛辛苦苦爬了两千多条之后,就自动断了,不知道是什么原因,虽然之前爬的数据都存下来了,但没法接着断开的地方接着爬,又要重新开始,还不知道会不会又突然断,所以用这种方法基本就无解了。代码附在下面,虽然是失败的,但也可以爬一些评论下来,供参考。
1# -*- coding: utf-8 -*-
2"""
3Created on Mon Sep 10 19:36:24 2018
4"""
5from selenium import webdriver
6import pandas as pd
7from datetime import datetime
8import numpy as np
9import time
10import os
11
12os.chdir('F:\\python_study\\pachong\\工作细胞')
13def gethtml(url):
14
15 browser = webdriver.PhantomJS()
16 browser.get(url)
17 browser.implicitly_wait(10)
18 return(browser)
19
20def getComment(url):
21
22 browser = gethtml(url)
23 i = 1
24 AllArticle = pd.DataFrame(columns = ['id','author','comment','stars1','stars2','stars3','stars4','stars5','unlike','like'])
25 print('连接成功,开始爬取数据')
26 while True:
27
28 xpath1 = '//*[@id="app"]/div[2]/div[2]/div/div[1]/div/div/div[4]/div/div/ul/li[{}]'.format(i)
29 try:
30 target = browser.find_element_by_xpath(xpath1)
31 except:
32 print('全部爬完')
33 break
34
35 author = target.find_element_by_xpath('div[1]/div[2]').text
36 comment = target.find_element_by_xpath('div[2]/div').text
37 stars1 = target.find_element_by_xpath('div[1]/div[3]/span/i[1]').get_attribute('class')
38 stars2 = target.find_element_by_xpath('div[1]/div[3]/span/i[2]').get_attribute('class')
39 stars3 = target.find_element_by_xpath('div[1]/div[3]/span/i[3]').get_attribute('class')
40 stars4 = target.find_element_by_xpath('div[1]/div[3]/span/i[4]').get_attribute('class')
41 stars5 = target.find_element_by_xpath('div[1]/div[3]/span/i[5]').get_attribute('class')
42 date = target.find_element_by_xpath('div[1]/div[4]').text
43 like = target.find_element_by_xpath('div[3]/div[1]').text
44 unlike = target.find_element_by_xpath('div[3]/div[2]').text
45
46
47 comments = pd.DataFrame([i,author,comment,stars1,stars2,stars3,stars4,stars5,like,unlike]).T
48 comments.columns = ['id','author','comment','stars1','stars2','stars3','stars4','stars5','unlike','like']
49 AllArticle = pd.concat([AllArticle,comments],axis = 0)
50 browser.execute_script("arguments[0].scrollIntoView();", target)
51 i = i + 1
52 if i%100 == 0:
53 print('已爬取{}条'.format(i))
54 AllArticle = AllArticle.reset_index(drop = True)
55 return AllArticle
56
57url = 'https://www.bilibili.com/bangumi/media/md102392/?from=search&seid=8935536260089373525#short'
58result = getComment(url)
59#result.to_csv('工作细胞爬虫.csv',index = False)
这种方法爬取失败之后,一直不知道该怎么处理,刚好最近看到网上有大神爬猫眼评论的文章,照葫芦画瓢尝试了一下,居然成功了,而且爬的速度也很快,十来分钟就全爬完了,思路是找到评论对应的Json文件,然后获取Json中的数据,过程如下。
在Google浏览器中按F12打开卡发者工具后,选择Network
往下滑动,会发现过一段时间,会出现一个fetch,右键打开后发现,里面就是20条记录,有所有我们需要的内容,json格式。
所以现在需要做的就是去找这些json文件的路径的规律。多看几条之后,就发现了规律:
第一个json:
**https://bangumi.bilibili.com/review/web_api/short/list?**media_id=102392&folded=0&page_size=20&sort=0
第二个json:
https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0&cursor=76553500953424
第三个json:
https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0&cursor=76549205971454
显然所有的json路径的前半部分都是一样,都是在第一条json之后加上不同的cursor = xxxxx,所以只要能找到cursor值的规律,就可以用循环的办法,爬完所有的json,这个值看上去没什么规律,最后发现,每一个json路径中cursor值就藏在前一个json的最后一条评论中
在python中可以直接把json转成字典,cursor值就是最后一条评论中键cursor的值,简直不要太容易。
所以爬的思路就很清晰了,从一个json开始,爬完20条评论后,获取最后一个评论中的cursor值,更改路径之后获取第二个json,重复上面的过程,直到爬完所有的json。
至于如何知道爬完了所有json,也很容易,每个json中一个total键,表示了当前一共有多少条评论,所以只需要写一个while循环,当爬到的评论数达到total值时停止。
爬的过程中还发现,有些json中的评论数不够20条,如果每次用20去定位,中间会报错停止,需要注意一下。所以又加了一行代码,每次获得json后,通过**len()**函数得到当前json中一共包含多少条评论,cursor在最后一个评论中。
以上是整个爬的思路,我们最终爬到以下信息
需要说明的地方,一个是liked按照字面意思应该是用户的点赞数,但爬完才发现全是0,没有用。另一个是关于时间,里面有ctime和mtime两个跟时间有关的值,看了几个,基本都是一样的,有个别不太一样,差的不多,就只取了ctime,我猜可能一个是点击进去的时间,一个是评论提交时间,但没法验证,就随便取一个算了,ctime的编码很奇怪,比如某一个是ctime = 1540001677,渣渣之前没有见过这种编码方式,请教了大佬之后知道,这个是Linux系统上的时间表示方式,是1970年1月1日0时0分0秒到当时时点的秒数,python中可以直接用time.gmtime()函数转化成年月日小时分钟秒的格式。还有last_ep_index里面存的是用户当前的看剧状态,比如看至第13话,第6话之类的,但后来发现很不准,绝大多数用户没有last_ep_index值,所以也没有分析这个变量。
代码如下
1import requests
2from fake_useragent import UserAgent
3import json
4import pandas as pd
5import time
6import datetime
7headers = { "User-Agent": UserAgent(verify_ssl=False).random}
8comment_api = 'https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0'
9
10# 发送get请求
11response_comment = requests.get(comment_api,headers = headers)
12json_comment = response_comment.text
13json_comment = json.loads(json_comment)
14
15total = json_comment['result']['total']
16
17cols = ['author','score','disliked','likes','liked','ctime','score','content','last_ep_index','cursor']
18dataall = pd.DataFrame(index = range(total),columns = cols)
19
20
21j = 0
22while j <total:
23 n = len(json_comment['result']['list'])
24 for i in range(n):
25 dataall.loc[j,'author'] = json_comment['result']['list'][i]['author']['uname']
26 dataall.loc[j,'score'] = json_comment['result']['list'][i]['user_rating']['score']
27 dataall.loc[j,'disliked'] = json_comment['result']['list'][i]['disliked']
28 dataall.loc[j,'likes'] = json_comment['result']['list'][i]['likes']
29 dataall.loc[j,'liked'] = json_comment['result']['list'][i]['liked']
30 dataall.loc[j,'ctime'] = json_comment['result']['list'][i]['ctime']
31 dataall.loc[j,'content'] = json_comment['result']['list'][i]['content']
32 dataall.loc[j,'cursor'] = json_comment['result']['list'][n-1]['cursor']
33 j+= 1
34 try:
35 dataall.loc[j,'last_ep_index'] = json_comment['result']['list'][i]['user_season']['last_ep_index']
36 except:
37 pass
38
39 comment_api1 = comment_api + '&cursor=' + dataall.loc[j-1,'cursor']
40 response_comment = requests.get(comment_api1,headers = headers)
41 json_comment = response_comment.text
42 json_comment = json.loads(json_comment)
43
44 if j % 50 ==0:
45 print('已完成 {}% !'.format(round(j/total*100,2)))
46 time.sleep(0.5)
47
48
49
50dataall = dataall.fillna(0)
51
52def getDate(x):
53 x = time.gmtime(x)
54 return(pd.Timestamp(datetime.datetime(x[0],x[1],x[2],x[3],x[4],x[5])))
55
56dataall['date'] = dataall.ctime.apply(lambda x:getDate(x))
57
58dataall.to_csv('bilibilib_gongzuoxibao.xlsx',index = False)
03 影评分析
最终一共爬到了17398条影评数据。里面的date是用ctime转过来的,接下来对数据进行一些分析,数据分析通过python3.6完成,代码见文末。
评分分布
评分取值范围为2、4、6、8、10分,对应1-5颗星
文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!