python2.7爬虫实战(房地产信息抓取)
2016-02-18 13:52
381 查看
好久没有写文章了,本人文笔不是很好,写的东西想到那写到那。
刚学习python爬虫不久,学习资料参考《python爬虫学习系列教程》http://www.cnblogs.com/xin-xin/p/4297852.html下面是自己学习的一些总结:
一、程序背景
1.需求:
抓取网站中房子出售信息,主要信息包含:地址、发布时间、联系人、价格以及房子的一些信息2.环境:
python版本2.7 (资料多,包多)匹配包主要用BeautifulSoup 的bs4 ,非常好用。
二、熟悉URL格式
首先观察下URL: http://www.lgfdcw.com/cs/index.php?userid=&infotype=&dq=&fwtype=&hx=&price01=&price02=&pricetype=&fabuday=&addr=&PageNo=1 发现:基础URL是http://www.lgfdcw.com/cs/
不难发现PageNo 代表页面数,我们可以给PageNo传不同的值,得到不同的页面。
另外,主要信息需要通过 跳转到另一个页面获取:
三、观察主要URL页面抓取内容
主要的信息都在html第九个表格下面,这样可以通过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('<a href="(.*?)".*?target="_blank"><strong>.*?</strong></a>') 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("执行成功!")
运行程序,得到结果:
最后,简单的总结下:
1.通过HTML可以观察出来,此网站 比较老,结构有点乱,很少DIV标签和ID及CLASS属性。这样给抓取内容造成不方便。
2.此程序是不需要登入爬取信息的,也没有遇到反盗抓之类的,比较简单清晰。
3.抓取中可能多多少少有点问题(编码,结果异常),需要耐心处理。
4.爬取网站数据是一项非常过瘾的事情(自己意会),可以抓取对自己有利的内容。
。
相关文章推荐
- 【python】编程语言入门经典100例--2
- Python学习之路-Day4
- 新手常见Python运行时错误
- Python:数据库操作模块SQLAlchemy
- 语句乎?表达式乎?(Python/C)
- Python模块 - os
- Python-面向对象 (二 继承)
- Python 18.2 asyncio
- Python正则表达式
- Python版本需要是2.7
- python程序打包成exe执行文件
- Python 18.1 协程
- Python学习之路-初学篇之初识装饰器
- Python Socket Client及Server简单编程
- python模块介绍- collections(5)-OrderedDict 有序字典
- Python filter,map,lambda,reduce,列表解析
- Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
- Python之enumerate
- python 基础(四) 正则,递归 生成器
- 不相交集python实现