python获取A股上市公司的盈利能力

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 6730 次浏览 • 2018-01-04 16:09 • 来自相关话题

利用tushare库,可以很方便的获取A股上市公司的基本面信息。
比如企业的盈利能力。
 import tushare as ts
#获取2017年第3季度的盈利能力数据
ts.get_profit_data(2017,3)返回的结果:
 
按年度、季度获取盈利能力数据,结果返回的数据属性说明如下:
code,代码 
name,名称 
roe,净资产收益率(%)
 net_profit_ratio,净利率(%) 
gross_profit_rate,毛利率(%) 
net_profits,净利润(百万元)  #这里的官网信息有误,单位应该是百万
esp,每股收益 
business_income,营业收入(百万元) 
bips,每股主营业务收入(元)
 
例如返回如下结果:
 
    code   name    roe  net_profit_ratio  gross_profit_rate  net_profits  \
  000717   韶钢松山  79.22              9.44            14.1042    1750.2624
  600793   宜宾纸业  65.40             13.31             7.9084     100.6484
  600306    商业城  63.19             18.55            17.8601     114.9175
  000526  *ST紫学  61.03              2.78            31.1212      63.6477
  600768   宁波富邦  57.83             14.95             2.7349      88.3171
 
原创,转载请注明:
http://30daydo.com/article/260
  查看全部
利用tushare库,可以很方便的获取A股上市公司的基本面信息。
比如企业的盈利能力。
 
import tushare as ts
#获取2017年第3季度的盈利能力数据
ts.get_profit_data(2017,3)
返回的结果:
 
按年度、季度获取盈利能力数据,结果返回的数据属性说明如下:
code,代码 
name,名称 
roe,净资产收益率(%)
 net_profit_ratio,净利率(%) 
gross_profit_rate,毛利率(%) 
net_profits,净利润(百万元)  #这里的官网信息有误,单位应该是百万
esp,每股收益 
business_income,营业收入(百万元) 
bips,每股主营业务收入(元)
 
例如返回如下结果:
 
    code   name    roe  net_profit_ratio  gross_profit_rate  net_profits  \
  000717   韶钢松山  79.22              9.44            14.1042    1750.2624
  600793   宜宾纸业  65.40             13.31             7.9084     100.6484
  600306    商业城  63.19             18.55            17.8601     114.9175
  000526  *ST紫学  61.03              2.78            31.1212      63.6477
  600768   宁波富邦  57.83             14.95             2.7349      88.3171
 
原创,转载请注明:
http://30daydo.com/article/260
 

scipy.misc.lena AttributeError: 'module' object has no attribute 'lena'

python李魔佛 发表了文章 • 0 个评论 • 10466 次浏览 • 2018-01-03 19:42 • 来自相关话题

在数据可视化的那本书上看到的demo,不过运行不通过,然后出现上面的那个错误,lena函数看起来被移除了。
 
import scipy.misc
lena=scipy.misc.lena()
plt.gray()
plt.imshow(lena)
plt.colorbar()
plt.show()
Error:
lena=scipy.misc.lena()
AttributeError: 'module' object has no attribute 'lena'
  
定位到scipy包的位置
/usr/local/lib/python2.7/dist-packages/scipy/misc
然后根据文本查找一下: find -name '*.py' | xargs grep 'lena'
 
果然,没有返回相关的字段。 看样子在scipy 1.0.0版本上已经移除了lena图的数据了。 
 
不过替换了一张其他的图片。 在misc目录下看到一个叫ascent的data, 替换这个函数后: 
scipy.misc.ascent()
后,显示一个楼梯的图片。只能凑合着用吧。 lena图自己上网找一张然后数字化就好了。
 
  查看全部
在数据可视化的那本书上看到的demo,不过运行不通过,然后出现上面的那个错误,lena函数看起来被移除了。
 
	import scipy.misc
lena=scipy.misc.lena()
plt.gray()
plt.imshow(lena)
plt.colorbar()
plt.show()

Error:
lena=scipy.misc.lena()
AttributeError: 'module' object has no attribute 'lena'
  
定位到scipy包的位置
/usr/local/lib/python2.7/dist-packages/scipy/misc
然后根据文本查找一下: find -name '*.py' | xargs grep 'lena'
 
果然,没有返回相关的字段。 看样子在scipy 1.0.0版本上已经移除了lena图的数据了。 
 
不过替换了一张其他的图片。 在misc目录下看到一个叫ascent的data, 替换这个函数后: 
scipy.misc.ascent()
后,显示一个楼梯的图片。只能凑合着用吧。 lena图自己上网找一张然后数字化就好了。
 
 

dataframe reindex和reset_index区别

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 83248 次浏览 • 2017-12-30 15:58 • 来自相关话题

reset_index的作用是重新设置dataframe的index,范围为0~len(df)。 df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
df2 = pd.DataFrame({'A': [6], 'B': [60]})
print('df', df)
print('df2', df2)

df_x = [df, df2]
result = pd.concat(df_x)
print('first result ', result) 
上面代码把df和df2合并为一个result,但是result的index是乱的。





 
那么执行result2= result.reset_index()
得到如下的result2: (默认只是返回一个copy,原来的result没有发生改变,所以需要副本赋值给result2)





可以看到,原来的一列index现在变成了columns之一,新的index为[0,1,2,3,4,5]
如果添加参数 reset_index(drop=True) 那么原index会被丢弃,不会显示为一个新列。result2 = result.reset_index(drop=True)



 
reindex的作用是按照原有的列进行重新生成一个新的df。
 
还是使用上面的代码
result目前是df和df2的合并序列。
如下:




 
可以看到index为[0,1,2,3,4,0]
执行 result3 = result.reindex(columns=['A','C'])




 
可以看到,原index并没有发生改变,而列变成了A和C,因为C是不存在的,所以使用了NaB填充,这个值的内容可以自己填充,可以改为默认填充0或者任意你想要的数据。reindex(columns=..)的作用类似于重新把列的顺序整理一遍, 而使用reindex(index=....) 则按照行重新整理一遍。

原文链接:http://30daydo.com/article/257 
欢迎转载,注明出处
  查看全部
reset_index的作用是重新设置dataframe的index,范围为0~len(df)。
    df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
df2 = pd.DataFrame({'A': [6], 'B': [60]})
print('df', df)
print('df2', df2)

df_x = [df, df2]
result = pd.concat(df_x)
print('first result ', result)
 
上面代码把df和df2合并为一个result,但是result的index是乱的。

df4.PNG

 
那么执行
result2= result.reset_index()

得到如下的result2: (默认只是返回一个copy,原来的result没有发生改变,所以需要副本赋值给result2)

df5.PNG

可以看到,原来的一列index现在变成了columns之一,新的index为[0,1,2,3,4,5]
如果添加参数 reset_index(drop=True) 那么原index会被丢弃,不会显示为一个新列。
result2 = result.reset_index(drop=True)
df6.PNG

 
reindex的作用是按照原有的列进行重新生成一个新的df。
 
还是使用上面的代码
result目前是df和df2的合并序列。
如下:
df7.PNG

 
可以看到index为[0,1,2,3,4,0]
执行 
result3 = result.reindex(columns=['A','C'])

df8.PNG

 
可以看到,原index并没有发生改变,而列变成了A和C,因为C是不存在的,所以使用了NaB填充,这个值的内容可以自己填充,可以改为默认填充0或者任意你想要的数据。reindex(columns=..)的作用类似于重新把列的顺序整理一遍, 而使用reindex(index=....) 则按照行重新整理一遍。

原文链接:http://30daydo.com/article/257 
欢迎转载,注明出处
 

dataframe的index索引是否可以重复

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 11445 次浏览 • 2017-12-30 15:10 • 来自相关话题

答案是肯定的。
  df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
df2 = pd.DataFrame({'A': [6], 'B': [60]})
print 'df\n', df
print 'df2\n', df2输出如下:
df1





df2




 
然后进行合并: df_x = [df, df2]
result = pd.concat(df_x)
print 'first result\n', result
合并后的结果:





 
合并后的index是[0,1,2,3,4,0] 所以index集合是一个类似list的结构,而非set结构,允许重复数据的存在。
 
原文链接:http://30daydo.com/article/256 
转载请注明
 
  查看全部
答案是肯定的。
 
    df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
df2 = pd.DataFrame({'A': [6], 'B': [60]})
print 'df\n', df
print 'df2\n', df2
输出如下:
df1
df.PNG


df2
df2.PNG

 
然后进行合并:
    df_x = [df, df2]
result = pd.concat(df_x)
print 'first result\n', result

合并后的结果:

dfx.PNG

 
合并后的index是[0,1,2,3,4,0] 所以index集合是一个类似list的结构,而非set结构,允许重复数据的存在。
 
原文链接:http://30daydo.com/article/256 
转载请注明
 
 

tushare使用get_stock_basic()保存为excel会因为乱码出错而无法保存

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 7381 次浏览 • 2017-12-30 13:11 • 来自相关话题

代码如下:
basic=ts.get_stock_basics()

print basic.info()
print basic.head(10)

basic.to_excel('basic2017.xls',encoding='gbk')
运行后会出错:

'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
 
很明显的是编问题。 
 
然后尝试使用解决编码的步骤。
1. reload(sys) 设置default为utf-8: 失败
2. to_excel('stock.xls',encoding='gbk') : 失败,encoding参数换了几个都是失败,utf-8,gb2312,cp1252
 
最后解决的办法是,先把df保存为csv,然后再从csv从读取出来,然后再存储为excel。 整个过程的encoding参数都是用'gbk'.
basic.to_csv('2017_all_price_change.xls',encoding='gbk')
df=pd.read_csv('2017_all_price_change.xls',encoding='gbk')
df.to_excel('2017_all_price_change.xls',encoding='gbk')
  查看全部
代码如下:
    basic=ts.get_stock_basics()

print basic.info()
print basic.head(10)

basic.to_excel('basic2017.xls',encoding='gbk')

运行后会出错:

'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
 
很明显的是编问题。 
 
然后尝试使用解决编码的步骤。
1. reload(sys) 设置default为utf-8: 失败
2. to_excel('stock.xls',encoding='gbk') : 失败,encoding参数换了几个都是失败,utf-8,gb2312,cp1252
 
最后解决的办法是,先把df保存为csv,然后再从csv从读取出来,然后再存储为excel。 整个过程的encoding参数都是用'gbk'.
    basic.to_csv('2017_all_price_change.xls',encoding='gbk')
df=pd.read_csv('2017_all_price_change.xls',encoding='gbk')
df.to_excel('2017_all_price_change.xls',encoding='gbk')

 

pandas to_excel函数参数中的文件名需要为.xls

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 11350 次浏览 • 2017-12-29 18:10 • 来自相关话题

例如 df.to_excel('2017-analysis')
会报错。
ValueError: No engine for filetype: ''

需要把文件名也命名为'2017-analysis.xls' 才能过正常运行。
 
不同于其他本文格式,可以随意命名后缀,然后生成文件后再修改后缀。
  查看全部
例如 df.to_excel('2017-analysis')
会报错。
ValueError: No engine for filetype: ''

需要把文件名也命名为'2017-analysis.xls' 才能过正常运行。
 
不同于其他本文格式,可以随意命名后缀,然后生成文件后再修改后缀。
 

Dataframe中的plot函数绘图会把日期index自动补全

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 5995 次浏览 • 2017-12-26 14:49 • 来自相关话题

代码如下:
df=pd.read_excel('600050.xls',dtype={'datetime':np.datetime64})
df=df.set_index('datetime')
df['close'].plot(use_index=True,grid=True)
plt.show()
df为中国联通的日线数据,跨度为2016年到2017年底,中间有过一段时间的停牌。 用上面的代码绘制出来的曲线图,回发现,横坐标是日期,可是图中居然会把停牌的日子也插进去,这样导致了图形中间出现了一条长长的折线。
因为停牌后,股价是是不会变化的。 
  查看全部
代码如下:
	df=pd.read_excel('600050.xls',dtype={'datetime':np.datetime64})
df=df.set_index('datetime')
df['close'].plot(use_index=True,grid=True)
plt.show()

df为中国联通的日线数据,跨度为2016年到2017年底,中间有过一段时间的停牌。 用上面的代码绘制出来的曲线图,回发现,横坐标是日期,可是图中居然会把停牌的日子也插进去,这样导致了图形中间出现了一条长长的折线。
因为停牌后,股价是是不会变化的。 
 

pandas dataframe read_excel读取的列设置为日期类型datetime

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 22035 次浏览 • 2017-12-25 17:53 • 来自相关话题

比如excel中有一列是日期:





 
如果使用函数 pd.read_excel('xxx.xls') 读入,那么日期列实际会被认为是一个non-null object 类型,虽然可以后期对这个格式进行转换,但其实可以加入一个参数dtype, 就可以在读excel的时候就指定某列的数据类型。
 
pd.read_excel('xxx.xls',dtype={'出生日期':np.datetime64}
 
注意np中的datetime类型是datetime64. 查看全部
比如excel中有一列是日期:

timg.jpg

 
如果使用函数 pd.read_excel('xxx.xls') 读入,那么日期列实际会被认为是一个non-null object 类型,虽然可以后期对这个格式进行转换,但其实可以加入一个参数dtype, 就可以在读excel的时候就指定某列的数据类型。
 
pd.read_excel('xxx.xls',dtype={'出生日期':np.datetime64}
 
注意np中的datetime类型是datetime64.

ubuntu python matplotlib绘图不显示图形

python李魔佛 发表了文章 • 0 个评论 • 5672 次浏览 • 2017-12-25 16:37 • 来自相关话题

版本信息: ubuntu16
python 2.7
matplotlib (最新,通过pip安装的)
 
绘制任何图形都会输出下面的错误:
TypeError: Couldn't find foreign struct converter for 'cairo.Context'
 
cairo这个依赖库我已经通过apt安装的了。
 
通过调试,最后发现需要安装这个库: 
    sudo apt-get install python-gi-cairo
 
安装后就可以看到图像能够正常显示了。(不然会显示一片空白,其实如果你选择保存的话,然后打开图像,是可以看到绘制出来的图像的) 查看全部
版本信息: ubuntu16
python 2.7
matplotlib (最新,通过pip安装的)
 
绘制任何图形都会输出下面的错误:
TypeError: Couldn't find foreign struct converter for 'cairo.Context'
 
cairo这个依赖库我已经通过apt安装的了。
 
通过调试,最后发现需要安装这个库: 
    sudo apt-get install python-gi-cairo
 
安装后就可以看到图像能够正常显示了。(不然会显示一片空白,其实如果你选择保存的话,然后打开图像,是可以看到绘制出来的图像的)

vmware虚拟机在i7 4核8线程的电脑上为什么会很卡

网络安全李魔佛 发表了文章 • 0 个评论 • 9075 次浏览 • 2017-12-24 16:16 • 来自相关话题

配置如下:





 
cpu性能算很猛的了,虽然内存只有4GB,但怎么也不至于开一个vmware,里面运行ubuntu,会卡成翔。
电脑是32位的win7。CPU的虚拟化被禁止了。
 
后面经过不断的调整参数,发现问题出现在虚拟机的CPU核心数的设置上。 默认选择了2个CPU核心,当时认为虚拟机占用的CPU核心越少,那么主机host就会不那么卡。 结果发现不是这么一回事。 把CPU数目设置为4后,发现主机host的一点也不卡了。 查看全部
配置如下:

pc.png

 
cpu性能算很猛的了,虽然内存只有4GB,但怎么也不至于开一个vmware,里面运行ubuntu,会卡成翔。
电脑是32位的win7。CPU的虚拟化被禁止了。
 
后面经过不断的调整参数,发现问题出现在虚拟机的CPU核心数的设置上。 默认选择了2个CPU核心,当时认为虚拟机占用的CPU核心越少,那么主机host就会不那么卡。 结果发现不是这么一回事。 把CPU数目设置为4后,发现主机host的一点也不卡了。

微信 支付宝都无法在wp8.1上登录了

网络安全李魔佛 发表了文章 • 0 个评论 • 2972 次浏览 • 2017-12-21 00:39 • 来自相关话题

今天打开尘封的lumia手机,发现微信和支付宝都无法登录了。
sign,WP系统算是彻底完蛋了吧。
今天打开尘封的lumia手机,发现微信和支付宝都无法登录了。
sign,WP系统算是彻底完蛋了吧。

树莓派安装mongodb服务器

网络李魔佛 发表了文章 • 0 个评论 • 7561 次浏览 • 2017-12-18 16:57 • 来自相关话题

树莓派的自带的源就自带了mongodb-server的安装包,所以只需要使用命令:sudo apt-get install mongodb-server 就可以安装了。
 
不过安装的是32bit 的mongodb,数据库的大小会被限制在2GB。
树莓派启动mongodb
修改/etc/mongodb.config,
把里面的bind=127.0.0.1 注释掉,前面加一个#即可,因为这样其他主机也可以访问这台树莓派的mongodb服务器。
修改dbpath和dblog的路径,因为默认的路径你需要root权限

然后运行 mongod --config /etc/mongodb.config , 然后远程使用mongo ip地址就可以远程连接了。 查看全部
树莓派的自带的源就自带了mongodb-server的安装包,所以只需要使用命令:sudo apt-get install mongodb-server 就可以安装了。
 
不过安装的是32bit 的mongodb,数据库的大小会被限制在2GB。
树莓派启动mongodb
修改/etc/mongodb.config,
把里面的bind=127.0.0.1 注释掉,前面加一个#即可,因为这样其他主机也可以访问这台树莓派的mongodb服务器。
修改dbpath和dblog的路径,因为默认的路径你需要root权限

然后运行 mongod --config /etc/mongodb.config , 然后远程使用mongo ip地址就可以远程连接了。

使用官网下载的mongodb,如何设置远程连接mongodb服务器

网络安全李魔佛 发表了文章 • 0 个评论 • 5006 次浏览 • 2017-12-17 23:10 • 来自相关话题

在linux到官网下载mongodb,选择64位版本。
解压后在mongo的bin目录下运行 mongod --dbpath ~/mongo/db
可以看到mongodb服务被正常启动了。
 
在局域网其他电脑上使用mongodb客户端尝试连接这个mongo服务器,发现无法连接上。
因为官网下载的mongo问价解压后并没有mongo.conf配置文件。
 
在本机运行命令: mongo
可以看到输出:
 Server has startup warnings:
2017-12-17T22:56:19.702+0800 I STORAGE [initandlisten]
2017-12-17T22:56:19.702+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-12-17T22:56:19.702+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core ... ystem
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** Remote systems will be unable to connect to this server.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** Start the server with --bind_ip <address> to specify which IP
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** addresses it should serve responses from, or with --bind_ip_all to
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** bind to all interfaces. If this behavior is desired, start the
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** server with --bind_ip 127.0.0.1 to disable this warning.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten]
从上面的信息可以看到,如果需要远程的机子连接到本机,需要添加一个选项: --bind_ip_all
运行下面命令后:
mongod --dbpath ~/mongo/db --bind_ip_all
 
远程的机子就能够连上mongo服务器了。
 
原文地址:http://30daydo.com/article/247
转载请注明出处 查看全部
在linux到官网下载mongodb,选择64位版本。
解压后在mongo的bin目录下运行 mongod --dbpath ~/mongo/db
可以看到mongodb服务被正常启动了。
 
在局域网其他电脑上使用mongodb客户端尝试连接这个mongo服务器,发现无法连接上。
因为官网下载的mongo问价解压后并没有mongo.conf配置文件。
 
在本机运行命令: mongo
可以看到输出:
 
Server has startup warnings: 
2017-12-17T22:56:19.702+0800 I STORAGE [initandlisten]
2017-12-17T22:56:19.702+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-12-17T22:56:19.702+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core ... ystem
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** Remote systems will be unable to connect to this server.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** Start the server with --bind_ip <address> to specify which IP
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** addresses it should serve responses from, or with --bind_ip_all to
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** bind to all interfaces. If this behavior is desired, start the
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten] ** server with --bind_ip 127.0.0.1 to disable this warning.
2017-12-17T22:56:20.600+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten]
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2017-12-17T22:56:20.601+0800 I CONTROL [initandlisten]

从上面的信息可以看到,如果需要远程的机子连接到本机,需要添加一个选项: --bind_ip_all
运行下面命令后:
mongod --dbpath ~/mongo/db --bind_ip_all
 
远程的机子就能够连上mongo服务器了。
 
原文地址:http://30daydo.com/article/247
转载请注明出处

python多线程出现错误 thread.error: can't start new thread

python李魔佛 发表了文章 • 0 个评论 • 15951 次浏览 • 2017-12-14 17:58 • 来自相关话题

原因是线程数太多,没有退出,导致正在运行的线程数超过系统的限制。(win7 64bit貌似支持1000多个python线程同时运行)。
 
解决办法就是加锁或者合理退出一些占用资源的线程。
原因是线程数太多,没有退出,导致正在运行的线程数超过系统的限制。(win7 64bit貌似支持1000多个python线程同时运行)。
 
解决办法就是加锁或者合理退出一些占用资源的线程。

[scrapy]修改爬虫默认user agent的多种方法

python爬虫李魔佛 发表了文章 • 0 个评论 • 9972 次浏览 • 2017-12-14 16:22 • 来自相关话题

1. 创建scrapy项目:scrapy startproject headerchange2. 创建爬虫文件scrapy genspider headervalidation helloacm.com
3. 目标站点:

https://helloacm.com/api/user-agent/

这一个站点直接返回用户的User-Agent, 这样你就可以直接查看你的User-Agent是否设置成功。
尝试用浏览器打开网址 
https://helloacm.com/api/user-agent/,

网站直接返回:  
"Mozilla\/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/62.0.3202.94 Safari\/537.36"
 
3. 配置scrapy
在spider文件夹的headervalidation.py 修改为一下内容。class HeadervalidationSpider(scrapy.Spider):
name = 'headervalidation'
allowed_domains = ['helloacm.com']
start_urls = ['http://helloacm.com/api/user-agent/']

def parse(self, response):
print '*'*20
print response.body
print '*'*20
项目只是打印出response的body,也就是打印出访问的User-Agent信息。
 
运行:scrapy crawl headervalidation会发现返回的是503。 接下来,我们修改scrapy的User-Agent
 
方法1:
修改setting.py中的User-Agent# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Hello World'
然后重新运行scrapy crawl headervalidation
这个时候,能够看到正常的scrapy输出了。2017-12-14 16:17:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-12-14 16:17:35 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://helloacm.com/api/us
er-agent/> from <GET http://helloacm.com/api/user-agent/>
2017-12-14 16:17:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://helloacm.com/api/user-agent/> (referer: None)

[b]********************
"Hello World"
********************
[/b]2017-12-14 16:17:37 [scrapy.core.engine] INFO: Closing spider (finished)
2017-12-14 16:17:37 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 406,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 796,
'downloader/response_count': 2,
'downloader/response_status_count/200': 1,
'downloader/response_status_count/301': 1,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2017, 12, 14, 8, 17, 37, 29000),
'log_count/DEBUG': 3,
'log_count/INFO': 7,
'response_received_count': 1,
'scheduler/dequeued': 2,
'scheduler/dequeued/memory': 2,
'scheduler/enqueued': 2,
'scheduler/enqueued/memory': 2,
'start_time': datetime.datetime(2017, 12, 14, 8, 17, 35, 137000)}
2017-12-14 16:17:37 [scrapy.core.engine] INFO: Spider closed (finished)
 
正确设置了User-Agent
 
方法2.
修改setting中的
DEFAULT_REQUEST_HEADERS# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Hello World'
}
运行后也能够看到上面的输出。
 
 
方法3.
在代码中修改。class HeadervalidationSpider(scrapy.Spider):
name = 'headervalidation'
allowed_domains = ['helloacm.com']


def start_requests(self):
header={'User-Agent':'Hello World'}
yield scrapy.Request(url='http://helloacm.com/api/user-agent/',headers=header)

def parse(self, response):
print '*'*20
print response.body
print '*'*20
运行后也能够看到下面的输出。2017-12-14 16:17:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-12-14 16:17:35 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://helloacm.com/api/us
er-agent/> from <GET http://helloacm.com/api/user-agent/>
2017-12-14 16:17:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://helloacm.com/api/user-agent/> (referer: None)

********************
"Hello World"
********************
2017-12-14 16:17:37 [scrapy.core.engine] INFO: Closing spider (finished)
2017-12-14 16:17:37 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
 
方法4.
在中间件中自定义Header
 
在项目目录下添加一个目录:
customerMiddleware,在目录中新建一个自定义的中间件文件:
文件名随意为 customMiddleware.py
 
文件内容为修改request User-Agent#-*-coding=utf-8-*-
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

class CustomerUserAgent(UserAgentMiddleware):
def process_request(self, request, spider):
ua='HELLO World?????????'
request.headers.setdefault('User-Agent',ua)
 
在setting中添加下面一句,以便使中间件生效。DOWNLOADER_MIDDLEWARES = {
'headerchange.customerMiddleware.customMiddleware.CustomerUserAgent':10
# 'headerchange.middlewares.MyCustomDownloaderMiddleware': 543,
}
然后重新运行,同样能够得到一样的效果。
 
原创文章,转载请注明:http://30daydo.com/article/245 

附上github的源码:https://github.com/Rockyzsu/base_function/tree/master/scrapy_demo/headerchange 
欢迎star和点赞。







如果你觉得文章对你有用,可以视乎你心情来打赏,以支持小站的服务器网络费用。
你的支持是我最大的动力!
 
PS:谢谢下面朋友的打赏
A Keung
阿贾克斯
白驹过隙
Che Long 查看全部
1. 创建scrapy项目:
scrapy startproject headerchange
2. 创建爬虫文件
scrapy genspider headervalidation helloacm.com

3. 目标站点:

https://helloacm.com/api/user-agent/

这一个站点直接返回用户的User-Agent, 这样你就可以直接查看你的User-Agent是否设置成功。
尝试用浏览器打开网址 
https://helloacm.com/api/user-agent/,

网站直接返回:  
"Mozilla\/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/62.0.3202.94 Safari\/537.36"
 
3. 配置scrapy
在spider文件夹的headervalidation.py 修改为一下内容。
class HeadervalidationSpider(scrapy.Spider):
name = 'headervalidation'
allowed_domains = ['helloacm.com']
start_urls = ['http://helloacm.com/api/user-agent/']

def parse(self, response):
print '*'*20
print response.body
print '*'*20

项目只是打印出response的body,也就是打印出访问的User-Agent信息。
 
运行:
scrapy crawl headervalidation
会发现返回的是503。 接下来,我们修改scrapy的User-Agent
 
方法1:
修改setting.py中的User-Agent
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Hello World'

然后重新运行
scrapy crawl headervalidation

这个时候,能够看到正常的scrapy输出了。
2017-12-14 16:17:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-12-14 16:17:35 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://helloacm.com/api/us
er-agent/> from <GET http://helloacm.com/api/user-agent/>
2017-12-14 16:17:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://helloacm.com/api/user-agent/> (referer: None)

[b]********************
"Hello World"
********************
[/b]2017-12-14 16:17:37 [scrapy.core.engine] INFO: Closing spider (finished)
2017-12-14 16:17:37 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 406,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 796,
'downloader/response_count': 2,
'downloader/response_status_count/200': 1,
'downloader/response_status_count/301': 1,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2017, 12, 14, 8, 17, 37, 29000),
'log_count/DEBUG': 3,
'log_count/INFO': 7,
'response_received_count': 1,
'scheduler/dequeued': 2,
'scheduler/dequeued/memory': 2,
'scheduler/enqueued': 2,
'scheduler/enqueued/memory': 2,
'start_time': datetime.datetime(2017, 12, 14, 8, 17, 35, 137000)}
2017-12-14 16:17:37 [scrapy.core.engine] INFO: Spider closed (finished)

 
正确设置了User-Agent
 
方法2.
修改setting中的
DEFAULT_REQUEST_HEADERS
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Hello World'
}

运行后也能够看到上面的输出。
 
 
方法3.
在代码中修改。
class HeadervalidationSpider(scrapy.Spider):
name = 'headervalidation'
allowed_domains = ['helloacm.com']


def start_requests(self):
header={'User-Agent':'Hello World'}
yield scrapy.Request(url='http://helloacm.com/api/user-agent/',headers=header)

def parse(self, response):
print '*'*20
print response.body
print '*'*20

运行后也能够看到下面的输出。
2017-12-14 16:17:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-12-14 16:17:35 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://helloacm.com/api/us
er-agent/> from <GET http://helloacm.com/api/user-agent/>
2017-12-14 16:17:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://helloacm.com/api/user-agent/> (referer: None)

********************
"Hello World"
********************
2017-12-14 16:17:37 [scrapy.core.engine] INFO: Closing spider (finished)
2017-12-14 16:17:37 [scrapy.statscollectors] INFO: Dumping Scrapy stats:

 
方法4.
在中间件中自定义Header
 
在项目目录下添加一个目录:
customerMiddleware,在目录中新建一个自定义的中间件文件:
文件名随意为 customMiddleware.py
 
文件内容为修改request User-Agent
#-*-coding=utf-8-*-
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

class CustomerUserAgent(UserAgentMiddleware):
def process_request(self, request, spider):
ua='HELLO World?????????'
request.headers.setdefault('User-Agent',ua)

 
在setting中添加下面一句,以便使中间件生效。
DOWNLOADER_MIDDLEWARES = {
'headerchange.customerMiddleware.customMiddleware.CustomerUserAgent':10
# 'headerchange.middlewares.MyCustomDownloaderMiddleware': 543,
}

然后重新运行,同样能够得到一样的效果。
 
原创文章,转载请注明:http://30daydo.com/article/245 

附上github的源码:https://github.com/Rockyzsu/base_function/tree/master/scrapy_demo/headerchange 
欢迎star和点赞。


mm_facetoface_collect_qrcode_1513241363991_副本1_副本_副本.png


如果你觉得文章对你有用,可以视乎你心情来打赏,以支持小站的服务器网络费用。
你的支持是我最大的动力!
 
PS:谢谢下面朋友的打赏
A Keung
阿贾克斯
白驹过隙
Che Long

[读后笔记] python网络爬虫实战 (李松涛)

书籍李魔佛 发表了文章 • 0 个评论 • 3393 次浏览 • 2017-12-14 11:28 • 来自相关话题

用了大概一个早上的时间,就把这本书看完了。 
前面4章是基础的python知识,有基础的同学可以略过。
scrapy爬虫部分,用了实例给大家说明scrapy的用法,不过如果之前没用过scrapy的话,需要慢慢上机敲打代码。
其实书中的例子都是很简单的例子,基本没什么反爬的限制,书中一句话说的非常赞同,用scrapy写爬虫,就是做填空题,而用urllib2写爬虫,就是作文题,可以自由发挥。
 
书中没有用更为方便的requests库。 内容搜索用的最多的是beatifulsoup, 对于xpah或者lxml介绍的比较少。 因为scrapy自带的response就是可以直接用xpath,更为方便。
 
对于scrapy的中间和pipeline的使用了一个例子,也是比较简单的例子。
 
书中没有对验证码,分布式等流行的反爬进行讲解,应该适合爬虫入门的同学去看吧。
 
书中一点很好的就是代码都非常规范,而且即使是写作文的使用urllib2,也有意模仿scrapy的框架去写, 需要抓取的数据 独立一个类,类似于scrapy的item,数据处理用的也是叫pipleline的方法。
这样写的好处就是, 每个模块的功能都一目了然,看完第一个例子的类和函数定义,后面的例子都是大同小异,可以加快读者的阅读速度,非常赞。(这一点以后自己要学习,增加代码的可复用性)
 
 很多页面url现在已经过期了,再次运行作者的源码会返回很多404的结果。
失效的项目:
金逸影城
天气预报
获取代理:http://proxy360.com 

 
本书的一些错误的地方:
1. 获取金逸影城的spider中,所有关于movie的拼写都拼错为moive了。这个属于英语错误。
2. 在testProxy.py 代码中, 由于在同一个类中,一直在产生线程,最后导致线程过多,不能再产生线程。程序会中途退出。
File "C:\Python27\lib\threading.py", line 736, in start
_start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread
可以修改成独立函数的形式,而不是类函数。
 

待续。 查看全部
Python网络爬虫实战_thunbnail.jpg

用了大概一个早上的时间,就把这本书看完了。 
前面4章是基础的python知识,有基础的同学可以略过。
scrapy爬虫部分,用了实例给大家说明scrapy的用法,不过如果之前没用过scrapy的话,需要慢慢上机敲打代码。
其实书中的例子都是很简单的例子,基本没什么反爬的限制,书中一句话说的非常赞同,用scrapy写爬虫,就是做填空题,而用urllib2写爬虫,就是作文题,可以自由发挥。
 
书中没有用更为方便的requests库。 内容搜索用的最多的是beatifulsoup, 对于xpah或者lxml介绍的比较少。 因为scrapy自带的response就是可以直接用xpath,更为方便。
 
对于scrapy的中间和pipeline的使用了一个例子,也是比较简单的例子。
 
书中没有对验证码,分布式等流行的反爬进行讲解,应该适合爬虫入门的同学去看吧。
 
书中一点很好的就是代码都非常规范,而且即使是写作文的使用urllib2,也有意模仿scrapy的框架去写, 需要抓取的数据 独立一个类,类似于scrapy的item,数据处理用的也是叫pipleline的方法。
这样写的好处就是, 每个模块的功能都一目了然,看完第一个例子的类和函数定义,后面的例子都是大同小异,可以加快读者的阅读速度,非常赞。(这一点以后自己要学习,增加代码的可复用性)
 
 很多页面url现在已经过期了,再次运行作者的源码会返回很多404的结果。
失效的项目:
金逸影城
天气预报
获取代理:http://proxy360.com 

 
本书的一些错误的地方:
1. 获取金逸影城的spider中,所有关于movie的拼写都拼错为moive了。这个属于英语错误。
2. 在testProxy.py 代码中, 由于在同一个类中,一直在产生线程,最后导致线程过多,不能再产生线程。程序会中途退出。
  File "C:\Python27\lib\threading.py", line 736, in start
_start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

可以修改成独立函数的形式,而不是类函数。
 

待续。

菜鸟侦探挑战数据分析R源代码

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 2939 次浏览 • 2017-12-11 17:45 • 来自相关话题

菜鸟侦探挑战数据分析R源代码:
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM
 
菜鸟侦探挑战数据分析R源代码:
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM
 

怀孕妈妈 深港1年学车路

量化交易绫波丽 发表了文章 • 0 个评论 • 3285 次浏览 • 2017-11-29 14:57 • 来自相关话题

这几年几乎都听到身边的人都在考驾照(特别是亲眼见证自己的妹妹在半年多就拿到驾照)当自己怀孕7个月时,想到马上临近为期5至6个月产假,难得有假期(不过新手妈妈忽略了有娃后再也没有自由的概念啊)一股冲动及热流涌上心头后,我要报考驾照! 对学车路没有任何了解的情况下,就这样在2016年7月选择了深圳知名度最广的深港报了名·(将近6k大洋)
接下来开始走流程,准备交资料,拍照,等待了10几天,才有了流水号,8月4日,参加了理论培训
生产完,就去考了科一,还好幸运的是10月份科一98分通过了~ 计划美美的,以为可以在产假期间顺利练完,考完所谓的最难的科二,科三就不在话下了,然后就坐等拿驾照了,可是,没有这么多可是,艰辛的学车路才拉开帷幕啊~
11月中旬,在深港客服那边拿到了科二教练的电话号码,兴致满满,谦逊的和教练通了电话,顺利约到了第二天下午2点练车
为了避免迟到,早早的去到练车场,去到时和教练打了招呼,他就说“今天先练习打方向盘”,他教了一次,就让我打者,那个方向盘是一根柱子上套了一个方向盘,左一圈,右一圈打了2个小时,只能观望真车,却不能上车的心情一下有点落寞。。。
后面2个小时过后,教练试图建议我加300练自动档,我还是没有答应,他就说 那今天先到这吧,下次再约
为了能在假期争取多练车,我就抓住机会问教练,下次什么时候可以过来,他没有正面回复我,只是说有时间我会安排你,我知道无法争取了,就说 那好吧。在第二次约车时直接回复 人太多练不了,当时我就开始体会到,原来有时间练车,也很难约到车。
心情又一下子沮丧了
又过了一周多,后面学习其他学员采取送烟送礼的方式,成功约到了车,也成功上了车练了前进后退
通过和其他学员了解,深深明白了学车的风气及约车的困难,教练的脾气后,对自己美好的计划再也没有了期待
时间一天天过去
偶尔可以去练车的日子也变得平常,一直到了2017年中旬,进入深圳酷热的夏天
在科二最难的项目“倒车入库”上挣扎学习了一个多月,某天约车时,教练回复我说“他不再带我们这个班了,说我们这个班有新的教练带我们”
这消息来得突然,霎时间不知道自己分到了什么教练,分在哪个练车场,赶紧问深港客服
后来经过几天了解才得知要去宝安那边学车,想到一下子又要跑到这么远的地方练车,太浪费时间,所以索性自己争取换教练。
又过了一周,才换号教练,重新投入练习
此时假期已用完,不能随叫随到了,由于平时要上班,只有周末有空,练车路变得更加艰辛(周末练车人太多了)
新教练风气脾气依旧,不过心里已有准备,再也不像刚开始那样寄予美好愿望了
不过新教练是一个快到斩乱麻的人,5月底,在我去练习不到一周的时间,就帮我加入了科二报考
考前顶着热辣辣的太阳,在端午三天假期强化训练了3天,教练也带我们去社会考场(交了200大洋)进行模拟考试,模拟也失败了,回家哭得一塌糊涂
果然,很可惜,第一次科二还是失败了;沮丧,灰心,内疚充斥着那个夏天,过了一个月又重新越考,7月份 天气更热了,即使穿了防晒衣,那太阳足以晒得通红脱皮,黑白分明,最后搞到发烧中暑~
又回到科二考场,第一把由于太过紧张,脚抖,败在了自己平时练得还不错的“直角转弯” ;顶着巨大的压力,开始了第二把考试,慢慢的走完了全程,终于拿下科二,开心到感觉整个人要飞起来~
科三,大家都说很简单,心里又开始美起来了,等啊等啊,终于在10月底约到了科三教练
也许是太久没摸车了,也许是科二的练习方法不适合科三,也许是自己毫无车感,也许是第一次在大马路开车,不管有多少个 也许,直接的结果是,手脚不协调,眼睛无法关注远方,无法把车修直,完全不会开啊,天也渐渐的黑了,教练在一旁也完全对我失去了信心,语重心长停下车来对我说“现在科三有新规了,要带油门走的,不是那么简单的,你还是加300改报自动档吧”
我听完也很难过,心里无比的自卑和落寞
但是,我还是意志坚定和教练说“好的,我知道自己开得很差,我接下来回去在模拟机上好好练, 如果还是练不好,我会考虑您的建议的“
就这样,安排了自己一个星期在模拟机上练习,终于找到了一点开车的感觉,毕竟模拟机还是模拟机,所以当自己再次重新投入真车练习时,由于实际路况比较复杂,油门还是不敢轻易踩上去,不过,教练还是夸了我一句”比以前进步很大“
相对比科二来说,科三约车练习容易很多,所以此次内心更多的戒掉了科二时对驾校的迷茫,更多是关注了自己技巧的不足。哪里不足哪里自己课后在模拟机上有针对性的强加练习开始,慢慢的终于开得比较好了。
1个月后,成功了约到考试(白石洲考场)据说白石洲考场在12月就不对外考试了,所以我此次考试更加要努力,不然又要重新训练及适应其他考场,压力会更加大。
考前是紧张的,因为深深知道自己并不是很有把握。 重点讲下考试当天吧。
考试时间是安排在10-11点那一场。早上8点,再次按教练所说的到练车场练了一圈,考前练习,这是很好的经验。
虽然按照计划10点前赶到了考场,但是足足焦急万分的等到了中午12点才轮到自己,那会又饿又不安
看到前面很多学员 直接起步后就挂在了靠边停车那个项目,还没来得及走完整个考场~越看越紧张
直到自己真的上到了车上,也许是紧张的心情,感觉位置怎么做怎么不舒服,离合踩下去很滑,一会就松开
我一直在念念叨叨,怎么办,离合这么滑,离合这么滑,一直在试车,或许试了几分钟吧,但感觉已经像过了几个世纪
貌似都觉得安全员已对我不耐烦了,可是我还是觉得自己没有准备好,终于按下了第一次指纹,模拟夜考后,开始起步了,果然第一把也同样挂在了”靠边停车“ ,拉起手刹后,系统立即播报考试结束,天啊,当时的心情足以差到极点,就这样,我只剩下一次机会了啊,已完全没有退路了
车又被安全员开回起点,绕车一圈后,重新试车,只有最后一次机会的我,真的不敢再起步,我害怕失败,害怕就这样回家
可是,无法后退,只能跟自己说,没事的,慢慢来
鼓起所有勇气,再次按下指纹,认真完成了模拟夜考,小心翼翼的起步,慢慢的完成了靠边停车,悬着的心稍微有点放松,再缓缓的起步,完成了直线形势,每走一个项目,都和自己说一遍,接下来是变更车道,需要打灯,2挡超车,3挡进入学校区域,人行横道,停车换1挡起步,3挡进入公交车站前进行点刹,打灯,1挡掉头,继续2挡上3挡学校区域,路口直行,1挡起步。上2上3,公交车站提前点刹,打灯右转,最后进行加档操作,顺利完成所有项目,当时内心已激动不已,但是一刻没有到停止线时,都不能掉以轻心,当听到考试结束,成绩合格,所有紧张不安,换成了无以言表的喜悦和激动。。。
科三过了,心就定了,也顺利当天考完了科四,当发信息给教练传送战绩时,教练的回复时“啊,你确定你过了吗 你这么差都能过?不要搞错哦,把成绩单发来看看吧“ 我突然觉得空气夹杂着尴尬,原来一直以来自己竟然教练心目中最差的学员。不过庆幸地是,自己没有辜负所有帮助过自己的人。顺利拿到驾照。 查看全部

这几年几乎都听到身边的人都在考驾照(特别是亲眼见证自己的妹妹在半年多就拿到驾照)当自己怀孕7个月时,想到马上临近为期5至6个月产假,难得有假期(不过新手妈妈忽略了有娃后再也没有自由的概念啊)一股冲动及热流涌上心头后,我要报考驾照! 对学车路没有任何了解的情况下,就这样在2016年7月选择了深圳知名度最广的深港报了名·(将近6k大洋)
接下来开始走流程,准备交资料,拍照,等待了10几天,才有了流水号,8月4日,参加了理论培训
生产完,就去考了科一,还好幸运的是10月份科一98分通过了~ 计划美美的,以为可以在产假期间顺利练完,考完所谓的最难的科二,科三就不在话下了,然后就坐等拿驾照了,可是,没有这么多可是,艰辛的学车路才拉开帷幕啊~
11月中旬,在深港客服那边拿到了科二教练的电话号码,兴致满满,谦逊的和教练通了电话,顺利约到了第二天下午2点练车
为了避免迟到,早早的去到练车场,去到时和教练打了招呼,他就说“今天先练习打方向盘”,他教了一次,就让我打者,那个方向盘是一根柱子上套了一个方向盘,左一圈,右一圈打了2个小时,只能观望真车,却不能上车的心情一下有点落寞。。。
后面2个小时过后,教练试图建议我加300练自动档,我还是没有答应,他就说 那今天先到这吧,下次再约
为了能在假期争取多练车,我就抓住机会问教练,下次什么时候可以过来,他没有正面回复我,只是说有时间我会安排你,我知道无法争取了,就说 那好吧。在第二次约车时直接回复 人太多练不了,当时我就开始体会到,原来有时间练车,也很难约到车。
心情又一下子沮丧了
又过了一周多,后面学习其他学员采取送烟送礼的方式,成功约到了车,也成功上了车练了前进后退
通过和其他学员了解,深深明白了学车的风气及约车的困难,教练的脾气后,对自己美好的计划再也没有了期待
时间一天天过去
偶尔可以去练车的日子也变得平常,一直到了2017年中旬,进入深圳酷热的夏天
在科二最难的项目“倒车入库”上挣扎学习了一个多月,某天约车时,教练回复我说“他不再带我们这个班了,说我们这个班有新的教练带我们”
这消息来得突然,霎时间不知道自己分到了什么教练,分在哪个练车场,赶紧问深港客服
后来经过几天了解才得知要去宝安那边学车,想到一下子又要跑到这么远的地方练车,太浪费时间,所以索性自己争取换教练。
又过了一周,才换号教练,重新投入练习
此时假期已用完,不能随叫随到了,由于平时要上班,只有周末有空,练车路变得更加艰辛(周末练车人太多了)
新教练风气脾气依旧,不过心里已有准备,再也不像刚开始那样寄予美好愿望了
不过新教练是一个快到斩乱麻的人,5月底,在我去练习不到一周的时间,就帮我加入了科二报考
考前顶着热辣辣的太阳,在端午三天假期强化训练了3天,教练也带我们去社会考场(交了200大洋)进行模拟考试,模拟也失败了,回家哭得一塌糊涂
果然,很可惜,第一次科二还是失败了;沮丧,灰心,内疚充斥着那个夏天,过了一个月又重新越考,7月份 天气更热了,即使穿了防晒衣,那太阳足以晒得通红脱皮,黑白分明,最后搞到发烧中暑~
又回到科二考场,第一把由于太过紧张,脚抖,败在了自己平时练得还不错的“直角转弯” ;顶着巨大的压力,开始了第二把考试,慢慢的走完了全程,终于拿下科二,开心到感觉整个人要飞起来~
科三,大家都说很简单,心里又开始美起来了,等啊等啊,终于在10月底约到了科三教练
也许是太久没摸车了,也许是科二的练习方法不适合科三,也许是自己毫无车感,也许是第一次在大马路开车,不管有多少个 也许,直接的结果是,手脚不协调,眼睛无法关注远方,无法把车修直,完全不会开啊,天也渐渐的黑了,教练在一旁也完全对我失去了信心,语重心长停下车来对我说“现在科三有新规了,要带油门走的,不是那么简单的,你还是加300改报自动档吧”
我听完也很难过,心里无比的自卑和落寞
但是,我还是意志坚定和教练说“好的,我知道自己开得很差,我接下来回去在模拟机上好好练, 如果还是练不好,我会考虑您的建议的“
就这样,安排了自己一个星期在模拟机上练习,终于找到了一点开车的感觉,毕竟模拟机还是模拟机,所以当自己再次重新投入真车练习时,由于实际路况比较复杂,油门还是不敢轻易踩上去,不过,教练还是夸了我一句”比以前进步很大“
相对比科二来说,科三约车练习容易很多,所以此次内心更多的戒掉了科二时对驾校的迷茫,更多是关注了自己技巧的不足。哪里不足哪里自己课后在模拟机上有针对性的强加练习开始,慢慢的终于开得比较好了。
1个月后,成功了约到考试(白石洲考场)据说白石洲考场在12月就不对外考试了,所以我此次考试更加要努力,不然又要重新训练及适应其他考场,压力会更加大。
考前是紧张的,因为深深知道自己并不是很有把握。 重点讲下考试当天吧。
考试时间是安排在10-11点那一场。早上8点,再次按教练所说的到练车场练了一圈,考前练习,这是很好的经验。
虽然按照计划10点前赶到了考场,但是足足焦急万分的等到了中午12点才轮到自己,那会又饿又不安
看到前面很多学员 直接起步后就挂在了靠边停车那个项目,还没来得及走完整个考场~越看越紧张
直到自己真的上到了车上,也许是紧张的心情,感觉位置怎么做怎么不舒服,离合踩下去很滑,一会就松开
我一直在念念叨叨,怎么办,离合这么滑,离合这么滑,一直在试车,或许试了几分钟吧,但感觉已经像过了几个世纪
貌似都觉得安全员已对我不耐烦了,可是我还是觉得自己没有准备好,终于按下了第一次指纹,模拟夜考后,开始起步了,果然第一把也同样挂在了”靠边停车“ ,拉起手刹后,系统立即播报考试结束,天啊,当时的心情足以差到极点,就这样,我只剩下一次机会了啊,已完全没有退路了
车又被安全员开回起点,绕车一圈后,重新试车,只有最后一次机会的我,真的不敢再起步,我害怕失败,害怕就这样回家
可是,无法后退,只能跟自己说,没事的,慢慢来
鼓起所有勇气,再次按下指纹,认真完成了模拟夜考,小心翼翼的起步,慢慢的完成了靠边停车,悬着的心稍微有点放松,再缓缓的起步,完成了直线形势,每走一个项目,都和自己说一遍,接下来是变更车道,需要打灯,2挡超车,3挡进入学校区域,人行横道,停车换1挡起步,3挡进入公交车站前进行点刹,打灯,1挡掉头,继续2挡上3挡学校区域,路口直行,1挡起步。上2上3,公交车站提前点刹,打灯右转,最后进行加档操作,顺利完成所有项目,当时内心已激动不已,但是一刻没有到停止线时,都不能掉以轻心,当听到考试结束,成绩合格,所有紧张不安,换成了无以言表的喜悦和激动。。。
科三过了,心就定了,也顺利当天考完了科四,当发信息给教练传送战绩时,教练的回复时“啊,你确定你过了吗 你这么差都能过?不要搞错哦,把成绩单发来看看吧“ 我突然觉得空气夹杂着尴尬,原来一直以来自己竟然教练心目中最差的学员。不过庆幸地是,自己没有辜负所有帮助过自己的人。顺利拿到驾照。









TypeError: reduction operation 'argmin' not allowed for this dtype

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 11350 次浏览 • 2017-11-19 18:48 • 来自相关话题

使用pd.read_sql() 方法把Mysql的数据库转为dataframe后,使用 df['low'].idxmin() 或者df['low'].argmin() 方法是会出现这个错误。
 
date = date + '-01-01'
cmd = 'select * from `{}` where datetime > \'{}\''.format(code, date)

try:
df = pd.read_sql(cmd, history_engine,index_col='index')
except Exception,e:
print e
return None

# 不知道为啥,这里的类型发生改变
idx= df['low'].idxmin() 
 
TypeError: reduction operation 'argmin' not allowed for this dtype
 
把df的每列数据类型打印出来看看。
 
print df.dtypes
 
datetime datetime64[ns]
code object
name object
open object
close object
high object
low object
vol float64
amount float64
dtype: object
晕,居然把low这些float类型全部转为了object,所以解决办法就是把这些列的数据转为float64.
 
df['low']=df['low'].astype('float64')
这样之后,问题就解决了。
  查看全部
使用pd.read_sql() 方法把Mysql的数据库转为dataframe后,使用 df['low'].idxmin() 或者df['low'].argmin() 方法是会出现这个错误。
 
date = date + '-01-01'
cmd = 'select * from `{}` where datetime > \'{}\''.format(code, date)

try:
df = pd.read_sql(cmd, history_engine,index_col='index')
except Exception,e:
print e
return None

# 不知道为啥,这里的类型发生改变
idx= df['low'].idxmin()
 
 
TypeError: reduction operation 'argmin' not allowed for this dtype
 
把df的每列数据类型打印出来看看。
 
print df.dtypes
 
datetime    datetime64[ns]
code object
name object
open object
close object
high object
low object
vol float64
amount float64
dtype: object

晕,居然把low这些float类型全部转为了object,所以解决办法就是把这些列的数据转为float64.
 
df['low']=df['low'].astype('float64')

这样之后,问题就解决了。
 

matplotlib pie饼图 lable设置中文乱码 解决办法

python李魔佛 发表了文章 • 0 个评论 • 13164 次浏览 • 2017-11-03 17:10 • 来自相关话题

X=[1,1,1,1,1,1,1]
labels = [u'百度',u'京东',u'陆金所',u'工行',u'招行',u'华泰',u'国金',u'广发',u'QQ']
plt.figure()
p = plt.pie(X,labels=labels) 





(实际X的数据为其他数据,这里只是简单的设为1的列表)
 
google了些资料,找到以下可行的解决办法:
 
找一个系统自带的中文字体文件的路径
比如这一个:C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf
 
把路径拷贝下来。
 
然后在代码中设置: for front in p[1]:
front.set_fontproperties(mpl.font_manager.FontProperties(
fname='C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf'))
 
把 p中的font属性强制改为指向我们想要的字体路径,这样就可以达到修改饼图上的中文乱码问题了。
 





 
正常显示中文了。
 
在linux下同理,只需要下载一个字体文件,放在某个目录,然后在代码中指定字体的位置。
字体文件下载: https://fontzone.net/download/simhei
然后运行: $locate -b '\mpl-data'
看看mpl目录的位置,把字体文件放到fonts/ttf这个目录下面,
如果使用代码设定,如下:#!/usr/bin/env python
#coding:utf-8
"""a demo of matplotlib"""
import matplotlib as mpl
from matplotlib import pyplot as plt
mpl.rcParams[u'font.sans-serif'] = ['simhei']
mpl.rcParams['axes.unicode_minus'] = False
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [300.2, 543.3, 1075.9, 2862.5, 5979.6, 10289.7, 14958.3]
#创建一副线图,x轴是年份,y轴是gdp
plt.plot(years, gdp, color='green', marker='o', linestyle='solid')
#添加一个标题
plt.title(u'名义GDP')
#给y轴加标记
plt.ylabel(u'十亿美元')
plt.show()
 
PS:
在树莓派上回出现的问题:
UserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to DejaVu Sanspi@raspb DejaVu Sans^CserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to
 
这个时候只要安装一个font-manager就可以了:
sudo apt install font-manager
 
OK ! 查看全部
    X=[1,1,1,1,1,1,1]
labels = [u'百度',u'京东',u'陆金所',u'工行',u'招行',u'华泰',u'国金',u'广发',u'QQ']
plt.figure()
p = plt.pie(X,labels=labels)
 

matplot_乱码.png

(实际X的数据为其他数据,这里只是简单的设为1的列表)
 
google了些资料,找到以下可行的解决办法:
 
找一个系统自带的中文字体文件的路径
比如这一个:C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf
 
把路径拷贝下来。
 
然后在代码中设置:
    for front in p[1]:
front.set_fontproperties(mpl.font_manager.FontProperties(
fname='C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf'))

 
把 p中的font属性强制改为指向我们想要的字体路径,这样就可以达到修改饼图上的中文乱码问题了。
 

matplot_乱码2.png

 
正常显示中文了。
 
在linux下同理,只需要下载一个字体文件,放在某个目录,然后在代码中指定字体的位置。
字体文件下载: https://fontzone.net/download/simhei
然后运行: $locate -b '\mpl-data'
看看mpl目录的位置,把字体文件放到fonts/ttf这个目录下面,
如果使用代码设定,如下:
#!/usr/bin/env python
#coding:utf-8
"""a demo of matplotlib"""
import matplotlib as mpl
from matplotlib import pyplot as plt
mpl.rcParams[u'font.sans-serif'] = ['simhei']
mpl.rcParams['axes.unicode_minus'] = False
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [300.2, 543.3, 1075.9, 2862.5, 5979.6, 10289.7, 14958.3]
#创建一副线图,x轴是年份,y轴是gdp
plt.plot(years, gdp, color='green', marker='o', linestyle='solid')
#添加一个标题
plt.title(u'名义GDP')
#给y轴加标记
plt.ylabel(u'十亿美元')
plt.show()

 
PS:
在树莓派上回出现的问题:
UserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to DejaVu Sanspi@raspb DejaVu Sans^CserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to
 
这个时候只要安装一个font-manager就可以了:
sudo apt install font-manager
 
OK !

You must either define the environment variable DJANGO_SETTINGS_MODULE

python李魔佛 发表了文章 • 0 个评论 • 5199 次浏览 • 2017-10-08 12:41 • 来自相关话题

代码如下:
from django import template
def template_usage():
t = template.Template('My name is {{ name }}')
c = template.Context({'name':'Rocky'})
print t.render(c)

template_usage()
就出错了。
 
这个原因一般就是直接使用python或者ipython交互解析器造成的。
 
你需要切换到你的django目录,然后使用python manager.py shell 运行, 然后执行上面的函数或者代码, 就不会再出现这个错误了
 
django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
 
  查看全部
代码如下:
from django import template
def template_usage():
t = template.Template('My name is {{ name }}')
c = template.Context({'name':'Rocky'})
print t.render(c)

template_usage()

就出错了。
 
这个原因一般就是直接使用python或者ipython交互解析器造成的。
 
你需要切换到你的django目录,然后使用python manager.py shell 运行, 然后执行上面的函数或者代码, 就不会再出现这个错误了
 
django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
 
 

儿歌多多 下载全部儿歌视频文件

python爬虫李魔佛 发表了文章 • 0 个评论 • 15794 次浏览 • 2017-09-28 23:44 • 来自相关话题

嗅探app的下载路径,然后抓取数据
 
http://30daydo.com/article/236 

更新 ******** 2018-01-09*************
最近才发现以前曾经挖了这个坑,现在来完成它吧。
 
儿歌多多在爱奇艺的视频网站上也有全集,所以目标转为抓取iqiyi的儿歌多多视频列表。 
github上有一个现成的下载iqiyi的第三方库,可以通过python调用这个库来实现下载功能。
 
代码使用python3来实现。
 
1. 打开网页 http://www.iqiyi.com/v_19rrkwcx6w.html#curid=455603300_26b870cbb10342a6b8a90f7f0b225685
 
这个是第一集的儿歌多多,url后面的curid只是一个随机的字符串,可以直接去掉。
 
url=“http://www.iqiyi.com/v_19rrkwcx6w.htm”
浏览器直接查看源码,里面直接包含了1-30集的视频url,那么要做的就是提取这30个url
 
先抓取网页内容:session = requests.Session()
def getContent(url):
try:
ret = session.get(url)
except:
return None
if ret.status_code==200:
return ret.text
else:
return None
然后提取内容中的url





点击查看大图

提取div标签中的属性 data-current-count=1的。然后选择子节点中的li标签,提取li中的a中的href链接即可。 content = getContent(url)
root = etree.HTML(content)
elements=root.xpath('//div[@data-current-count="1"]//li/a/@href')
for items in elements:
song_url = items.replace('//','')
song_url=song_url.strip()
print(song_url)







2. 有了url,就可以下载这个页面的中的内容了。
这里我使用的是一个第三方的视频下载库,you-get。(非常好用,fork到自己仓库研究 https://github.com/Rockyzsu/you-get)
 
使用方法:

python you-get -d --format=HD url
 
you-get 需要下载一个ffmpeg.exe的文件来解码视频流的,去官网就可以免费下载。
 
url就是你要下载的url地址,format可以选择高清还是其他格式的,我这里选择的是HD。
 
在python脚本里面调用另外一个python脚本,可以使用subprocess来调用。 p=subprocess.Popen('python you-get -d --format=HD {}'.format(song_url),stderr=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
output,error = p.communicate()
print(output)
print(error)
p.wait()
上面的song_url 就是接着最上面那个代码的。
 
 
完整代码如下:#-*-coding=utf-8-*-
import requests
from lxml import etree
import subprocess
session = requests.Session()
def getContent(url):
# url='http://www.iqiyi.com/v_19rrkwcx6w.html'
try:
ret = session.get(url)
# except Exception,e:
except:
# print e
return None
if ret.status_code==200:
return ret.text
else:
return None

def getUrl():
url='http://www.iqiyi.com/v_19rrkwcx6w.html'
url2='http://www.iqiyi.com/v_19rrl2td7g.html' # 31-61
content = getContent(url)
root = etree.HTML(content)
elements=root.xpath('//div[@data-current-count="1"]//li/a/@href')
for items in elements:
song_url = items.replace('//','')
song_url=song_url.strip()
print(song_url)
p=subprocess.Popen('python you-get -d --format=HD {}'.format(song_url),stderr=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
output,error = p.communicate()
print(output)
print(error)
p.wait()

def main():
getUrl()

if __name__ == '__main__':
main()
上面的是1-30集的,全部集数现在是120集,31-60的在url 
http://www.iqiyi.com/v_19rrl2td7g.html
 
这个url只要你选择iqiyi视频的右边栏,就会自动变化。 同理也可以找到61-120的url,然后替换到上面代码中最开始的url就可以了。(这里因为页码少,所以就没有用循环去做)
 
最终的下载结果:





 
 
后面修改了下代码,判断文件是不是已经存在,存在的会就不下载,对于长时间下载100多个文件很有用,如果掉线了,重新下载就不会去下载那些已经下好的。#-*-coding=utf-8-*-
import sys,os
import requests
from lxml import etree
import subprocess
session = requests.Session()
def getContent(url):
# url='http://www.iqiyi.com/v_19rrkwcx6w.html'
try:
ret = requests.get(url)
ret.encoding='utf-8'
# except Exception,e:
except:
# print e
return None
if ret.status_code==200:
return ret.text
else:
return None

def getUrl():
url='http://www.iqiyi.com/v_19rrkwcx6w.html'
url2='http://www.iqiyi.com/v_19rrl2td7g.html' # 31-61
content = getContent(url)
if not content:
print "network issue, retry"
exit(0)
root = etree.HTML(content,parser=etree.HTMLParser(encoding='utf-8'))
elements=root.xpath('//div[@data-current-count="1"]//li')
for items in elements:
url_item=items.xpath('.//a/@href')[0]
song_url = url_item.replace('//','')
song_url=song_url.strip()
print(song_url)
# name=items.xpath('.//span[@class="item-num"]/text()')[0]
name=items.xpath('.//span[@class="item-num"]/text()')[0].encode('utf-8').strip()+\
' '+items.xpath('.//span[@class="item-txt"]/text()')[0].encode('utf-8').strip()+'.mp4'
name= '儿歌多多 '+name
name=name.decode('utf-8')
filename=os.path.join(os.getcwd(),name)
print filename
if os.path.exists(filename):
continue
p=subprocess.Popen('python you-get -d --format=HD {}'.format(song_url),stderr=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
output,error = p.communicate()
print(output)
print(error)
p.wait()


def main():
getUrl()

if __name__ == '__main__':
main()

下载下来大概300多集,直接拷贝到平板上离线播放,再也不卡了。
 
原创地址:http://30daydo.com/article/236 
转载请注明出处
 
  查看全部
嗅探app的下载路径,然后抓取数据
 
http://30daydo.com/article/236 

更新 ******** 2018-01-09*************
最近才发现以前曾经挖了这个坑,现在来完成它吧。
 
儿歌多多在爱奇艺的视频网站上也有全集,所以目标转为抓取iqiyi的儿歌多多视频列表。 
github上有一个现成的下载iqiyi的第三方库,可以通过python调用这个库来实现下载功能。
 
代码使用python3来实现。
 
1. 打开网页 http://www.iqiyi.com/v_19rrkwcx6w.html#curid=455603300_26b870cbb10342a6b8a90f7f0b225685
 
这个是第一集的儿歌多多,url后面的curid只是一个随机的字符串,可以直接去掉。
 
url=“http://www.iqiyi.com/v_19rrkwcx6w.htm”
浏览器直接查看源码,里面直接包含了1-30集的视频url,那么要做的就是提取这30个url
 
先抓取网页内容:
session = requests.Session()
def getContent(url):
try:
ret = session.get(url)
except:
return None
if ret.status_code==200:
return ret.text
else:
return None

然后提取内容中的url

url.GIF

点击查看大图

提取div标签中的属性 data-current-count=1的。然后选择子节点中的li标签,提取li中的a中的href链接即可。
    content = getContent(url)
root = etree.HTML(content)
elements=root.xpath('//div[@data-current-count="1"]//li/a/@href')
for items in elements:
song_url = items.replace('//','')
song_url=song_url.strip()
print(song_url)







2. 有了url,就可以下载这个页面的中的内容了。
这里我使用的是一个第三方的视频下载库,you-get。(非常好用,fork到自己仓库研究 https://github.com/Rockyzsu/you-get)
 
使用方法:

python you-get -d --format=HD url
 
you-get 需要下载一个ffmpeg.exe的文件来解码视频流的,去官网就可以免费下载。
 
url就是你要下载的url地址,format可以选择高清还是其他格式的,我这里选择的是HD。
 
在python脚本里面调用另外一个python脚本,可以使用subprocess来调用。
        p=subprocess.Popen('python you-get -d --format=HD {}'.format(song_url),stderr=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
output,error = p.communicate()
print(output)
print(error)
p.wait()

上面的song_url 就是接着最上面那个代码的。
 
 
完整代码如下:
#-*-coding=utf-8-*-
import requests
from lxml import etree
import subprocess
session = requests.Session()
def getContent(url):
# url='http://www.iqiyi.com/v_19rrkwcx6w.html'
try:
ret = session.get(url)
# except Exception,e:
except:
# print e
return None
if ret.status_code==200:
return ret.text
else:
return None

def getUrl():
url='http://www.iqiyi.com/v_19rrkwcx6w.html'
url2='http://www.iqiyi.com/v_19rrl2td7g.html' # 31-61
content = getContent(url)
root = etree.HTML(content)
elements=root.xpath('//div[@data-current-count="1"]//li/a/@href')
for items in elements:
song_url = items.replace('//','')
song_url=song_url.strip()
print(song_url)
p=subprocess.Popen('python you-get -d --format=HD {}'.format(song_url),stderr=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
output,error = p.communicate()
print(output)
print(error)
p.wait()

def main():
getUrl()

if __name__ == '__main__':
main()

上面的是1-30集的,全部集数现在是120集,31-60的在url 
http://www.iqiyi.com/v_19rrl2td7g.html
 
这个url只要你选择iqiyi视频的右边栏,就会自动变化。 同理也可以找到61-120的url,然后替换到上面代码中最开始的url就可以了。(这里因为页码少,所以就没有用循环去做)
 
最终的下载结果:

ergeduoduo.GIF

 
 
后面修改了下代码,判断文件是不是已经存在,存在的会就不下载,对于长时间下载100多个文件很有用,如果掉线了,重新下载就不会去下载那些已经下好的。
#-*-coding=utf-8-*-
import sys,os
import requests
from lxml import etree
import subprocess
session = requests.Session()
def getContent(url):
# url='http://www.iqiyi.com/v_19rrkwcx6w.html'
try:
ret = requests.get(url)
ret.encoding='utf-8'
# except Exception,e:
except:
# print e
return None
if ret.status_code==200:
return ret.text
else:
return None

def getUrl():
url='http://www.iqiyi.com/v_19rrkwcx6w.html'
url2='http://www.iqiyi.com/v_19rrl2td7g.html' # 31-61
content = getContent(url)
if not content:
print "network issue, retry"
exit(0)
root = etree.HTML(content,parser=etree.HTMLParser(encoding='utf-8'))
elements=root.xpath('//div[@data-current-count="1"]//li')
for items in elements:
url_item=items.xpath('.//a/@href')[0]
song_url = url_item.replace('//','')
song_url=song_url.strip()
print(song_url)
# name=items.xpath('.//span[@class="item-num"]/text()')[0]
name=items.xpath('.//span[@class="item-num"]/text()')[0].encode('utf-8').strip()+\
' '+items.xpath('.//span[@class="item-txt"]/text()')[0].encode('utf-8').strip()+'.mp4'
name= '儿歌多多 '+name
name=name.decode('utf-8')
filename=os.path.join(os.getcwd(),name)
print filename
if os.path.exists(filename):
continue
p=subprocess.Popen('python you-get -d --format=HD {}'.format(song_url),stderr=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
output,error = p.communicate()
print(output)
print(error)
p.wait()


def main():
getUrl()

if __name__ == '__main__':
main()


下载下来大概300多集,直接拷贝到平板上离线播放,再也不卡了。
 
原创地址:http://30daydo.com/article/236 
转载请注明出处
 
 

蓝灯邀请码 KVJN7M

网络李魔佛 发表了文章 • 0 个评论 • 11582 次浏览 • 2017-09-27 22:51 • 来自相关话题

 
好友购买两年套餐后,会赠送双方3个月专业版;好友购买一年套餐后,则赠送双方1个月
 
用着感觉还不错,顺便推广下. 
用不用邀请码随意, 只是用了后你会获得多一个月或者3个月的使用时间.
 
我当时也是在网上随意找了一个邀请码来用, 结果是无效的...... 目前这个邀请码KVJN7M  10年内有效.  查看全部

蓝灯.PNG


 
好友购买两年套餐后,会赠送双方3个月专业版;好友购买一年套餐后,则赠送双方1个月
 
用着感觉还不错,顺便推广下. 
用不用邀请码随意, 只是用了后你会获得多一个月或者3个月的使用时间.
 
我当时也是在网上随意找了一个邀请码来用, 结果是无效的...... 目前这个邀请码KVJN7M  10年内有效. 

30天学会django

python李魔佛 发表了文章 • 0 个评论 • 3416 次浏览 • 2017-09-17 23:40 • 来自相关话题

没错,最近30天开始要折腾这玩意。
 
先放个标题出来。 每天不定时更新。
 
 
我用的视频教程是cstv的那一个系列教程。
 
不推荐那个django中文手册的,因为文档比较旧,很多命令或者代码是无法再新版的django上运行通过的。 这个会比较打击人。
 

  查看全部
没错,最近30天开始要折腾这玩意。
 
先放个标题出来。 每天不定时更新。
 
 
我用的视频教程是cstv的那一个系列教程。
 
不推荐那个django中文手册的,因为文档比较旧,很多命令或者代码是无法再新版的django上运行通过的。 这个会比较打击人。
 

 

怎么判断你用的代理是高度匿名还是透明的

python爬虫李魔佛 发表了文章 • 0 个评论 • 9042 次浏览 • 2017-09-06 20:42 • 来自相关话题

先介绍下什么事高度匿名代理和透明代理.
 

你用透明代理上QQ,对方还是能看到你的本来的IP
只有用匿名和高匿名才不会被对方看到IP.

详细的说:
匿名代理:
如果从隐藏使用代理用户的级别上划分,代理可以分为三种,即高度匿名代理、普通匿名代理和透明代理。

(1)高度匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。

(2)普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页仍然可以查到你的ip。

(3)透明代理,它不但改变了我们的请求信息,还会传送真实的IP地址。
三者隐藏使用代理者身份的级别依次为高度匿名代理最隐蔽,其次是普通匿名代理,最差的是透明代理。
 
 
把你找到的代理iP,在你的浏览器里设置一下, 具体可以百度谷歌, 不难.
 
然后用浏览器打开这个网站:
 
http://members.3322.org/dyndns/getip
 
网站返回很简单, 就是你当前的iP地址. 据目前使用那么多的检测iP地址的网站来看,这个网站最准.
 
用代理打开这个网站,如果网站显示的是你代理IP,那么说明你的ip是高度匿名的.
如果网站显示的是有2个ip,那么你的代理是透明的, 第一个ip是你的原始ip,而第二个ip是你用的代理ip.
 





 
  查看全部
先介绍下什么事高度匿名代理和透明代理.
 

你用透明代理上QQ,对方还是能看到你的本来的IP
只有用匿名和高匿名才不会被对方看到IP.

详细的说:
匿名代理:
如果从隐藏使用代理用户的级别上划分,代理可以分为三种,即高度匿名代理、普通匿名代理和透明代理。

(1)高度匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。

(2)普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页仍然可以查到你的ip。

(3)透明代理,它不但改变了我们的请求信息,还会传送真实的IP地址。
三者隐藏使用代理者身份的级别依次为高度匿名代理最隐蔽,其次是普通匿名代理,最差的是透明代理。
 
 
把你找到的代理iP,在你的浏览器里设置一下, 具体可以百度谷歌, 不难.
 
然后用浏览器打开这个网站:
 
http://members.3322.org/dyndns/getip
 
网站返回很简单, 就是你当前的iP地址. 据目前使用那么多的检测iP地址的网站来看,这个网站最准.
 
用代理打开这个网站,如果网站显示的是你代理IP,那么说明你的ip是高度匿名的.
如果网站显示的是有2个ip,那么你的代理是透明的, 第一个ip是你的原始ip,而第二个ip是你用的代理ip.
 

ip代理.PNG

 
 

mongodb中$sum:1 后面的1是什么意思

python李魔佛 发表了文章 • 0 个评论 • 10372 次浏览 • 2017-09-05 23:32 • 来自相关话题

源数据:
{
"_id" : "GuqXmAkkARqhBDqhy",
"beatmapset_id" : "342537",
"version" : "MX",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "3.5552737712860107"
}
{
"_id" : "oHLT7KqsB7bztBGvu",
"beatmapset_id" : "342537",
"version" : "HD",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "2.7515676021575928"
}
{
"_id" : "GbotZfrPEwW69FkGD",
"beatmapset_id" : "342537",
"version" : "NM",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "0"
}
 然后运行以下的命令:
 
db.getCollection('dup_case').aggregate(
[
{$group:{
_id:{diff_approach:'$diff_approach'},
count:{$sum:2}
}},
{$match:{count:{$gt:1}}}
]

 
返回的count是6
 
所以
$sum:1 的含义:
如果前面的情况出现一次,就加1, 如果后面$sum:2 那么每次前面条件满足一次就加2
  查看全部
源数据:
{
"_id" : "GuqXmAkkARqhBDqhy",
"beatmapset_id" : "342537",
"version" : "MX",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "3.5552737712860107"
}
{
"_id" : "oHLT7KqsB7bztBGvu",
"beatmapset_id" : "342537",
"version" : "HD",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "2.7515676021575928"
}
{
"_id" : "GbotZfrPEwW69FkGD",
"beatmapset_id" : "342537",
"version" : "NM",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "0"
}

 然后运行以下的命令:
 
db.getCollection('dup_case').aggregate(
[
{$group:{
_id:{diff_approach:'$diff_approach'},
count:{$sum:2}
}},
{$match:{count:{$gt:1}}}
]
)
 
 
返回的count是6
 
所以
$sum:1 的含义:
如果前面的情况出现一次,就加1, 如果后面$sum:2 那么每次前面条件满足一次就加2
 

python print 打印 % 百分号

python李魔佛 发表了文章 • 0 个评论 • 16929 次浏览 • 2017-09-05 21:27 • 来自相关话题

记得以前困扰过自己的一个问题.
当时的解决方式是这样的:
 

a = 1
print "a values is ", a, "%"
 
把百分号切割开来.
 
后来才知道,正确显示百分号的方法:
 
 print 'a values is %d%%' %a
 用2个百分号来标示.
 
 
  查看全部
记得以前困扰过自己的一个问题.
当时的解决方式是这样的:
 

a = 1
print "a values is ", a, "%"
 
把百分号切割开来.
 
后来才知道,正确显示百分号的方法:
 
 
print 'a values is %d%%' %a

 用2个百分号来标示.
 
 
 

Python 学习笔记1.2——第三方库安装

pythonsicily02 发表了文章 • 0 个评论 • 2427 次浏览 • 2017-08-27 18:23 • 来自相关话题

电脑配置:windows 64位
python版本:3.6.0
 
一、前往第三方网站下载所需要的包
 
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 
 
二、使用pip安装
 
pip install xxx




  查看全部
电脑配置:windows 64位
python版本:3.6.0
 
一、前往第三方网站下载所需要的包
 
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 
 
二、使用pip安装
 
pip install xxx
5.png

 

python redis 笔记

python李魔佛 发表了文章 • 0 个评论 • 2591 次浏览 • 2017-08-24 20:33 • 来自相关话题

刚接触redis,难免会有那么一些坑,新人一定会踩到的。 把自己的坑写出来,让以后新人少踩点吧。 
踩坑也不是什么坏事,不过浪费点时间而已。
 
1. 配置文件redis.config
 
如果你要远程访问你的redis服务器,那么里面有一行你一定要注释掉:

# bind 127.0.0.1
 
 
解释:

#  指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
 
 
当时调了半天没连上去,就是被这个参数给害的。
 
2. redis-cli 连接本地redis服务器。 本地服务器端口已经改变。
开始使用redis-cli 127.0.0.1:8888 结果是一直都出错。
然后在某个配置文档看到测试本地端口,使用的命令是 redis-cli -p 8888
不然上面的永远都会连着6379.
 
待续。 不定期更新。 
 
 
 
 
 
 
 
 
  查看全部
刚接触redis,难免会有那么一些坑,新人一定会踩到的。 把自己的坑写出来,让以后新人少踩点吧。 
踩坑也不是什么坏事,不过浪费点时间而已。
 
1. 配置文件redis.config
 
如果你要远程访问你的redis服务器,那么里面有一行你一定要注释掉:

# bind 127.0.0.1
 
 
解释:

#  指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
 
 
当时调了半天没连上去,就是被这个参数给害的。
 
2. redis-cli 连接本地redis服务器。 本地服务器端口已经改变。
开始使用redis-cli 127.0.0.1:8888 结果是一直都出错。
然后在某个配置文档看到测试本地端口,使用的命令是 redis-cli -p 8888
不然上面的永远都会连着6379.
 
待续。 不定期更新。 
 
 
 
 
 
 
 
 
 

lxml.etree._ElementUnicodeResult 转为字符

python爬虫李魔佛 发表了文章 • 0 个评论 • 21878 次浏览 • 2017-08-14 15:57 • 来自相关话题

在爬虫过程中,使用的是lxml的xpath查找对应的字段。
 

address=each.xpath('.//address/text()')[0].strip()
 
结果用address与一般的字符进行拼接时,总是出现
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
 
这种错误。
 
主要因为python2的蛋疼的编码原因。
 
解决办法:
根据lxml的官方文档:http://lxml.de/api/lxml.etree._ElementUnicodeResult-class.html
 

object --+ | basestring --+ | unicode --+ | _ElementUnicodeResult
 
_ElementUnicodeResult 是unicode的一个子类。
 
那么可以直接将它转为unicode
 
address.encode('utf-8') 就可以了。
  查看全部
在爬虫过程中,使用的是lxml的xpath查找对应的字段。
 

address=each.xpath('.//address/text()')[0].strip()
 
结果用address与一般的字符进行拼接时,总是出现
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
 
这种错误。
 
主要因为python2的蛋疼的编码原因。
 
解决办法:
根据lxml的官方文档:http://lxml.de/api/lxml.etree._ElementUnicodeResult-class.html
 

object --+ | basestring --+ | unicode --+ | _ElementUnicodeResult
 
_ElementUnicodeResult 是unicode的一个子类。
 
那么可以直接将它转为unicode
 
address.encode('utf-8') 就可以了。