python2.7爬虫实战(房地产信息抓取)

好久没有写文章了,本人文笔不是很好,写的东西想到那写到那。

刚学习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传不同的值,得到不同的页面。
另外,主要信息需要通过 跳转到另一个页面获取:
python2.7爬虫实战(房地产信息抓取)_第1张图片

三、观察主要URL页面抓取内容

python2.7爬虫实战(房地产信息抓取)_第2张图片
主要的信息都在html第九个表格下面,这样可以通过bs4包挨个获取。

python2.7爬虫实战(房地产信息抓取)_第3张图片
下面是具体代码:
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("执行成功!")

运行程序,得到结果:
python2.7爬虫实战(房地产信息抓取)_第4张图片

最后,简单的总结下:
 1.通过HTML可以观察出来,此网站 比较老,结构有点乱,很少DIV标签和ID及CLASS属性。这样给抓取内容造成不方便。
 2.此程序是不需要登入爬取信息的,也没有遇到反盗抓之类的,比较简单清晰。
 3.抓取中可能多多少少有点问题(编码,结果异常),需要耐心处理。
 4.爬取网站数据是一项非常过瘾的事情(自己意会),可以抓取对自己有利的内容。


你可能感兴趣的:(python,python,抓取)