python爬虫练习项目思路就是用模拟浏览器来爬58同城的二手房板块,目标是把全国各个城市的二手房信息(发布时间 地点 面积 单价等)全部爬取并入库思路:1 先建立下载要分析的所有网页2 python提取一以下载网页有用信息。
具体步骤:1 首先获取所有省市的名称,并省市为文件夹名建立要下载网页的文件夹2 下载并把对应的网页放在对应的文件夹里3 以城市为单位分析已下载网页的有用信息代码:1、下载城市列表(这个城市列表可以从58的二手房首页也的html网页源代码中手动复制提取)并获取所有城市的二手房网址,存入文件待用
importredic_zhixia={“北京”:”bj|1″,”上海”:”sh|2″,”天津”:”tj|18″,”重庆”:”cq|37″}dic_shengshi={“安徽”:{“合肥”:”hf|837″
,”芜湖”:”wuhu|2045″,”蚌埠”:”bengbu|3470″,”阜阳”:”fy|2325″,”淮南”:”hn|2319″,”安庆”:”anqing|3251″,”宿州”:”suzhou|3359″
,”六安”:”la|2328″,”淮北”:”huaibei|9357″,”滁州”:”chuzhou|10266″,”马鞍山”:”mas|2039″,”铜陵”:”tongling|10285″,”宣城”:
“xuancheng|5633″,”亳州”:”bozhou|2329″,”黄山”:”huangshan|2323″,”池州”:”chizhou|10260″,”巢湖”:”ch|10229″,”和县”:”hexian|10892″
,”霍邱”:”hq|11226″,”桐城”:”tongcheng|11296″,”宁国”:”ningguo|5645″,”天长”:”tianchang|10273″},”福建”:{“福州”:”fz|304″
,”厦门”:”xm|606″,”泉州”:”qz|291″,”莆田”:”pt|2429″,”漳州”:”zhangzhou|710″,”宁德”:”nd|7951″,”三明”:”sm|2048″,”南平”:”np|10291″
,”龙岩”:”ly|6752″,”武夷山”:”wuyishan|10761″,”石狮”:”shishi|296″,”晋江”:”jinjiangshi|297″,”南安”:”nananshi|293″,”龙海”
:”longhai|713″},”广东”:{“深圳”:”sz|4″,”广州”:”gz|3″,”东莞”:”dg|413″,”佛山”:”fs|222″,”中山”:”zs|771″,”珠海”:”zh|910″
,”惠州”:”huizhou|722″,”江门”:”jm|629″,”汕头”:”st|783″,”湛江”:”zhanjiang|791″,”肇庆”:”zq|901″,”茂名”:”mm|679″,”揭阳”
:”jy|927″,”梅州”:”mz|9389″,”清远”:”qingyuan|7303″,”阳江”:”yj|2284″,”韶关”:”sg|2192″,”河源”:”heyuan|10467″,”云浮”:
“yf|10485″,”汕尾”:”sw|9449″,”潮州”:”chaozhou|10461″,”台山”:”taishan|11263″,”阳春”:”yangchun|8566″,”顺德”:”sd|8716″
,”惠东”:”huidong|725″,”博罗”:”boluo|726″,”海丰”:”haifengxian|9444″},”广西”:{“南宁”:”nn|845″,”柳州”:”liuzhou|7133″
,”桂林”:”gl|1039″,”玉林”:”yulin|2337″,”梧州”:”wuzhou|2046″,”北海”:”bh|10536″,”贵港”:”gg|6770″,”钦州”:”qinzhou|2335″
,”百色”:”baise|10513″,”河池”:”hc|2340″,”来宾”:”lb|10552″,”贺州”:”hezhou|10549″,”防城港”:”fcg|10539″,”崇左”:”chongzuo|10524″
},”贵州”:{“贵阳”:”gy|2015″,”遵义”:”zunyi|7620″,”黔东南”:”qdn|9363″,”黔南”:”qn|10492″,”六盘水”:”lps|10506″,”毕节”:”bijie|10564″
,”铜仁”:”tr|10417″,”安顺”:”anshun|7468″,”黔西南”:”qxn|10434″,”仁怀”:”renhuaishi|7628″},”甘肃”:{“兰州”:”lz|952″,”天水”
:”tianshui|8601″,”白银”:”by|10304″,”庆阳”:”qingyang|10475″,”平凉”:”pl|7154″,”酒泉”:”jq|10387″,”张掖”:”zhangye|10454″
,”武威”:”wuwei|10448″,”定西”:”dx|10322″,”金昌”:”jinchang|7428″,”陇南”:”ln|10415″,”临夏”:”linxia|7112″,”嘉峪关”:”jyg|10362″
:”qionghai|10136″,”文昌”:”wenchang|9984″,”万宁”:”wanning|10022″,”屯昌”:”tunchang|10044″,”琼中”:”qiongzhong|10064″
,”陵水”:”lingshui|10184″,”东方”:”df|10250″,”定安”:”da|10303″,”澄迈”:”cm|10331″,”保亭”:”baoting|10367″,”白沙”:”baish|10380″
,”儋州”:”danzhou|10394″},”河南”:{“郑州”:”zz|342″,”洛阳”:”luoyang|556″,”新乡”:”xx|1016″,”南阳”:”ny|592″,”许昌”:”xc|977″
,”平顶山”:”pds|1005″,”安阳”:”ay|1096″,”焦作”:”jiaozuo|3266″,”商丘”:”sq|1029″,”开封”:”kaifeng|2342″,”濮阳”:”puyang|2346″
,”周口”:”zk|933″,”信阳”:”xy|8694″,”驻马店”:”zmd|1067″,”漯河”:”luohe|2347″,”三门峡”:”smx|9317″,”鹤壁”:”hb|2344″,”济源”
:”jiyuan|9918″,”明港”:”mg|8541″,”鄢陵”:”yanling|9123″,”禹州”:”yuzhou|979″,”长葛”:”changge|9344″,”灵宝”:”lingbaoshi|9307″
,”杞县”:”qixianqu|7389″,”汝州”:”ruzhou|1010″,”项城”:”xiangchengshi|935″,”偃师”:”yanshiqu|7121″,”长垣”:”changyuan|5936″
},”黑龙江”:{“哈尔滨”:”hrb|202″,”大庆”:”dq|375″,”齐齐哈尔”:”qqhr|5853″,”牡丹江”:”mdj|3489″,”绥化”:”suihua|6718″,”佳木斯”:”jms|6776″
,”鸡西”:”jixi|7289″,”双鸭山”:”sys|9837″,”鹤岗”:”hegang|9061″,”黑河”:”heihe|9862″,”伊春”:”yich|9773″,”七台河”:”qth|9848″
,”大兴安岭”:”dxal|9878″},”湖北”:{“武汉”:”wh|158″,”宜昌”:”yc|858″,”襄阳”:”xf|891″,”荆州”:”jingzhou|3479″,”十堰”:”shiyan|2032″
,”黄石”:”hshi|1734″,”孝感”:”xiaogan|3434″,”黄冈”:”hg|2299″,”恩施”:”es|2302″,”荆门”:”jingmen|2296″,”咸宁”:”xianning|9617″
,”鄂州”:”ez|9709″,”随州”:”suizhou|9656″,”潜江”:”qianjiang|9669″,”天门”:”tm|9517″,”仙桃”:”xiantao|9736″,”神农架”:”snj|9605″
,”宜都”:”yidou|864″,”汉川”:”hanchuan|3439″,”枣阳”:”zaoyang|896″},”湖南”:{“长沙”:”cs|414″,”株洲”:”zhuzhou|1086″,”益阳”
:”yiyang|10198″,”常德”:”changde|872″,”衡阳”:”hy|914″,”湘潭”:”xiangtan|2047″,”岳阳”:”yy|821″,”郴州”:”chenzhou|5695″
,”邵阳”:”shaoyang|2303″,”怀化”:”hh|5756″,”永州”:”yongzhou|2307″,”娄底”:”ld|9481″,”湘西”:”xiangxi|10219″,”张家界”:”zjj|6788″
,”醴陵”:”liling|1091″},”河北”:{“石家庄”:”sjz|241″,”保定”:”bd|424″,”唐山”:”ts|276″,”廊坊”:”lf|772″,”邯郸”:”hd|572″,”秦皇岛”
:”qhd|1078″,”沧州”:”cangzhou|652″,”邢台”:”xt|751″,”衡水”:”hs|993″,”张家口”:”zjk|3328″,”承德”:”chengde|6760″,”定州”
:”dingzhou|8398″,”馆陶”:”gt|8706″,”张北”:”zhangbei|11201″,”赵县”:”zx|9048″,”正定”:”zd|3198″,”迁安市”:”qianan|284″
,”任丘”:”renqiu|656″,”三河”:”sanhe|776″,”武安”:”wuan|577″,”雄安新区”:”xionganxinqu|111234″,”燕郊”:”lfyanjiao|12730″
,”涿州”:”zhuozhou|428″},”江苏”:{“苏州”:”su|5″,”南京”:”nj|172″,”无锡”:”wx|93″,”常州”:”cz|463″,”徐州”:”xz|471″,”南通”:”nt|394″
,”扬州”:”yz|637″,”盐城”:”yancheng|613″,”淮安”:”ha|968″,”连云港”:”lyg|2049″,”泰州”:”taizhou|693″,”宿迁”:”suqian|2350″
,”镇江”:”zj|645″,”沭阳”:”shuyang|5772″,”大丰”:”dafeng|11279″,”如皋”:”rugao|397″,”启东”:”qidong|400″,”溧阳”:”liyang|469″
,”泰兴”:”taixing|696″,”如东”:”rudong|402″,”邳州”:”pizhou|477″,”沛县”:”xzpeixian|11349″,”靖江”:”jingjiang|698″,”建湖”
:”jianhu|618″,”海安”:”haian|401″,”东台”:”dongtai|615″,”丹阳”:”danyang|648″,”宝应县”:”baoyingx|14451″,”灌南”:”guannan|2150″
,”灌云”:”guanyun|2148″,”姜堰”:”jiangyan|697″,”金坛”:”jintan|468″,”昆山”:”szkunshan|16″,”泗洪”:”sihong|5958″,”泗阳”
:”siyang|5959″},”江西”:{“南昌”:”nc|669″,”赣州”:”ganzhou|2363″,”九江”:”jj|2247″,”宜春”:”yichun|5709″,”吉安”:”ja|2364″
,”上饶”:”sr|10120″,”萍乡”:”px|2248″,”抚州”:”fuzhou|10134″,”景德镇”:”jdz|2360″,”新余”:”xinyu|10115″,”鹰潭”:”yingtan|3209″
,”永新”:”yxx|11077″,”乐平”:”lepingshi|9048″},”吉林”:{“长春”:”cc|319″,”吉林”:”jl|700″,”四平”:”sp|10171″,”延边”:”yanbian|3184″
yuan|2501″,”公主岭”:
,”营口”:”yk|5898″,”盘锦”:”pj|2041″,”朝阳”:”cy|10106″,”丹东”:”dandong|3445″,”辽阳”:”liaoyang|2038″,”本溪”:”benxi|5845″
,”葫芦岛”:”hld|10088″,”铁岭”:”tl|6729″,”阜新”:”fx|10097″,”庄河”:”pld|3306″,”瓦房店”:”wfd|3279″},”宁夏”:{“银川”:”yinchuan|2054″
,”吴忠”:”wuzhong|9962″,”石嘴山”:”szs|9971″,”中卫”:”zw|9951″,”固原”:”guyuan|2421″},”内蒙古”:{“呼和浩特”:”hu|811″,”包头”:
“bt|801″,”赤峰”:”chifeng|6700″,”鄂尔多斯”:”erds|2037″,”通辽”:”tongliao|10015″,”呼伦贝尔”:”hlbe|10039″,”巴彦淖尔市”:”bycem|10070″
,”乌兰察布”:”wlcb|9993″,”锡林郭勒”:”xl|2408″,”兴安盟”:”xam|9976″,”乌海”:”wuhai|2404″,”阿拉善盟”:”alsm|10083″,”海拉尔”:”hlr|2043″
},”青海”:{“西宁”:”xn|2052″,”海西”:”hx|9902″,”海北”:”haibei|9917″,”果洛”:”guoluo|9936″,”海东”:”haidong|9909″,”黄南”:
“huangnan|9896″,”玉树”:”ys|9888″,”海南”:”hainan|10574″},”山东”:{“青岛”:”qd|122″,”济南”:”jn|265″,”烟台”:”yt|228″,”潍坊”
:”wf|362″,”临沂”:”linyi|505″,”淄博”:”zb|385″,”济宁”:”jining|450″,”泰安”:”ta|686″,”聊城”:”lc|882″,”威海”:”weihai|518″
,”枣庄”:”zaozhuang|961″,”德州”:”dz|728″,”日照”:”rizhao|3177″,”东营”:”dy|623″,”菏泽”:”heze|5632″,”滨州”:”bz|944″,”莱芜”
,”曹县”:”caoxian|5638″,”单县”:”shanxian|5636″,”肥城”:”feicheng|690″,”高密”:”gaomi|371″,”广饶”:”guangrao|627″,”桓台”
:”huantaixian|7335″,”莒县”:”juxian|3180″,”莱州”:”laizhou|235″,”蓬莱”:”penglai|237″,”青州”:”qingzhou|367″,”荣成”
:”rongcheng|522″,”乳山”:”rushan|520″,”滕州”:”tengzhou|967″,”新泰”:”xintai|689″,”招远”:”zhaoyuan|3325″,”邹城”:”zoucheng|455″
,”邹平”:”zouping|946″},”山西”:{“太原”:”ty|740″,”临汾”:”linfen|5669″,”大同”:”dt|6964″,”运城”:”yuncheng|5653″,”晋中”:
“jz|8854″,”长治”:”changzhi|6921″,”晋城”:”jincheng|3350″,”阳泉”:”yq|8760″,”吕梁”:”lvliang|3222″,”忻州”:”xinzhou|3453″
,”朔州”:”shuozhou|9871″,”临猗”:”linyixian|9193″,”清徐”:”qingxu|10908″},”陕西”:{“西安”:”xa|483″,”咸阳”:”xianyang|7453″
,”商洛”:”sl|9854″,”铜川”:”tc|9832″,”神木”:”shenmu|5944″},”四川”:{“成都”:”cd|102″,”绵阳”:”mianyang|1057″,”德阳”:”deyang|2373″
,”南充”:”nanchong|2378″,”宜宾”:”yb|2380″,”自贡”:”zg|6745″,”乐山”:”ls|3237″,”泸州”:”luzhou|2372″,”达州”:”dazhou|9799″
,”内江”:”scnj|5928″,”遂宁”:”suining|9688″,”攀枝花”:”panzhihua|2371″,”眉山”:”ms|9704″,”广安”:”ga|2381″,”资阳”:”zy|6803″
,”凉山”:”liangshan|9717″,”广元”:”guangyuan|9749″,”雅安”:”ya|9687″,”巴中”:”bazhong|9811″,”阿坝”:”ab|9817″,”甘孜”:”ganzi|9764″
,”安岳”:”anyuexian|6806″,”广汉”:”guanghanshi|8719″,”简阳”:”jianyangshi|6805″,”仁寿”:”renshouxian|9706″},”新疆”:{
“乌鲁木齐”:”xj|984″,”昌吉”:”changji|8582″,”巴音郭楞”:”bygl|9530″,”伊犁”:”yili|9472″,”阿克苏”:”aks|9499″,”喀什”:”ks|9326″
,”哈密”:”hami|7452″,”克拉玛依”:”klmy|2042″,”博尔塔拉”:”betl|9529″,”吐鲁番”:”tlf|9475″,”和田”:”ht|9489″,”石河子”:”shz|9551″
,”克孜勒苏”:”kzls|9519″,”阿拉尔”:”ale|9539″,”五家渠”:”wjq|9562″,”图木舒克”:”tmsk|9559″,”库尔勒”:”kel|7168″,”阿勒泰”:”alt|18837″
,”塔城”:”tac|18845″},”西藏”:{“拉萨”:”lasa|2055″,”日喀则”:”rkz|9615″,”山南”:”sn|9576″,”林芝”:”linzhi|9646″,”昌都”:”changdu|9648″
,”那曲”:”nq|9618″,”阿里”:”al|9678″,”日土”:”rituxian|9682″,”改则”:”gaizexian|9684″},”云南”:{“昆明”:”km|541″,”曲靖”:”qj|2389″
,”大理”:”dali|2398″,”红河”:”honghe|2394″,”玉溪”:”yx|2040″,”丽江”:”lj|2392″,”文山”:”ws|2395″,”楚雄”:”cx|2393″,”西双版纳”
:”bn|2397″,”昭通”:”zt|9409″,”德宏”:”dh|9437″,”普洱”:”pe|9444″,”保山”:”bs|2390″,”临沧”:”lincang|9422″,”迪庆”:”diqing|9432″
:”tz|403″,”绍兴”:”sx|355″,”湖州”:”huzhou|831″,”丽水”:”lishui|7921″,”衢州”:”quzhou|6793″,”舟山”:”zhoushan|8481″,
“象山”:”xiangshanxian|6738″,”温岭”:”wenling|408″,”桐乡”:”tongxiang|502″,”慈溪”:”cixi|5334″,”长兴”:”changxing|834″
,”嘉善”:”jiashanx|14357″,”海宁”:”haining|500″,”德清”:”deqing|835″,”东阳”:”dongyang|536″,”安吉”:”anji|836″,”苍南”:
“cangnanxian|7579″,”临海”:”linhai|407″,”永康”:”yongkang|537″,”玉环”:”yuhuan|409″},”其他”:{“香港”:”hk|2050″,”澳门”
:”am|9399″,”台湾”:”tw|2051″,”全国”:”quanguo|8728″,”其他”:”cn|2258″},”海外”:{“洛杉矶”:”gllosangeles”,”旧金山”:”glsanfrancisco”
,”纽约”:”glnewyork”,”多伦多”:”gltoronto”,”温哥华”:”glvancouver”,”伦敦”:”glgreaterlondon”,”莫斯科”:”glmoscow”,”首尔”:
“glseoul”,”东京”:”gltokyo”,”新加坡”:”glsingapore”,”曼谷”:”glbangkok”,”清迈”:”glchiangmai”,”迪拜”:”gldubai”,”奥克兰”
合肥分类信息 – 本地 免费 高效
#print(dic_zhixia)forjindic_shengshi:# print(j)dic_chengshi=dic_shengshi[j]forcindic_chengshi:print
dic_all_city_list=dict(dic_zhixia,**dic_shengshi)#两个字典相加 语法:dictMerged2=dict(dict1, **dict2) 而且这种方法更快!
print(dic_all_city_list)withopen(rC:\Users\Administrator\Desktop\python试验田\58\所有城市二手房页面网址.txt,w,encoding
=utf-8)asfw:#这里的decode要在open函数中进行,这点很奇怪,不是在前面decode,fw.write(str(dic_all_city_list))fw.close()2、读取城市地址并以其性质名称命名
importreimportos#import jsonf=open(rC:\Users\Administrator\Desktop\python试验田\58\所有城市二手房页面网址.txt,rb)str_dic_allcity
=f.read().decode(utf-8)f.close()#print(type(str_dic_allcity)) #字符串dic_allcity=eval(str_dic_allcity)
#eval() 为将字典格式的字符串转化为字典 当然也可以用流行的json函数来进行转换json.loads(),函数为这个,但是会报错,原因是json格式的大括号里的格式是双引号,这里要求的是单引号,所以要用全部替换一下才可以,这里不做替换。
#pri
)ifpat.search(str(dic_allcity[i]))andisinstance(dic_allcity[i],str):###在这里要将dic_allcity[i]给字符化,因为省份后面跟的是字典不是字符,这里判断时会报错
os.makedirs(“C:/Users/Administrator/Desktop/python试验田/58/全国二手房信息/直辖市/”+i+”市”)f_zhixia=open(rC:\Users\Administrator\Desktop\python试验田\58\全国二手房信息\直辖市
\\+i+市\\+i+市.txt,w)f_zhixia.write(这是直辖市的网址+\n+dic_allcity[i])else:forjindic_allcity[i]:os.makedirs(“C:/Users/Administrator/Desktop/python试验田/58/全国二手房信息/省/”
+i+”省/”+j+”市”)f_chengshi=open(rC:\Users\Administrator\Desktop\python试验田\58\全国二手房信息\省\\+i+省\\+j+市\\+j+
市.txt,w)f_chengshi.write(这是+i+省+j+市的网址+\n+dic_allcity[i][j])3 核心代码!!!!!网页下载(selenium+PHANTOMJS)import
importActionChains#引入ActionChains类,这里用于一些列鼠标操作f
DesiredCapabilities#貌似是PHANTOMJS抓包时不用加载图片时用的库importtimeimportospath=r”C:\Users\Administrator\Desktop\python试验田\58\全国二手房信息”
dic_path_url={}foriinos.walk(path):#此命令返回的地址是\\形式的带有转义符号的,所以还是方便下文再次调用的ifi[1]==[]:dic_path_url[i[0]]=
i[2][0]else:pass#print(dic_path_url) ###返回的字典就是 文件夹路径名:文件名 perfect!j=0#j为全局变量,是下文的save_html()中文件名都的值
forchengshi_pathindic_path_url:# print(chengshi_path) #chengshi_path为二手房城市所在的目录# print(chengshi_path+\\+dic_path_url[chengshi_path]) ####返回的chengshi_path+\\+dic_path_url[chengshi_path] 就是txt文件的完整路径 perfect!
txt_dizhi=chengs
f_txt.close()chengshi_url=paten.findall(txt_content)# with open(rC:\Users\Administrator\Desktop\python试验田\58\shiyan1126.txt,a,encoding=utf-8) as fw: #这里的decode要在open函数中进行,这点很奇怪,不是在前面decode,
# fw.write(str(chengshi_url)+\n)# fw.close() # print(chengshi_url[0]) #chengshi_url[0]各个城市二手房网址
defsave_html(html_58):globaljj=j+1withopen(chengshi_path+\\+str(j)+.html,w,encoding=utf-8)asfw:#这里的decode要在open函数中进行,这点很奇怪,不是在前面decode,
fw.write(html_58)fw.close()###########以下是用Chrome来当作浏览器进行爬取######### #options = webdriver.ChromeOptions()
#driver = webdriver.Chrome(chrome_options=options)##driver.maximize_window()#driver.get(【北京二手房网|北京二手房出售|北京二手房买卖信息】-北京58同城)
###########以下是用selenium+PHANTOMJS来当作浏览器进行爬取######### dcap=dict(DesiredCapabilities.PHANTOMJS)dcap[“phantomjs.page.settings.userAgent”
]=(“Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0”
)#设置user-agent请求头dcap[“phantomjs.page.settings.loadImages”]=False#禁止加载图片driver=webdriver.PhantomJS(desired_capabilities
=dcap)driver.set_page_load_timeout(20)#设置页面最长加载时间为20stry:driver.get(chengshi_url[0])except:passfornin
range(70):print(正在进行第+str(n+1)+页的内容加载)driver.implicitly_wait(5)#隐性休眠时间,让页面加载5秒,5秒内加载完随时进行下一步,没有的话就等到5秒再执行下一步。
对应的是time.sleep()显性休眠#js=”var q=document.documentElement.scrollTop=10000″#driver.execute_script(js) #将页面滚动条拖到底部
html=driver.page_sourcesave_html(html)print(第+str(n+1)+页加载完毕!)try:move_mouse=driver.find_element_by_xpath
(“//div[@class=pager]/a[@class=next]/span[contains(text(),下一页)]”)except:passActionChains(driver).move_to_element
(move_mouse).perform()#使鼠标悬浮事件,因为58网站检测先有鼠标悬浮动作然后才点击才是人类动作,所以,很讨巧的一个程序员,必经没有“之家”程序员做的那么绝!time.sleep(1
)try:driver.find_element_by_xpath(“//div[@class=pager]/a[@class=next]/span[contains(text(),下一页)]”).click
()except:passdriver.close()#关闭浏览器driver.quit()#退出浏览器,不然会占有大量内存#先爬取四个直辖市证明 爬到244个页面时 网站出现验证码 说明58还是比较仁义的 比之家强多了 所以要用代理了,接下来的工作就是塞选代理的过程了,图片识别代理验证码,筛选最快代理,多线程,断点爬取
4、批量将下载的网页进行分析_并入MongDB(次 核心!!!)importrefromlxmlimportetreeimportdatetimeimportosfrompymongoimportMongoClient
######mongodb操作#######client=MongoClient(localhost,27017)db_name=58_ershoufangdb=client[db_name]#建立数据库
##########分析该目录下所有html文档中的房价等信息###########path=r”C:\Users\Administrator\Desktop\python试验田\58\全国二手房信息”
dic_path_url={}foriinos.walk(path):#此命令返回的地址是\\形式的带有转义符号的,所以还是方便下文再次调用的ifi[1]==[]:dic_path_url[i[0]]=
i[2]##返回的是文件名列表中的第一个值else:pass#print( dic_path_url) #####dic_path_url为所有文件名的值与其路径 路径:所有文件列表######单独获取省份和 城市名字######
forjindic_path_url:list_sheng_shi=j.split(\\)#将路径名用\分割成列表,因为\同时也是转义符号所以这里要用\\# print(list_sheng_shi)
sheng_str=list_sheng_shi[-2]#从列表中提取出省名shi_str=list_sheng_shi[-1]#从列表中提取出市名# print(省:+sheng_str)# print(市:+shi_str)
file_list=dic_path_url[j]######mongodb操作####### col=db[sheng_str+_+shi_str]#建立以 省_市 为名字的表单######八大函数分析读取信息#######
#不需要这种方法了 dic={} #把字典定义为全局变量,这样方便以后为其赋值,在次循环过程中,字典清空进行下一次的利用#不需要这种方法了 dic[省份]=sheng_str
#不需要这种方法了 dic[城市]=shi_str #在字典中添加省份 和城市字段,以便以后分析用途CONSTANT=0#全局变量,用于记录总收录数量start_num=0#全局变量end_num
=0#全局变量defanalysis_all():count_num=0forsingle_fileinfile_list:count_num=count_num+1ifre.search(html,single_file
):#选择html文件 f=open(j+\\+single_file,rb)html=f.read().decode(utf-8)f.close()print(正在分析第+str
(count_num)+页:+j+\\+single_file)# print(html)deffind_xiaoqu():xiaoqu_list=[]#定义小区空列表,用于查询结果数据以字典形式添加,方便入mongo库,具体见《mongo数据查询》里过程详解,提示,col.updata()
xiaoqu_name=etree.HTML(html).xpath(“//ul[@class=house-list-wrap]//p[@class=baseinfo]//a[1]”)# if xiaoqu_name:
# print(find it!)# else:# print(没!)# print(共+str(len(xiaoqu_name))+个小区)
foriinrange(len(xiaoqu_name)):globalCONSTANTCONSTANT+=1xiaoqu_content=xiaoqu_name[i].text#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式
haha=xiaoqu_name[i].xpath(@href)#提取该对象中的连接地址,这是xpath的特有方法. 结果haha是列表形式# print(haha)
用列表[0]时会提示溢出
ifpaten.search(haha[0]):passelse:xiaoqu_content=****else:haha=[****]xiaoqu_content=****xiaoqu_list.append
({省份:sheng_str,城市:shi_str,房源ID:CONSTANT,小区名称:xiaoqu_content})foriinxiaoqu_list:col.insert_one(i)#把 xiaoqu_list 小区信息列表全部插入mongo数据库建立i个条目,字典形式
globalstart_numstart_num=CONSTANT-len(xiaoqu_list)+1#定义本页面起始要更新的房源id号globalend_numend_num=CONSTANT#定义本页面结束要更新的房源id号
find_xiaoqu()#这样就可以直接运行函数了,其实这里完全没必要用函数,还不如直接运行直线算了,哎,不改了,算了!# dic[调查房源+str(CONSTANT)]={小区名称:xiaoqu_content} #给字典赋值
#不需要这种方法了 CONSTANT=CONSTANT-len(xiaoqu_name) #为了不影响下面字典元素的添加赋值,这里要将CONSTANT复位,直到最后一个函数,然后再重新计算(带着最后一个函数的值),不这样的话,第二个函数都到不了,直接溢出报错!
#不需要这种方法了 return dic# print(haha)######单价#######deffind_danjia():danjia_list=[]
danjia_name=etree.HTML(html).xpath(“//div[@class=price]//p[@class=unit]”)# if danjia_name:
# print(find it!)# else:# print(没!)# print(共+str(len(danjia_name))+单价)
foriinrange(len(danjia_name)):# global CONSTANT# CONSTANT += 1
danjia_content=danjia_name[i].text.strip(元/㎡).strip()#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式
danjia_list.append({单价(元):int(danjia_content)})j=0foriincol.find({房源ID:{$gte:start_num,$lte:end_num}}):
#这里一定要注意!!!!!pymongo里的符号代码一定要加引号,其中$gte 为大于等于 $lte为小于等于j+=1col.update_one(i,{$set:danjia_list[j-1]})
find_danjia()# dic_inside=dic[调查房源+str(CONSTANT)] #因为上面定义dic的第一个key值对应的也是一个字典所以,先定义出来比较方便下面赋值理解
# dic_inside[单价]=danjia_content #给字典中的字典再次添加新的值# CONSTANT=CONSTANT-len(danjia_name)
# return dic# print(haha)#########面积##########deffind_mianji():mianji_list=[]mianji_name
=etree.HTML(html).xpath(“//div[@class=content-wrap]//ul[@class=house-list-wrap]//div[@class=list-info]//p[@class=baseinfo][1]//span[2]”
)# if mianji_name:# print(find it!)# else:# print(没!)
# print(共+str(len(mianji_name))+面积)# print(type(mianji_name))foriinrange(len(mianji_name
)):# global CONSTANT# CONSTANT += 1mianji_content=mianji_name
[i].text.strip(㎡\xa0)#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式mianji_list.append
({面积(平方米):float(mianji_content)})j=0foriincol.find({房源ID:{$gte:start_num,$lte:end_num}}):j+=1col.update_one
(i,{$set:mianji_list[j-1]})find_mianji()# dic_inside=dic[调查房源+str(CONSTANT)] #因为上面定义dic的第一个key值对应的也是一个字典所以,先定义出来比较方便下面赋值理解
# dic_inside[面积]=mianji_content #给字典中的字典再次添加新的值# CONSTANT=CONSTANT-len(mianji_name)
# return dic# print(haha)#######总价#########deffind_zongjia():zongjia_list=[]zongjia_name
=etree.HTML(html).xpath(“//div[@class=content-wrap]//ul[@class=house-list-wrap]//div[@class=price]//p[@class=sum]/b”
)# if zongjia_name:# print(find it!)# else:# print(没!)
# print(共+str(len(zongjia_name))+个总价)# print(type(zongjia_name))foriinrange(len
(zongjia_name)):# global CONSTANT# CONSTANT += 1zongjia_content
=float(zongjia_name[i].text)*10000#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式zongjia_list
.append({总价(元):zongjia_content})j=0foriincol.find({房源ID:{$gte:start_num,$lte:end_num}}):j+=1col.update_one
(i,{$set:zongjia_list[j-1]})find_zongjia()# dic_inside=dic[调查房源+str(CONSTANT)] #因为上面定义dic的第一个key值对应的也是一个字典所以,先定义出来比较方便下面赋值理解
# dic_inside[总价]=zongjia_content #给字典中的字典再次添加新的值# CONSTANT=CONSTANT-len(zongjia_name)
# return dic# # print(haha)######所在楼层########deffind_suozailouceng
():suozailouceng_list=[]suozailouceng_name=etree.HTML(html).xpath(“//div[@class=content-wrap]//ul[@class=house-list-wrap]//div[@class=list-info]//p[@class=baseinfo][1]//span[last()]”
)# if suozailouceng_name:# print(find it!)# else:# print(没!)
# print(共+str(len(suozailouceng_name))+所在楼层)# print(type(suozailouceng_name))for
iinrange(len(suozailouceng_name)):# global CONSTANT# CONSTANT += 1
suozailouceng_content=suozailouceng_name[i].text#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式
suozailouceng_list.append({所在楼层:suozailouceng_content})j=0foriincol.find({房源ID:{$gte:start_num,$lte:end_num
}}):j+=1col.update_one(i,{$set:suozailouceng_list[j-1]})find_suozailouceng()# dic_inside=dic[调查房源+str(CONSTANT)] #因为上面定义dic的第一个key值对应的也是一个字典所以,先定义出来比较方便下面赋值理解
# dic_inside[所在楼层]=suozailouceng_content #给字典中的字典再次添加新的值# CONSTANT=CONSTANT-len(suozailouceng_name)
# return dic# find_suozailouceng()########封面#########deffind_fengmian
():fengmian_list=[]fengmian_name=etree.HTML(html).xpath(“//div[@class=content-wrap]//ul[@class=house-list-wrap]//div[@class=pic]//img”
)# if fengmian_name:# print(find it!)# else:# print(没!)
# print(共+str(len(fengmian_name))+个封面)# print(type(fengmian_name))foriinrange(len
(fengmian_name)):# global CONSTANT# CONSTANT += 1fengmian_content
=fengmian_name[i].xpath(@data-src)[0]#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式
fengmian_list.append({封面图片地址:fengmian_content})j=0foriincol.find({房源ID:{$gte:start_num,$lte:end_num}}):
j+=1col.update_one(i,{$set:fengmian_list[j-1]})find_fengmian()# dic_inside=dic[调查房源+str(CONSTANT)] #因为上面定义dic的第一个key值对应的也是一个字典所以,先定义出来比较方便下面赋值理解
# dic_inside[封面照片地址]=fengmian_content #给字典中的字典再次添加新的值# CONSTANT=CONSTANT-len(fengmian_name)
# return dic# find_fengmian()######标题##########deffind_biaoti():biaoti_list
=[]biaoti_name=etree.HTML(html).xpath(“//div[@class=content-wrap]//ul[@class=house-list-wrap]//div[@class=list-info]//h2//a”
)# if biaoti_name:# print(find it!)# else:# print(没!)
# print(共+str(len(biaoti_name))+个标题)# print(type(biaoti_name))foriinrange(len(biaoti_name
)):# global CONSTANT# CONSTANT += 1biaoti_content=biaoti_name
[i].text.strip()#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式biaoti_list.append({标题
:biaoti_content})j=0foriincol.find({房源ID:{$gte:start_num,$lte:end_num}}):j+=1col.update_one(i,{$set:biaoti_list
[j-1]})find_biaoti()# dic_inside=dic[调查房源+str(CONSTANT)] #因为上面定义dic的第一个key值对应的也是一个字典所以,先定义出来比较方便下面赋值理解
# dic_inside[标题]=biaoti_content #给字典中的字典再次添加新的值# CONSTANT=CONSTANT-len(biaoti_name)
# return dic# find_biaoti()#######发布时间#########deffind_shijian():shijian_list
=[]shijian_name=etree.HTML(html).xpath(“//div[@class=content-wrap]//ul[@class=house-list-wrap]//div[@class=time]”
)# if shijian_name:# print(find it!)# else:# print(没!)
# print(共+str(len(shijian_name))+时间)# print(type(shijian_name))# for
iinrange(len(shijian_name)):# global CONSTANT# CONSTANT += 1
shijian_content=shijian_name[i].text.strip()#提取该对象中的文字部分,这是xpath的特有方法.或者以这种方法提取.xpath(text()) ,但是提取出来的是列表形式
ifshijian_content==今天:now=datetime.datetime.now()shijian_content=now.strftime(%Y-%m-%d)shijian_list.append
({时间:shijian_content})else:shijian_list.append({时间:****})j=0foriincol.find({房源ID:{$gte:start_num,$lte
:end_num}}):j+=1col.update_one(i,{$set:shijian_list[j-1]})find_shijian()# dic_inside=dic[调查房源+str(CONSTANT)] #因为上面定义dic的第一个key值对应的也是一个字典所以,先定义出来比较方便下面赋值理解
# dic_inside[时间]=shijian_content #给字典中的字典再次添加新的值 # return dic
# find_shijian() # else:# passprint(已经写入Mongo)analysis_all
()