抓取网站中房子出售信息,主要信息包含:地址、发布时间、联系人、价格以及房子的一些信息
python版本2.7 (资料多,包多)
匹配包主要用BeautifulSoup 的bs4 ,非常好用。
import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import MySQLdb import urllib2 import re from bs4 import BeautifulSoup #可改成函数这里就懒的写了 for i in range(1,2000): #网站URL urlxx="http://www.lgfdcw.com//cs/index.php?userid=&infotype=&dq=&fwtype=&hx=&price01=&price02=&pricetype=&fabuday=&addr=&PageNo="+str(i) response = urllib2.urlopen(urlxx) html=response.read() lj=re.compile('.*?') herflink=re.findall(lj,html)#匹配到想要的连接 lg,lxr,lxdh,sjhm,lxdz,mfxz,xxdz,fwlx,fwhx,fwmj,csjg,fkfs,cqxz,synx,fwxz,zxcd,fwjg,kfzj,creatdt=[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[] #房子详细信息数组,方便mysql存储 resultinfo=False#定义结束变量 #遍历跳转链接,抓取数据。这里可以改成函数,程序可以清晰化。 for getlink in herflink: #跳转后URL url="http://www.lgfdcw.com/cs/"+str(getlink) requset=urllib2.Request(url) opencontext=urllib2.urlopen(requset) htmlcontext=opencontext.read() soup=BeautifulSoup(htmlcontext) firsttable=soup.find_all('table')[8].find_all('table')[0] #第一部分表,其中包含联系人信息 secondtable=soup.find_all('table')[8].find_all('table')[1] #第二部分表,包含房子详细信息 threetable=soup.find_all('table')[12]#第二部分表,房子环境信息(楼层这些) fbdt=soup.find(color="#009900").string[5:15]#发布时间 #存在HTML结构不一致的情况,需异常处理 try: lgreg=threetable.find_all('tr')[1].find_all('td')[1].get_text()#房屋楼层 except: lgreg=threetable.find_all('tr')[2].find_all('td')[1].get_text()#房屋楼层 lxrreg=firsttable.find_all('tr')[1].find_all('td')[1].get_text()#联系人 lxdhreg=firsttable.find_all('tr')[2].find_all('td')[1].get_text()#联系电话 sjhmreg=firsttable.find_all('tr')[3].find_all('td')[1].get_text()#手机号码 lxdzreg=firsttable.find_all('tr')[4].find_all('td')[1].get_text()#联系地址 mfxzreg=secondtable.find_all('tr')[1].find_all('td')[1].get_text()#卖方性质 xxdzreg=secondtable.find_all('tr')[2].find_all('td')[1].get_text()#详细地址 fwlxreg=secondtable.find_all('tr')[3].find_all('td')[1].get_text()#房屋类型 fwhxreg=secondtable.find_all('tr')[4].find_all('td')[1].get_text()#房屋户型 fwmjreg=secondtable.find_all('tr')[4].find_all('td')[3].get_text()#房屋面积 csjgreg=secondtable.find_all('tr')[5].find_all('td')[1].get_text()#出售价格 fkfsreg=secondtable.find_all('tr')[5].find_all('td')[3].get_text()#付款方式 cqxzreg=secondtable.find_all('tr')[6].find_all('td')[1].get_text()#产权性质 synxreg=secondtable.find_all('tr')[6].find_all('td')[3].get_text()#使用年限 fwxzreg=secondtable.find_all('tr')[7].find_all('td')[1].get_text()#房屋性质 zxcdreg=secondtable.find_all('tr')[7].find_all('td')[3].get_text()#装修程度 fwjgreg=secondtable.find_all('tr')[8].find_all('td')[1].get_text()#房屋结构 kfzjreg=secondtable.find_all('tr')[8].find_all('td')[3].string#可否中介 #把数据存入数组 #只抓取2014年6月以前的,并同时结束程序 if fbdt>="2014-06-01": creatdt.append(fbdt) else: break lg.append(lgreg.replace(' ', '')[0:lgreg.replace(' ', '').find('\n')]) lxr.append(lxrreg) lxdh.append(lxdhreg) sjhm.append(sjhmreg) lxdz.append(lxdzreg) mfxz.append(mfxzreg) xxdz.append(xxdzreg) fwlx.append(fwlxreg) fwhx.append(fwhxreg) fwmj.append(fwmjreg) csjg.append(csjgreg) fkfs.append(fkfsreg) cqxz.append(cqxzreg) synx.append(synxreg) fwxz.append(fwxzreg) zxcd.append(zxcdreg) fwjg.append(fwjgreg) kfzj.append(kfzjreg) #resultinfo=true就结束循环 if resultinfo: break #连接mysql并存储数据 conn=MySQLdb.connect(host="192.168.1.90",port=3306,user="test_dw",passwd="dbDw8#56",db="test_dw",use_unicode=True, charset="utf8") cursor=conn.cursor() sql="insert into houseinfo(lxr,lxdh,sj,lxdz,mfxz,xxdz,fwlx,fwhx,fwmj,csjg,fkfs,cqxz,synx,fwxz,zxcd,fwjg,kfzj,lc,dt) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" temp=zip(lxr,lxdh,lxdh,lxdz,mfxz,xxdz,fwlx,fwhx,fwmj,csjg,fkfs,cqxz,synx,fwxz,zxcd,fwjg,kfzj,lg,creatdt) cursor.executemany(sql,temp) cursor.close() conn.commit() conn.close print("执行成功!")
。