您的位置:首页 > 编程语言 > Python开发

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.爬取网站数据是一项非常过瘾的事情(自己意会),可以抓取对自己有利的内容。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: