抓取安居客新开楼盘的数据,简单写了个爬虫,没有用什么框架,页面解析用了pyquery,对于有中文的html,解析起来清晰且省事。
# -*- coding: utf-8 -*-
#######################################################################
# Copyright (C) 2005-2016 UC Mobile Limited. All Rights Reserved
# File : first_sale_spider.py
#
# Creation : 2016/2/23 19:41
# Author : alex
#######################################################################
import requests
import re
from pyquery import PyQuery as pq
import MySQLdb
import uniout
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
community_list = []
HOST = "127.0.0.1"
USER = "root"
PASSWD = ""
DB = "house_analysis"
PORT = 3306
class DBOperate(object):
def __init__(self, host, user, passwd, db, port):
self.host = host
self.user = user
self.passwd = passwd
self.db = db
self.port = port
self.conn = MySQLdb.connect(self.host, self.user, self.passwd, self.db, self.port)
self.cur = self.conn.cursor()
def insertSql(self,sql):
self.cur.execute(sql)
self.conn.commit()
def __del__(self):
self.cur.close()
self.conn.close()
def requestByGet(url):
r = requests.get(url)
return r.content
def getNextPage(content):
m = re.findall(r‘<a href="(.+?)" class="next-page next-link">下一页</a>‘,content)
if len(m)>0:
next_url = m[0]
else:
next_url = ‘‘
return next_url
def getCommunityList(content):
community_urls = re.findall(r‘data-link="(http://gz.fang.anjuke.com/loupan/\d+?.html)"‘,content)
print "正在采集...",community_urls
if len(community_urls)>0:
community_list.extend(community_urls)
def handler(start_url):
while True:
content = requestByGet(start_url)
next_url = getNextPage(content)
getCommunityList(content)
if next_url != ‘‘:
start_url = next_url
continue
else:
break
def getHouseInfo(url):
p = pq(url)
name = p(‘h1‘).text().strip()
style = p(‘.house-item‘).text().split(",")[0].strip()
price = p(‘.sp-price‘).text().strip()
l = p(‘.lpAddr-text‘).text()
location = re.split(‘\[ | \]‘,l)
area = location[-2].split(‘-‘)[0].strip()
zone = location[-2].split(‘-‘)[1].strip()
address = location[-1].strip()
detail_location = location[-1].strip()
result = {
"name": name,
"area": area,
"location": zone,
"detail_location": detail_location,
"house_style": style,
"price": price
}
return result
def detailPageHandler(cur, detail_url):
result = getHouseInfo(detail_url)
print "result:",result
cur.insertSql("insert into first_sale (name,area,location,detail_location,house_style,price) VALUES(‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%s‘)" % (
result[‘name‘],
result[‘area‘],
result[‘location‘],
result[‘detail_location‘],
result[‘house_style‘],
result[‘price‘]
))
def main():
handler("http://gz.fang.anjuke.com/loupan/?from=navigation")
print community_list
print "len(community_list)",len(community_list)
cur = DBOperate(host=HOST, user=USER, passwd=PASSWD, db=DB, port=PORT)
for each_detail in community_list:
detailPageHandler(cur, each_detail)
if __name__ == ‘__main__‘:
main()
抓取结果如下:
mysql> select * from first_sale; +-----+--------------------------------+--------------+-----------------+--------------------------------------------------------------------------------------------------+------------------------------------------------+--------+ | id | name | area | location | detail_location | house_style | price | +-----+--------------------------------+--------------+-----------------+--------------------------------------------------------------------------------------------------+------------------------------------------------+--------+ | 10 | 中国美林湖 | 花都 | 狮岭 | 山前大道168号 | 一室(6) , 二室(14) , 三室(15) | 6500 | | 11 | 龙湖首开天宸原著 | 天河 | 车陂 | 奥体路转悦景路600米 | 三室(4) , 四室(2) , 别墅(2) | 30000 | | 12 | 雅居乐剑桥郡 | 番禺 | 华南 | 南村镇草堂村地段 | 三室(8) , 四室(7) | 20750 | | 13 | 碧桂园凤凰城 | 增城 | 广园东 | 快速路 | 一室(1) , 二室(3) , 三室(10) | 13000 | | 14 | 南沙金茂湾 | 南沙 | 南沙 | 凤凰大道外国语学院旁 | 三室(2) , 四室(2) , 商住(3) | 15000 | | 15 | 珠江佳滨苑 | 海珠 | 东晓 | 海印桥南东晓路与仲恺路交界 | 二室(3) , 三室(6) | 32000 | | 16 | 时代长岛 | 南沙 | 南沙 | 进港大道377号(南沙街道旁) | 二室(1) , 三室(2) | 9000 | | 17 | 中恒海晖花园 | 广州周边 | 佛山 | 里水和顺黄金主轴里和大道旁 | 三室(4) | 7500 | | 18 | 南沙涉外公馆 | 南沙 | 南沙 | 进港大道579号 | 商住(3) | 13000 | | 19 | 金地香山湖 | 增城 | 新塘 | 新新公路15号(广园东路中新出口) | 三室(1) , 四室(2) | 7300 | | 20 | 新城国际寓 | 海珠 | 工业大道 | 江南大道南与工业大道南交汇(第一金碧旁) | 商住(4) | 25000 | | 21 | 金融街·融穗澜湾 | 番禺 | 市桥 | 盛泰路与长提东路交界,黄沙岛花园北面 | 三室(3) , 四室(1) | 20000 | | 22 | 江畔雅苑 | 越秀 | 北京路 | 太平沙牌坊直入(地铁6号线北京路站A出口) | 一室(1) , 二室(2) , 三室(2) | 42000 | | 23 | 时代春树里 | 黄埔 | 萝岗 | 开源大道植树公园旁 | 三室(2) , 四室(1) | 14000 | | 24 | 雅居乐凯茵又一城 | 广州周边 | 其他 | 火炬开发区(凯茵新城纪念中学旁) | 三室(1) , 四室(1) | 6000 | | 25 | 时尚广场 | 增城 | 新塘 | 港口大道北395号 | 二室(2) , 三室(2) , 四室(1) | 11000 | | 26 | 时代廊桥增城 | 增城 | 新塘 | 永宁大道南侧 | 二室(1) , 三室(2) , 四室(1) | 8800 | | 27 | 金融街·融穗御府 | 黄埔 | 萝岗 | 长岭路永顺大道(新建长平小学南侧) | 三室(5) | 13500 | | 28 | 保利西悦湾 | 荔湾 | 芳村 | 东漖南路(芳村花园对面) | 三室(2) , 四室(1) | 25000 | | 29 | 御华园 | 花都 | 狮岭 | 狮岭大道东1号 | 一室(1) , 二室(9) , 三室(4) | 7200 | | 30 | 奥园康威广场 | 增城 | 新塘 | 荔新大道和香山大道交汇处 | 商住(2) | 11000 | | 31 | 恒大御景湾 | 白云 | 金沙洲 | 金沙洲大桥沿江北段 | 二室(6) , 三室(4) , 四室(3) | 171 | | 32 | 珠江帝景紫龙府 | 海珠 | 广州大道南 | 新领事馆东侧 | 四室(2) , 五室及以上(3) | 42000 | | 33 | 万科金色梦想 | 黄埔 | 萝岗 | 科学城开创大道与开源大道交接处 | 二室(1) , 三室(9) , 四室(1)
原文:http://www.cnblogs.com/alexkn/p/5215585.html