淘宝网上有很多商品,这些商品的信息就是一个很不错的数据来源,于是我参考资料后依葫芦画瓢弄了一个爬虫程序来爬一爬梦寐以求的电钢琴。
声明一下:电钢琴和电子琴是两种不同的琴,我在正则表达式里面设置了只要含有电子琴这个词语一律不抓取。同时淘宝商家的很多商品栏都是重复的,不加筛选前,我抓了1300个数据,其实只有40个左右不重复的数据。必须加名称不重复的筛选。
最近学了selenium,这个Python库可以用来模拟浏览器行为,我觉得这个库操作起来思路很清晰,就和人一样点击,下拉,只不过我们平常的这些动作对于程序就变成了一行行代码来去指示完成。
我针对了罗兰和雅马哈两个品牌进行了一定的分析,分别搜索“罗兰电钢琴”,“雅马哈电钢琴”分别得到了罗兰的全部数据,和雅马哈的前55页数据(综合排序下)。并且把这一部分数据保存到了mongoDB非关系型数据库里面。
如下图:
雅马哈电钢琴集合
罗兰电钢琴集合
然后呢,再通过左上角工具栏collection->export collecction进行导出,导出为csv文件,之后再用excel表格打开,就变成了下面这样的表格。
罗兰电钢琴抓取到了35个数据,雅马哈抓取到了60个数据,不筛选之前罗兰电钢琴30页有1300个数据,其实我仔细一看全是重复的,淘宝商家一样的东西挂了好几个商品栏,于是加了名称不重复筛选,结果只有35个。淘宝商家好样的。。。
我把数据都放过来了,大家如果有想买的可以简单参考一下。
罗兰电钢琴的数据
SUM是总交易额,这里顺便说一下,淘宝的付款人数是从当日往前推30天,就是近一个月。
我是按交易量来排序的。
4028410
SUM |
price |
deal |
title |
shop |
location |
843500 |
3500 |
241 |
Roland罗兰电钢琴FP-30FP30智能数码电钢88键重锤电子钢琴 |
爱乐乐器专营店 |
广东深圳 |
297500 |
3500 |
85 |
Roland罗兰电钢琴FP30智能数码88键重锤便携成人电子钢琴FP-30 |
roland罗兰皮优专卖店 |
北京 |
290500 |
3500 |
83 |
Roland罗兰fp30电钢琴数码钢琴88键重锤F20成人儿童仿真钢FP30 |
艾威乐器专营店 |
上海 |
189000 |
3500 |
54 |
Roland罗兰fp30电钢琴88键重锤专业成人家用初学者数码电子钢琴 |
律动乐器专营店 |
北京 |
248160 |
5280 |
47 |
Roland罗兰电钢琴RP102RP-302/501智能电钢成人初学数码钢琴 |
爱乐乐器专营店 |
广东深圳 |
237600 |
5280 |
45 |
Roland罗兰电钢琴rp102/302/50188键重锤专业成人初学者家用钢琴 |
roland罗兰皮优专卖店 |
北京 |
140000 |
3500 |
40 |
Roland罗兰电钢琴FP-30FP3088键重锤电子钢琴成人家用 |
roland罗兰悦聆专卖店 |
上海 |
175200 |
4380 |
40 |
Roland罗兰电钢琴RP30智能88键重锤智能成人儿童通用电子钢琴 |
君思乐器专营店 |
上海 |
129500 |
3500 |
37 |
罗兰电钢琴RolandFP30FP-30成人入门专业88键重锤数码电子电钢 |
世纪音缘乐器专营店 |
北京 |
108500 |
3500 |
31 |
Roland罗兰电钢琴FP30FP-30数码智能钢琴88键重锤成人电子钢琴 |
启源乐器专营店 |
广东广州 |
173710 |
5990 |
29 |
ROLAND罗兰电钢琴F140RRP102RP302RP501R88键重锤数码电钢琴 |
roland罗兰悦聆专卖店 |
上海 |
189360 |
7890 |
24 |
ROLAND罗兰电钢琴HP504HP603HP60588键重锤数码钢琴电钢琴 |
roland罗兰悦聆专卖店 |
上海 |
87600 |
4380 |
20 |
罗兰电钢琴88键重锤RP30专业数码钢琴成人电子钢琴初学者考级家用 |
和雅乐器专营店 |
广东深圳 |
61180 |
3220 |
19 |
ROLAND罗兰XPS10XPS30XPS-1030电子合成器61键电子琴编曲键盘 |
罗兰超音专卖店 |
广东深圳 |
95040 |
5280 |
18 |
Roland罗兰电钢琴RP30/RP102/RP501R蓝牙88键重锤智能电子钢琴 |
罗兰大佰专卖店 |
江苏南通 |
89760 |
5280 |
17 |
Roland罗兰电钢琴rp102/302/50188键重锤智能数码钢琴成人 |
罗兰超音专卖店 |
广东深圳 |
102570 |
7890 |
13 |
Roland罗兰高端电钢琴HP504HP605HP603电钢琴88键重锤家用 |
roland罗兰皮优专卖店 |
北京 |
151800 |
13800 |
11 |
吧主信誉罗兰ROLANDHP603ADP603重锤智能电钢琴数码钢琴 |
关维厚 |
北京 |
43800 |
4380 |
10 |
Roland罗兰电钢琴RP30RP-30数码智能钢琴88键重锤成人电子钢琴 |
启源乐器专营店 |
广东广州 |
47920 |
5990 |
8 |
Roland罗兰电钢琴RP302智能数码88键重锤带琴盖专业成人家用 |
知音乐器专营店 |
上海 |
55230 |
7890 |
7 |
顺丰Roland罗兰电钢琴HP504603605数码钢琴88键重锤电子钢琴 |
爱乐乐器专营店 |
广东深圳 |
21120 |
5280 |
4 |
吧主信誉ROLAND罗兰RP-102电钢琴RP102卡哇伊KDP110 |
关维厚 |
北京 |
21120 |
5280 |
4 |
Roland罗兰电钢琴rp102/302/50188键重锤专业成人初学者家用钢 |
和雅乐器专营店 |
广东深圳 |
23960 |
5990 |
4 |
ROLAND罗兰电钢琴RP102RP302RP501RF140R88键重锤数码电钢琴 |
聆悦乐器专营店 |
上海 |
10500 |
3500 |
3 |
Roland罗兰电钢琴FP30FP-30智能数码88键成人家用初学者电子钢琴 |
瑞立乐器专营店 |
上海 |
13140 |
4380 |
3 |
Roland罗兰电钢琴88键重锤rp30RP102专业成人初学家用电子电钢 |
世纪音缘乐器专营店 |
北京 |
24870 |
8290 |
3 |
Roland罗兰FP-60FP-90电钢琴FP60FP90数码钢琴蓝牙88键重锤麦克风 |
关维厚 |
北京 |
7000 |
3500 |
2 |
罗兰电钢琴FP30智能数码钢琴88键重锤电子钢琴成人儿童初学fp-30 |
扬威乐器专营店 |
浙江嘉兴 |
7000 |
3500 |
2 |
罗兰电钢琴RolandFP-30数码电子钢琴88键重锤进口蓝牙智能fp30 |
郑州豫华乐器专营店 |
河南郑州 |
10560 |
5280 |
2 |
Roland罗兰电钢琴RP102智能数码电子钢琴88键F140R初学家用RP302 |
艾威乐器专营店 |
上海 |
10560 |
5280 |
2 |
Roland罗兰电钢琴RP102RP302RP501立式数码钢琴88键重锤电钢 |
律动乐器专营店 |
北京 |
10560 |
5280 |
2 |
ROLAND罗兰电钢琴RP501RHP504数码电钢琴88键重锤RP302RP102 |
艾威乐器专营店 |
上海 |
11980 |
5990 |
2 |
罗兰电钢琴RolandRP-501R成人专业家用88键重锤电子电钢RP302 |
世纪音缘乐器专营店 |
北京 |
3500 |
3500 |
1 |
Roland/罗兰电钢琴FP3088键重锤智能电子钢琴成人家用 |
聆悦乐器专营店 |
上海 |
3500 |
3500 |
1 |
ROLAND罗兰电钢琴fp30智能数码电钢琴88键重锤专业成人罗兰fp30 |
龙圣乐器专营店 |
江苏南京 |
5280 |
5280 |
1 |
Roland罗兰电钢琴RP-102RP-302数码智能钢琴 |
启源乐器专营店 |
广东广州 |
5280 |
5280 |
1 |
罗兰RolandRP102RP302RP501RF-140R配重数码立式电钢琴 |
音域乐器专营店 |
广东广州 |
5990 |
5990 |
1 |
罗兰RP302Roland电钢琴智能数码钢琴88键重锤包邮 |
天堂鸟乐器专营店 |
陕西西安 |
6980 |
6980 |
1 |
Roland罗兰电钢琴F140RF-140R数码智能钢琴88键重锤电子钢琴 |
启源乐器专营店 |
广东广州 |
7890 |
7890 |
1 |
Roland罗兰高端电钢琴HP504HP603HP605电钢琴88键重锤数码钢琴 |
众乐乐器 |
湖北武汉 |
8290 |
8290 |
1 |
Roland罗兰电钢琴FP60/FP90便携式舞台钢琴成人专业智能电钢琴 |
roland罗兰皮优专卖店 |
北京 |
9900 |
9900 |
1 |
ROLAND罗兰F-130RFP-50FP-80HP-506HP-508RW数码电子钢琴电钢 |
espm2 |
江苏南京 |
14000 |
14000 |
1 |
Roland罗兰电钢琴FP-90fp90电钢琴FP-60舞台数码电钢88键重锤 |
爱乐乐器专营店 |
广东深圳 |
14000 |
14000 |
1 |
Roland罗兰电钢琴FP-90FP60电钢琴FP-50舞台数码电钢88键重锤 |
罗兰超音专卖店 |
广东深圳 |
14000 |
14000 |
1 |
顺丰Roland罗兰电钢琴FP-90fp90电钢琴舞台数码电钢88键重锤 |
亚伦乐器专营店 |
北京 |
0 |
3490 |
0 |
罗兰mp100mp-100电钢琴电钢Roland数码钢琴电子钢琴 |
博联盛艺乐器商城 |
北京 |
0 |
3490 |
0 |
实体现货罗兰ROland新款电钢琴MP100MP100秒P105PX150包邮 |
广州两小节乐器 |
广东广州 |
0 |
3500 |
0 |
Roland罗兰FP-30FP30智能数码电子钢琴88键重锤蓝牙智能款FP30 |
roland_bj |
北京 |
0 |
4000 |
0 |
二手电钢琴原装日本罗兰ROLANDFP-288键进口电子钢琴键盘琴 |
爱笛声琴行 |
上海 |
0 |
4980 |
0 |
新款ROLAND罗兰电子数码钢琴RP-501R88键重锤电钢琴RP301升级302 |
龙圣乐器专营店 |
江苏南京 |
0 |
5980 |
0 |
现货罗兰电钢琴RP-401R电子钢琴88键重锤数码钢琴RP301升级电钢 |
海都乐器企业店 |
四川成都 |
0 |
5990 |
0 |
罗兰Roland电钢琴RP501R/RP-302电子数码钢琴88键重锤电钢包邮 |
蒙特丽乐器专营店 |
上海 |
0 |
7300 |
0 |
Roland/罗兰电钢琴RP401R数码钢琴88键重锤电子钢琴 |
wdmzsytl |
北京 |
0 |
19800 |
0 |
RolandRD-300NXRD-800RD-2000罗兰电钢琴舞台数码钢琴 |
讴唱乐器专营店 |
福建厦门 |
0 |
19800 |
0 |
【乐音中国】Roland/罗兰电钢琴RD-2000舞台便携88键盘重锤RD2000 |
musicpcm |
北京 |
0 |
19800 |
0 |
日产罗兰RolandRD-300NX/2000V-PIANO88键盘数码舞台电钢琴 |
音域乐器专营店 |
广东广州 |
0 |
22800 |
0 |
罗兰RolandLX-17LX-7舞台电钢琴88键数码钢琴lx17lx7新款 |
亚伦乐器专营店 |
北京 |
0 |
22800 |
0 |
现货Roland罗兰LX-1788键rolandlx-7舞台电钢琴LX17数码钢琴 |
roland罗兰右任之声专卖店 |
北京 |
0 |
39800 |
0 |
RolandV-Piano罗兰家庭/舞台电子数码钢琴正品包邮 |
讴唱乐器专营店 |
福建厦门 |
0 |
128000 |
0 |
Roland罗兰电钢琴GP-7三角钢琴V-PianoGrand88键重锤数码钢琴 |
众乐乐器 |
湖北武汉 |
4028410 |
|
|
|
|
|
下面这个是雅马哈电钢琴的交易记录
SUM |
price |
deal |
title |
shop |
location |
2858289 |
3117 |
917 |
雅马哈电钢琴P-125B/115WH电子数码钢琴成人初学专业88键重锤电钢 |
yamaha雅马哈艺可专卖店 |
上海 |
3690431 |
4799 |
769 |
顺丰YAMAHA雅马哈YDP103R数码88键重锤带盖进口立式智能电子钢琴 |
yamaha雅马哈大佰专卖店 |
江苏南通 |
233775 |
3117 |
75 |
新品雅马哈P-125B125WH成人儿童88键重锤数码电子钢琴P115升级款 |
yamaha雅马哈大佰专卖店 |
江苏南通 |
279251 |
5699 |
49 |
雅马哈电钢琴YDP-143R电子钢琴数码钢琴88键重锤成人专业顺丰包邮 |
吉利乐器专营店 |
安徽合肥 |
115168 |
3599 |
32 |
雅马哈KBP2000电钢琴88键重锤数码钢琴KBP1000智能钢琴电子钢琴 |
亚伦乐器专营店 |
北京 |
129573 |
4799 |
27 |
雅马哈电钢琴YDP-103R专业88键重锤成人家用初学智能电子数码钢琴 |
广州知音乐器专营 |
广东广州 |
93574 |
3599 |
26 |
雅马哈电钢琴KBP-1000/2000初学者家用88键重锤专业成人电子钢琴 |
郑州豫华乐器专营店 |
河南郑州 |
990000 |
45000 |
22 |
日本原装进口二手三角钢琴专业演奏成人家用初学者雅马哈C3三角琴 |
qiqi926308 |
上海 |
95980 |
4799 |
20 |
雅马哈电钢琴YDP-103R数码钢琴88键重锤成人专业顺丰入户安装 |
yamaha畅想专卖店 |
陕西西安 |
59223 |
3117 |
19 |
雅马哈P-125B125WH智能成人儿童88键重锤数码电子钢琴P115升级款 |
国乐乐器专营店 |
江苏南通 |
96883 |
5699 |
17 |
雅马哈电钢琴YDP-143立式家用成人专业电子88键重锤YDP142电钢 |
世纪音缘乐器专营店 |
北京 |
105000 |
7000 |
15 |
雅马哈数码电钢琴YDP-163舞台演奏智能88键重锤专业成人电子钢琴 |
哝哝qq1024209412 |
上海 |
79786 |
5699 |
14 |
印尼进口雅马哈电钢琴YDP143b电子钢琴88键重锤数码钢琴YDP-143wh |
扬威乐器专营店 |
浙江嘉兴 |
238000 |
17000 |
14 |
日本原装雅马哈二手钢琴初学者儿童成人家用立式YAMAHAU1H/U3H |
斩月9100 |
上海 |
68388 |
5699 |
12 |
雅马哈电钢琴YDP-143BYDP143/88键重锤立式家用专业成人电子钢琴 |
广州知音乐器专营 |
广东广州 |
34287 |
3117 |
11 |
雅马哈电钢琴P-115BP-125WH成人初学智能专业数码钢琴88键重锤 |
音乐琴乐器专营店 |
湖北武汉 |
84150 |
7650 |
11 |
雅马哈电钢琴YDP-163成人专业家用数码88键重锤电子电钢162升级款 |
世纪音缘乐器专营店 |
北京 |
84150 |
7650 |
11 |
雅马哈电钢琴YDP-163电子钢琴数码钢琴88键重锤成人专业顺丰包邮 |
吉利乐器专营店 |
安徽合肥 |
277200 |
25200 |
11 |
日本原装进口雅马哈二手钢琴YAMAHA/UX/UX-1/UX3高端演奏立式钢琴 |
sa鲜橙多 |
上海 |
180600 |
25800 |
7 |
二手钢琴日本原装进口雅马哈YAMAHAUX初学考级练习立式钢琴 |
古月懿轩 |
上海 |
19800 |
3300 |
6 |
雅马哈电钢琴P115BP-125WH成人初学专业电子数码钢琴88键重锤 |
yohoz |
河北石家庄 |
17085 |
3417 |
5 |
雅马哈电钢琴P125B/P-125WH数码电子钢琴88键重锤P105/P115升级 |
星辉震东乐器专营店 |
北京 |
28495 |
5699 |
5 |
雅马哈88键重锤电钢琴键成人家用立式数码钢琴原装进口YDP143B/R |
海都乐器专营店 |
四川成都 |
125000 |
25000 |
5 |
日本原装进口雅马哈YAMAHAU1A/U2A/U3A成人初学家用立式二手钢琴 |
sunliteagle |
上海 |
22796 |
5699 |
4 |
Yamaha/雅马哈电钢琴智能数码钢琴88键重锤142升级电钢琴YDP-143 |
音乐琴乐器专营店 |
湖北武汉 |
22796 |
5699 |
4 |
顺丰雅马哈YDP-143B/143R数码电钢琴88键重锤成人家用初学者入门 |
雅马哈侨辉专卖店 |
上海 |
75200 |
18800 |
4 |
钢琴成人家用雅马哈u3h二手立式钢琴专业级雅马哈钢琴儿童初学者 |
郭峰钢琴有限公司 |
上海 |
107200 |
26800 |
4 |
【直播选琴】日本二手原装进口雅马哈立式钢琴YAMAHAUX立式黑 |
漂泊的懒虫 |
上海 |
53400 |
17800 |
3 |
日本原装进口雅马哈立式初学者儿童YAMAHAU3H成人家用真二手钢琴 |
福建弘成乐器有限公司 |
福建厦门 |
65400 |
21800 |
3 |
日本原装进口雅马哈YAMAHAU1M/U2M/U3M成人初学家用立式二手钢琴 |
sunliteagle |
上海 |
47200 |
23600 |
2 |
钢琴专业级立式钢琴雅马哈yusyuxyuayu1雅马哈钢琴儿童初学者 |
郭峰钢琴有限公司 |
上海 |
3800 |
3800 |
1 |
YAMAHA雅马哈电钢琴KBP500KBP1000KBP200088键重锤数码 |
贵妃小姐 |
上海 |
4799 |
4799 |
1 |
新款雅马哈电钢琴YDP-103R数码钢琴88键重锤成人专业演奏 |
海川乐器专营店 |
浙江金华 |
23500 |
23500 |
1 |
二手钢琴雅马哈YAMAHA钢琴UX/UX1/UX2/UX3/UX5初学者成人家用立式 |
斩月9100 |
上海 |
25800 |
25800 |
1 |
【直播钢琴】日本原装进口雅马哈二手钢琴U3M专业演奏立式钢琴 |
sa鲜橙多 |
上海 |
10435979 |
|
|
|
|
|
从上表中可以看书,雅马哈比罗兰的知名度高得多。雅马哈总共有100多页,但是罗兰电钢琴搜索出来只有30页,雅马哈在综合排序的前50页总共有35中电钢琴,但是罗兰在前30页有60种,但是这60种全部加起来的交易额还不到雅马哈35种电钢琴交易额的一半。
然后csv文件可以导入matlab,再用table2array函数进行转换,否则画不了图!
然后把价格一样的,店铺门面不同,销量算在一起,销售额。
用下面这个代码:
roland_reserve=zeros(60,3);
a=1;
for i=1:60
if find(roland_reserve(:,2)==roland(i,2))
roland_reserve(a,1)=roland(i,1)+roland_reserve(a,1);
roland_reserve(a,3)=roland(i,3)+roland_reserve(a,3);
else
roland_reserve(a,2)=roland(i,2);
roland_reserve(a,1)=roland(i,1);
roland_reserve(a,3)=roland(i,3);
a=a+1;
end
end
然后再用下面这个代码,用bar函数画直方图,plot函数画连线图:
bar(yamaha_reserve(1:20,2),yamaha_reserve(1:20,1),20,'b')
for i=1:3
text(yamaha_reserve(i,2),yamaha_reserve(i,1),...
{[ num2str(yamaha_reserve(i,2)),' ',num2str(yamaha_reserve(i,1))]});
end
hold on
bar(roland_reserve(1:20,2),roland_reserve(1:20,1),200,'r')
for i=1:3
text(roland_reserve(i,2),roland_reserve(i,1),...
{[ num2str(roland_reserve(i,2)),' ',num2str(roland_reserve(i,1))]});
end
%
% plot(yamaha_reserve(1:20,2),yamaha_reserve(1:20,1),'-ob')
% for i=1:3
% text(yamaha_reserve(i,2),yamaha_reserve(i,1),...
% {[ num2str(yamaha_reserve(i,2)),' ',num2str(yamaha_reserve(i,1))]});
% end
% hold on
% plot(roland_reserve(1:20,2),roland_reserve(1:20,1),'-*r')
% for i = 1:3
% text(roland_reserve(i,2),roland_reserve(i,1),...
% {[ num2str(roland_reserve(i,2)),' ',num2str(roland_reserve(i,1))]});
% end
得到了下面这些图表:(横坐标是价格,纵坐标是销售量和销售额)
销售量图表:
销售额图表:
蓝色是雅马哈电钢,红色是罗兰电钢,明显无论从销售额还是销售量上来讲,雅马哈都要多得多。
买一台中等价位(价格的中位数)的雅马哈电钢大概是 17400元
median(yamaha_reserve(1:20,:))
买一台中等价位的罗兰电钢大概是 7140元
(median(roland_reserve(1:20,:)))
这是由于淘宝网上廉价罗兰往往卖得好,贵的罗兰卖得不好,所以在综合排序的时候,前面会抓取到很多的廉价罗兰。但是雅马哈的名气大一些,所以综合排序前面也会抓取到一些比较贵的雅马哈,那么自然中位数就上去了。罗兰的中位数被很多的廉价给扯下去了,但罗兰的中位数更准确,因为爬虫抓取到了所有30页的罗兰电钢数据。
同时近一个月以来:
罗兰总销售额4028410罗兰电钢只有四百多万。
雅马哈总销售额10435979!!!雅马哈近一个月交易额竟然有一千多万,中国人这么喜欢吗?
但是
但是
但是
我还是喜欢罗兰电钢!
猴哥V5!!!!
猴哥猴哥V5!!!!
猴哥猴哥猴哥V5!!!!
rolling girl B站链接:
https://www.bilibili.com/video/av2391877?from=search&seid=17696750908259767803
(B站迟早会去光顾的,嘿嘿嘿)
代码解析:
import re
from selenium.common.exceptions import TimeoutException # 时间溢出异常
from urllib.parse import quote # 把输入的参数转化进行编码,转化为url可以接受的参数。
from pyquery import PyQuery as pq
from selenium.webdriver import * # 所有浏览器都引进来
from selenium.webdriver.common.by import By # 解析方式 from selenium.webdriver.common.by.By import *也行
from selenium.webdriver.support import expected_conditions as EC # 期望情况的判断
from selenium.webdriver.support.wait import WebDriverWait # 显式等待
import pymongo#引入数据库的库
from bs4 import BeautifulSoup#引入“美味的汤”
chrome_options = ChromeOptions()#chrome浏览器的选项初始化
chrome_options.add_argument('--headless')#进行无界面的设置,这里必须要分开才行,这里返回的不是chrome_options,只是通过函数进行相关设置。
browser = Chrome(chrome_options=chrome_options)#将设置付诸行动,建立浏览器
# browser=Chrome()
wait = WebDriverWait(browser, 2.5)#调用webdriver的类进行显式等待的设置。
KEYWORD = '雅马哈电钢琴'
MONGO_URL = 'localhost'#本地的地址,用来连接
MONGO_DB = 'taobao'#数据库的名字
MONGO_COLLECTION = 'yamaha'#集合的名字
client = pymongo.MongoClient(MONGO_URL)#建立连接
database = client[MONGO_DB]#建立数据库
database[MONGO_COLLECTION].drop()#清除原来的数据,drop掉原来的表
def index_page(page):
"""
抓取当前索引页
不返回任何值
"""
print('正在爬取第', page, '页')
try:
url = 'http://s.taobao.com/search?q='+quote(KEYWORD)
browser.get(url)
if page > 1:
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input'))
)
submit = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit'))
)
input.clear()
input.send_keys(page)
submit.click()
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page))
)#判断str(page)是否在
print('first_success')
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item'))
)
get_products(browser)
print('second_success')
except TimeoutException:
index_page(page)#传入页面的页码进行解析
def get_products(browser):
html = browser.page_source
doc = pq(html) # 运用pyquery将网页解析
items = doc('#mainsrp-itemlist .items .item ').items()#运用pyquery的items方法将返回的集合进行单个分解,成为generator迭代器,从而可以通过for循环进行输出
for item in items:
# print(type(item))输入为generator
soup = BeautifulSoup(item.html(), 'lxml')#这里为了解析出价格,采用了bs方法,pyquery解析库解析不出来
product = {
'image': item.find('.pic .img').attr('data-src'),#图片链接
'price': float(soup.find(name='strong').string),#价格链接
'deal': int(re.sub('[^1234567890]','',item.find('.deal-cnt').text())),#成交数量
'title':re.sub('\s','',item.find('.title').text()),#商品名字
'shop':re.sub('\s','',item.find('.shop').text()),#店铺名字
'location': re.sub('\s','',item.find('.location').text())#地点
}
#以上内容有些用正则表达式进行去掉空格操作,交易数采用了去掉数字操作。
# print(product)
condition = database[MONGO_COLLECTION].find_one({'title': product['title']})#查询是否有一样的数据
if not condition :#如果没有一样的数据
if not re.match('电子琴',product['title']):#并且商品名字中没有包含电子琴
if product['price']>=3000:#并且商品的价格必须大于等于3000
save_to_mongo(product)#存储到数据库中
print(product['price'])#将商品价格打印出来
else:
print("the same!")#其余情况,打出the same进行标识。
# mongo_db数据库保存
def save_to_mongo(result):
"""
保存到mongodb
:param result:
:return:
"""
try:
if database[MONGO_COLLECTION].insert(result):
print('mongo_db succeed!')
except Exception: # except Exception是所有异常通用的写法,没有具体指定
print('mongo_db fail!')
global i#将页码设置为全局变量,先声明,再赋值,这是规矩。
i=0#将i初始化
def main():
global i
if database[MONGO_COLLECTION].find().count()<100:#查询数据库中的数据如果小于100,那么就继续进行抓取,否则取消
i+=1
index_page(i)
else:
print('done!')#如果达到100数据则打印出done
return 0
while(1):
main()
# while(database[MONGO_COLLECTION].find().count()<100):
# main()
#这样写更好
爬虫/excel/matlab总结笔记:
1、
css选择器 .item 对于有多个class属性的标签:比如class=”item abc”,只要其中一个是item就能选择到
2、
“.item.abc”,表示选取class既含有item,也含有abc的标签,如上所示。
“#mainsrp-itemlist .items .item”(有空格表示有子孙关系,只要含有就行,不一定是父子关系)
3、
div.form class属性为form的div节点
4、
div.form > span.btn.J_Submit (>表示之后的子节点)
5、
doc=pq(html)
lis=doc(“li”).items() 满足之前表达式的所有节点
li是tag_name
6、
lis=doc(“li”).items()的类型
7、
find()方法查找所有的子孙节点,对于Pyquery类来说
8、
text()方法不需要遍历就可以获取,html()需要全部遍历才行。
doc('#mainsrp-itemlist ')
比如li.text(),li是li元素的一个列表,但是他的类型还是
for li_item in li
print(li_item.html())
9、product={
'image':item.find('.pic .img').attr(),
'price':item.find('.price').text(),
'deal':item.find('.deal-cnt').text(),
'title':item.find('.title').text(),
'shop':item.find('.shop').text(),
'location':item.find('.location').text()
}
text()方法对于换行符之类的不会忽略。第一个和最后一个换行符会替换。
10、
正则表达式测试http://tool.oschina.net/regex/
正则表达式去除/n/t
11、
用selenium模拟浏览器行为的时候
网上的答案:一般遇到click失败时我的一般处理方法是改用send_keys(Keys.ENTER)
,直接用发回车键,简单粗暴。
12.
CSS选择器只要加了标签名就发现不行了。真的不知道是为什么,晕了好久。
div.mainsrc-xyz不行,但是只有.mainsrc-xyz就行
items = doc('#mainsrp-itemlist .items .item ').items()
但是items = doc(‘div#mainsrp-itemlist .items .item ').items()就不行了,从html分析上来说是绝对可行的。以后遇到没有class和id属性的标签最好不要用Pyquery,去喝美味的汤。beautiful soup
strong仅仅抓价格,beautifulsoup行得通,xpath行得通,但是pyquery的css选择器方式find(‘strong’)就是不行。
过了过了,不说了。
13、
要熟悉正则表达式啊。
查书P140 崔庆才
\w 匹配字母、数字、下划线
\W 匹配不是字母、数字、下划线
\s匹配任意空白字符
\S 匹配不是。。。
\d匹配任意数字
\D匹配不是。。。
[^...]匹配不是...的内容
正则表达式可以匹配中文内容!!!’中文’OK
14、替换字符串
import re
re.sub('\s', '' ,item.find('.location').text())(将换行符什么的空白替换为NONE)
15、匹配字符串
re.match(‘正则表达式’,content)
excel16、=C2*D2直接在excel表的空格里面写函数表达式就行了!
matlab17、直方图函数bar(x,y,100(条形的宽度),’r’(颜色是红色))
matlab18、
median(A,1)列的中位数
median(A,2)行的中位数
matlab中位数函数
明天我试着开始爬一爬彩票的数据了。嘿嘿嘿!
中间碰到pyquery无法继续在div标签下解析strong标签的bug,卡了很久,然后下载chromedriver来启动chrome浏览器由于版本问题纠结很久,最后才发现···自己没写main()主函数,浪费了3个小时···python的库很多,每次调用都感觉很神奇,内部是怎么实现的只能稍微猜一猜,至于是什么还是不要去深究了。