暑假初学python,有过一点java与c++基础的我在学习过程中深深感到python的极易上手性。初步掌握基础语法后,发觉第三方库的丰富是python生态性的一大亮点。然而在比照教材安装第三方库的过程中出现了一系列问题,深受其害。像我这种接触python前对命令行一无所知的人来讲,第三方库的安装成功则罢,不成功真的是要人命。
论坛是个解决问题的好地方。然而网上各种帖子良莠不齐鱼龙混杂,很多只讲大概不讲细节,致使小白如我在很多不是问题的问题上浪费极大的时间和精力。现总结一些自己出现的基础的问题,希望有所帮助。
本人今年六月安装的python3.6,64位,系统win10。在python官网默认下载的版本是32位的,目前尚不清楚有何大区别。
本文以自己安装过程中出过问题几个第三方类库为例,以常识为重,掌握这些小技巧,阅读很多网上的帖子就不会用大多障碍了
一、命令行基础使用
win10系统下命令行可通过小娜直接输入cmd,就可以打开。此处建议右键选择管理员权限运行,避免有些操作没有权限而报错。(曾经有过一次报错的经历,百度后以管理员模式改了一个地方成功了,后来养成习惯每次都以管理员权限运行,也没再深究是否是这个因素)
以管理员模式打开后,就要用命令行来安装第三方类库了。python的第三方类库并不是通过IDEL来安装的,而是通过命令行来调用pip.exe(pip3.exe)来进行安装。So,我们要进行的第一步就是找到这个pip.exe。方法有很多,最简单的就是找到你编写python使用的IDEL,右键查看属性,有个打开文件所在位置,这样就能找到安装在电脑上的python的位置了。如果操作之后是快捷方式也不要紧,重复操作,继续右键查看属性再打开文件。
打开文件夹之后,找到Scripts文件夹,点击进入,然后点击上面的地址栏,将该地址新建一个txt复制到里面。因为用的太频繁我索性把这个txt放在桌面上了。进入文件夹,里面就会发现pip.exe了。之后我们打开cmd,输入 cd txt里面复制的地址,例如 cd C:\Program Files\Python36\Scripts 然后就可以将命令行的工作目录转换为C:\Program Files\Python36\Scripts这个文件夹了。里面有我们经常使用的pip、pip3和以后你下载的包使用的exe等文件。用多了嫌麻烦也可自己在我的电脑中更改环境变量的系统变量,这样就省去频繁的cd 地址这个操作了。
ps:使用↑方向键可以复制上一条命令语句。灰常好用。
二、安装第三方库的血泪路
大部分python第三方类库的安装还是很简单的,大部分只需在cmd中进入上面所提到的Scripts文件夹,使用命令pip3 install ***就行了。
快则几秒慢则几分钟,稍等片刻就安完可以调用了。但有些第三方类库却问题连连,翻遍论坛解决方案一堆却没几个能用的,在这总结了一下自己安装第三方类库从失败到成功的方法,希望减少大家走的弯路。
2.1 numpy第三方类库
万分感谢以及跪谢这位素不相识的知乎大佬,让我在半夜两点装完numpy安心入睡。下面直接引用知乎回答内容以及原文链接。
python下numpy不成功,请问有没有简单的安装方法? - 知乎 https://www.zhihu.com/question/29521273
我估计你用的是Windows,虽然很多人推荐你用Enthought和Anaconda但是那个会剥夺你很多学习体验。如果你知道怎么用CMD/Powershell的话,先把Python的文件夹下面的l/ib文件夹放到你的系统变量里面去,另外就是选择安装Python 2.7.9这样pip是自带的。(如果这个你不会你还是用Pre-installed IDE吧)你在cmd里面用pip安装64位系统的numpy是会出现问题的,这个很多人都遇到过,而且之后估计你还要安装Scipy,这需要用到C和Fortran的编译器你估计也没有……
所以我建议你安装wheel文件,我给你一个地址http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
看清楚根据你的python版本和你电脑的bit数来选择wheel文件。为了能够安装wheel文件,你需要首先安装wheel这个包。进到cmd里面输入pip install wheel
安装成功以后下载相应的numpy的wheel文件,在cmd里面移动到本地文件存放的地方。然后输入pip install numpy‑1.9.2+mkl‑cp27‑none‑win_amd64.whl
上面这个语句最后一部分是文件名,根据你问题的描述你应该就是下载这个文件,然后回车就可以自动安装了。你安装numpy+mkl的好处是会减少你安装scipy的阻力,安装scipy一直就不是一件惬意的事情。
当然了,如果你根本不想要这么麻烦,还是安装个Enthought, Anaconda或者PythonXY吧。
2.2 scipy库
前排说明:scipy库的安装前提是已经有numpy库,故不可先安装scipy再安装numpy。
按照2.1的方法安装完numpy库之后,用pip3 list 发现安装的numpy是带着版本号+mkl的。如numpy (1.13.1+mkl)。不是很清楚这个mkl是什么用途,但是好像没有这个安装scipy会麻烦很多。
安装scipy时,一开始我也是用pip3 install scipy 直接安装的,但是下载速度极其感人,而且下到一半就不下了。无奈去pypi找到了对应版本的scipy的whl文件(速度也很慢,但好歹不会下到一半就停止),然后下载到桌面,cmd里cd到桌面,pip3 install scipy-1.0.0-cp36-none-win_amd64.whl安装成功的。
三、自己常使用的包
1.you-get 常用来下载视频,格式可选,使用方便,煲剧党居家旅行必备。亲测优酷搜狐和乐视非会员视频可以下载,腾讯和爱奇艺貌似不行(果然有钱的视频网站不是吃素的)
You-Get——基于Python3的媒体下载工具 - 简书 http://www.jianshu.com/p/a3f8df948395
2.request 和beautifulsoup4 用来爬取数据和解析网页的。应该是数据爬取常用的类库。
我看的教材解释的挺详细,有啥没写的单独百度找,所以并没有综合介绍的文章链接。
3.selenium 自动化测试用的(神奇的玩意),我也用它来爬取过数据。相比较与第二种,这个套上模板用起来不算很难,不需要自己找json文件,而且看起来就像自己在操作(试想半夜别人看到无人操作却不停在操作刷新的电脑。。)默认支持的是火狐浏览器,自己尝试过改成ie,失败后放弃,并成功对火狐路转粉。缺点,爬取网页时会进行渲染等与你爬取数据无用的操作,故时间耗费严重。
#selenium爬取空间说说(火狐)
#coding:utf-8
import unittest
import time
from selenium import webdriver
from bs4 import BeautifulSoup
class seleniumTest(unittest.TestCase):
user = '**********' # 你的QQ号
pw = '*************' # 你的QQ密码
def setUp(self):
# 调试的时候用firefox比较直观
# self.driver = webdriver.PhantomJS()
self.driver = webdriver.Firefox()
def testEle(self):
driver = self.driver
# 浏览器窗口最大化
driver.maximize_window()
# 浏览器地址定向为qq登陆页面
driver.get("http://i.qq.com")
# 很多时候网页由多个<frame>或<iframe>组成,webdriver默认定位的是最外层的frame,
# 所以这里需要选中一下frame,否则找不到下面需要的网页元素
driver.switch_to.frame("login_frame")
# 自动点击账号登陆方式
driver.find_element_by_id("switcher_plogin").click()
# 账号输入框输入已知qq账号
driver.find_element_by_id("u").send_keys(self.user)
# 密码框输入已知密码
driver.find_element_by_id("p").send_keys(self.pw)
# 自动点击登陆按钮
driver.find_element_by_id("login_button").click()
# 如果登录比较频繁或者服务器繁忙的时候,一次模拟点击可能失败,所以想到可以尝试多次,
# 但是像QQ空间这种比较知名的社区在多次登录后都会出现验证码,验证码自动处理又是一个
# 大问题,本例不赘述。本例采用手动确认的方式。即如果观察到自动登陆失败,手动登录后
# 再执行下列操作。
#r = ''
#while r != 'y':
# print ("Login seccessful?[y]")
# r = raw_input(r)
print ("Login seccessful?[y]")
time.sleep(3)
# 让webdriver操纵当前页
driver.switch_to.default_content()
# 跳到说说的url
driver.get("http://user.qzone.qq.com/" + self.user + "/311")
# 访问全部说说需要访问所有分页,需要获取本页数据后点击“下一页”按钮,经分析,“下一页”
# 按钮的id会随着点击的次数发生变化,规律就是每点一下加一,所以需要在程序中动态的构造
# 它的id。(或者不用id改用xpath)
next_num = 0 # 初始“下一页”的id
while True:
# 下拉滚动条,使浏览器加载出动态加载的内容,可能像这样要拉很多次,中间要适当的延时(跟网速也有关系)。
# 如果说说内容都很长,就增大下拉的长度。
driver.execute_script("window.scrollBy(0,10000)")
time.sleep(3)
driver.execute_script("window.scrollBy(0,20000)")
time.sleep(3)
driver.execute_script("window.scrollBy(0,30000)")
time.sleep(3)
driver.execute_script("window.scrollBy(0,40000)")
time.sleep(5)
# 很多时候网页由多个<frame>或<iframe>组成,webdriver默认定位的是最外层的frame,
# 所以这里需要选中一下说说所在的frame,否则找不到下面需要的网页元素
driver.switch_to.frame("app_canvas_frame")
soup = BeautifulSoup(driver.page_source)
#, 'xml'
contents = soup.find_all('pre', {'class': 'content'}) # 内容
times = soup.find_all('a', {'class': 'c_tx c_tx3 goDetail'}) # 发表时间
for content, _time in zip(contents, times): # 这里_time的下划线是为了与time模块区分开
#print (content.get_text(), _time.get_text())
print("时间:"+ _time.get_text())
print("内容:"+ content.get_text())
print()
# 当已经到了尾页,“下一页”这个按钮就没有id了,可以结束了
if driver.page_source.find('pager_next_' + str(next_num)) == -1:
break
# 找到“下一页”的按钮
elem = driver.find_element_by_id('pager_next_' + str(next_num))
# 点击“下一页”
elem.click()
# 下一次的“下一页”的id
next_num += 1
# 因为在下一个循环里首先还要把页面下拉,所以要跳到外层的frame上
driver.switch_to.parent_frame()
def tearDown(self):
print ('down')
if __name__ == "__main__":
unittest.main()
4.pyecharts 图形展示。百度做的echarts移植到python上的pyecharts。图形展示功能全面,使用简单。生成的是html,有简单的交互。建议直接读GitHub上的使用文档,中文的,方便易懂。