python爬虫爬取淘宝,罗兰电钢琴和雅马哈电钢琴(参考崔大)

2019-04-13 17:08发布

淘宝网上有很多商品,这些商品的信息就是一个很不错的数据来源,于是我参考资料后依葫芦画瓢弄了一个爬虫程序来爬一爬梦寐以求的电钢琴。 声明一下:电钢琴和电子琴是两种不同的琴,我在正则表达式里面设置了只要含有电子琴这个词语一律不抓取。同时淘宝商家的很多商品栏都是重复的,不加筛选前,我抓了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                           得到了下面这些图表:(横坐标是价格,纵坐标是销售量和销售额) 销售量图表: 销售额图表: 蓝 {MOD}是雅马哈电钢,红 {MOD}是罗兰电钢,明显无论从销售额还是销售量上来讲,雅马哈都要多得多。   买一台中等价位(价格的中位数)的雅马哈电钢大概是 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()的类型迭代器,这个不能用text()方法,只有Pyquery类型能用 7、 find()方法查找所有的子孙节点,对于Pyquery类来说 8、 text()方法不需要遍历就可以获取,html()需要全部遍历才行。 doc('#mainsrp-itemlist ') 比如li.text(),li是li元素的一个列表,但是他的类型还是,这样引用text()方法是可以的,但是html()必须要进行如下的循环遍历 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’(颜 {MOD}是红 {MOD})) matlab18 median(A,1)列的中位数 median(A,2)行的中位数 matlab中位数函数     明天我试着开始爬一爬彩票的数据了。嘿嘿嘿! 中间碰到pyquery无法继续在div标签下解析strong标签的bug,卡了很久,然后下载chromedriver来启动chrome浏览器由于版本问题纠结很久,最后才发现···自己没写main()主函数,浪费了3个小时···python的库很多,每次调用都感觉很神奇,内部是怎么实现的只能稍微猜一猜,至于是什么还是不要去深究了。