通知设置 新通知
python获取A股上市公司的盈利能力
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 6730 次浏览 • 2018-01-04 16:09
比如企业的盈利能力。
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
查看全部
比如企业的盈利能力。
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
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图自己上网找一张然后数字化就好了。
查看全部
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
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
欢迎转载,注明出处
查看全部
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
欢迎转载,注明出处
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
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
转载请注明
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
会报错。
ValueError: No engine for filetype: ''
需要把文件名也命名为'2017-analysis.xls' 才能过正常运行。
不同于其他本文格式,可以随意命名后缀,然后生成文件后再修改后缀。
查看全部
会报错。
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
如果使用函数 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
python 2.7
matplotlib (最新,通过pip安装的)
绘制任何图形都会输出下面的错误:
TypeError: Couldn't find foreign struct converter for 'cairo.Context'
cairo这个依赖库我已经通过apt安装的了。
通过调试,最后发现需要安装这个库:
sudo apt-get install python-gi-cairo
安装后就可以看到图像能够正常显示了。(不然会显示一片空白,其实如果你选择保存的话,然后打开图像,是可以看到绘制出来的图像的) 查看全部
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的一点也不卡了。 查看全部
微信 支付宝都无法在wp8.1上登录了
网络安全 • 李魔佛 发表了文章 • 0 个评论 • 2972 次浏览 • 2017-12-21 00:39
sign,WP系统算是彻底完蛋了吧。
sign,WP系统算是彻底完蛋了吧。
树莓派安装mongodb服务器
网络 • 李魔佛 发表了文章 • 0 个评论 • 7561 次浏览 • 2017-12-18 16:57
不过安装的是32bit 的mongodb,数据库的大小会被限制在2GB。
树莓派启动mongodb
修改/etc/mongodb.config,
把里面的bind=127.0.0.1 注释掉,前面加一个#即可,因为这样其他主机也可以访问这台树莓派的mongodb服务器。
修改dbpath和dblog的路径,因为默认的路径你需要root权限
然后运行 mongod --config /etc/mongodb.config , 然后远程使用mongo ip地址就可以远程连接了。 查看全部
不过安装的是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
解压后在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
转载请注明出处 查看全部
解压后在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
解决办法就是加锁或者合理退出一些占用资源的线程。
解决办法就是加锁或者合理退出一些占用资源的线程。
[scrapy]修改爬虫默认user agent的多种方法
python爬虫 • 李魔佛 发表了文章 • 0 个评论 • 9972 次浏览 • 2017-12-14 16:22
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 查看全部
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
[读后笔记] 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
可以修改成独立函数的形式,而不是类函数。
待续。 查看全部
用了大概一个早上的时间,就把这本书看完了。
前面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
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM
怀孕妈妈 深港1年学车路
量化交易 • 绫波丽 发表了文章 • 0 个评论 • 3285 次浏览 • 2017-11-29 14:57
接下来开始走流程,准备交资料,拍照,等待了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
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')
这样之后,问题就解决了。
查看全部
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
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)
(实际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 !
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
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
转载请注明出处
查看全部
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
转载请注明出处
蓝灯邀请码 KVJN7M
网络 • 李魔佛 发表了文章 • 0 个评论 • 11582 次浏览 • 2017-09-27 22:51
好友购买两年套餐后,会赠送双方3个月专业版;好友购买一年套餐后,则赠送双方1个月
用着感觉还不错,顺便推广下.
用不用邀请码随意, 只是用了后你会获得多一个月或者3个月的使用时间.
我当时也是在网上随意找了一个邀请码来用, 结果是无效的...... 目前这个邀请码KVJN7M 10年内有效. 查看全部
30天学会django
python • 李魔佛 发表了文章 • 0 个评论 • 3416 次浏览 • 2017-09-17 23:40
先放个标题出来。 每天不定时更新。
我用的视频教程是cstv的那一个系列教程。
不推荐那个django中文手册的,因为文档比较旧,很多命令或者代码是无法再新版的django上运行通过的。 这个会比较打击人。
查看全部
先放个标题出来。 每天不定时更新。
我用的视频教程是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.
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——第三方库安装
python • sicily02 发表了文章 • 0 个评论 • 2427 次浏览 • 2017-08-27 18:23
python版本:3.6.0
一、前往第三方网站下载所需要的包
http://www.lfd.uci.edu/~gohlke/pythonlibs/
二、使用pip安装
pip install xxx
查看全部
python版本:3.6.0
一、前往第三方网站下载所需要的包
http://www.lfd.uci.edu/~gohlke/pythonlibs/
二、使用pip安装
pip install xxx
python redis 笔记
python • 李魔佛 发表了文章 • 0 个评论 • 2591 次浏览 • 2017-08-24 20:33
踩坑也不是什么坏事,不过浪费点时间而已。
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.
待续。 不定期更新。
查看全部
踩坑也不是什么坏事,不过浪费点时间而已。
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
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') 就可以了。
查看全部
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') 就可以了。