Last active
September 20, 2016 05:36
-
-
Save qhhonx/4fd563da135f3b470a76 to your computer and use it in GitHub Desktop.
爬取搜房网·新房·数据信息。 (Python Multi-threading requests BeautifulSoup)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding=utf8 | |
import sys | |
__author__ = 'xohozu' | |
import Queue | |
import threading | |
import traceback | |
from time import sleep | |
import bs4 | |
import MySQLdb | |
import requests | |
from bs4 import BeautifulSoup | |
reload(sys) | |
sys.setdefaultencoding('utf8') | |
LOCK = threading.Lock() | |
DEBUG = True | |
def add_city_to_queue(citys, direction='forward', *args): | |
""" | |
:param citys: 即将爬取的城市队列 | |
:param direction: 从城市列表提取的方向(前->后,后->前) | |
:param args: 包含(posts,payloads,next_urls,pages,datas)等队列,当这些队列均为空时提取下一个城市至citys | |
""" | |
# 保存城市信息) | |
links = [] | |
with open('new_house_cities.txt', 'r') as f: | |
for line in f.readlines(): | |
if not line.strip(): | |
continue | |
line = line.strip().split(' ') | |
pos = line[1].find('/house') | |
links.append((line[0].decode('utf8'), line[1][:pos], line[1][pos:])) | |
if not links: | |
print u'没有任何城市列表信息。' | |
return | |
if direction == 'forward': | |
pass | |
elif direction == 'backward': | |
links.reverse() | |
while True: | |
for queue in args: | |
if not queue.empty(): | |
break | |
else: | |
# 每次提取1个城市 | |
for _ in range(1): | |
link = links.pop(0) | |
citys.put(link) | |
links.append(link) | |
sleep(5) | |
class SqlExecute(threading.Thread): | |
""" | |
将datas队列中的数据添加至数据库 | |
若已经存在,则无需添加.(为何有重复数据,暂时不明真相) | |
""" | |
def __init__(self, datas, con): | |
threading.Thread.__init__(self) | |
self.datas = datas | |
self.con = con | |
def run(self): | |
while True: | |
try: | |
cur = self.con.cursor() | |
break | |
except: | |
global LOCK | |
LOCK.acquire() | |
traceback.print_exc(file=open('log/failed_sql_exec.txt', 'a')) | |
LOCK.release() | |
while True: | |
data = self.datas.get() | |
select = "select * from xf " \ | |
"where city = '%s' AND district = '%s' AND purpose = '%s' AND railway = '%s' " \ | |
"AND q_price = '%s' AND unit = '%s' AND name = '%s' AND link = '%s' AND state = '%s' " \ | |
"AND tag = '%s' AND addr = '%s' AND price = '%s';" % data | |
insert = "insert into xf(city, district, purpose, railway, q_price, " \ | |
"unit, name, link, state, tag, addr, price) " \ | |
"values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');" % data | |
LOCK.acquire() | |
try: | |
if cur.execute(select): | |
with open('log/failed_record_exists.txt', 'a') as f: | |
for d in data: | |
if d: | |
print >> f, d.encode('utf8'), | |
print >> f | |
else: | |
cur.execute(insert) | |
self.con.commit() | |
except: | |
self.con.rollback() | |
traceback.print_exc(file=open('log/failed_sql_exec.txt', 'a')) | |
with open('log/failed_sql_exec.txt', 'a') as f: | |
print >> f, data, '\n' | |
LOCK.release() | |
self.datas.task_done() | |
class PageParse(threading.Thread): | |
""" | |
对含有房源信息的网页进行解析,并存数据库; | |
探测是否包含‘下一页’标签,加入next_urls队列 | |
""" | |
def __init__(self, pages, next_urls, payloads, datas): | |
threading.Thread.__init__(self) | |
self.pages = pages | |
self.next_urls = next_urls | |
self.payloads = payloads | |
self.datas = datas | |
def run(self): | |
while True: | |
# if self.datas.qsize() > 500: | |
# sleep(10) | |
page = self.pages.get() | |
if not self.extract(page): | |
global LOCK | |
LOCK.acquire() | |
with open('log/failed_get_pages_list.txt', 'a') as f: | |
del page['html'] | |
print >> f, page | |
LOCK.release() | |
else: | |
global DEBUG | |
if DEBUG: | |
LOCK.acquire() | |
print self.name, self.__class__ | |
print page['strCity'], page['strDistrict'], page['strPurpose'], page['Railway'], page['strPrice'] | |
print page['host'] + page['url'] | |
print u'完成此页面的数据解析。' | |
LOCK.release() | |
self.pages.task_done() | |
def extract(self, page): | |
""" | |
抽取网页房源信息列表 | |
:param page: | |
:return: bool | |
""" | |
try: | |
soup = BeautifulSoup(page['html'], 'lxml', from_encoding='gb18030') | |
# 存在相符的房源 | |
if not soup.find(attrs={'class': 'searchNoInfo'}): | |
# 查找所需房源信息列表 | |
foods = soup.find_all(attrs={'class': 'sslalone'}) | |
flag = True | |
if foods: | |
for food in foods: | |
flag = self.store_details(food, page) and flag | |
# 查找'下一页'div元素 | |
url = soup.find(attrs={'class': 'pagearrowright'}) | |
if url: | |
next_url = page.copy() | |
del next_url['html'] | |
next_url['url'] = url.a.get('href') | |
self.next_urls.put(next_url) | |
return flag | |
else: | |
# 该网页没有房源信息 | |
# 不尝试再次请求,直接返回 | |
return False | |
except: | |
global LOCK | |
LOCK.acquire() | |
traceback.print_exc(file=open('log/failed_get_pages_list.txt', 'a')) | |
with open('log/failed_get_pages_list.txt', 'a') as f: | |
print >> f, page['host'], page['url'], '\n' | |
LOCK.release() | |
return False | |
def store_details(self, food, keywords): | |
""" | |
解析某一房源网页数据,并保存 | |
:param food: | |
:param keywords: | |
""" | |
try: | |
sslainfor = food.find(attrs={'class': 'sslainfor'}) | |
li = sslainfor.find_all('li') | |
name = li[0].strong.string | |
href = li[0].strong.a.get('href') | |
tag = li[0].span.string | |
state = '' | |
if li[0].img: | |
# 检查图标类型 | |
if li[0].img.get('src').find('dotzs') != -1: | |
state = u'在售' | |
elif li[0].img.get('src').find('dotds') != -1: | |
state = u'待售' | |
elif li[0].img.get('src').find('dotzus') != -1: | |
state = u'租售' | |
elif li[0].img.get('src').find('dot10') != -1: | |
state = u'售完' | |
elif li[0].img.get('src').find('dotzz') != -1: | |
state = u'在租' | |
elif li[0].img.get('src').find('zazu-new') != -1: | |
state = u'在租*新' | |
elif li[0].img.get('src').find('zashow-new') != -1: | |
state = u'租售*新' | |
else: | |
state = li[0].img.get('src') | |
# 保存未知的图标信息 | |
with open('log/tubiao.txt', 'a') as f: | |
print >> f, li[0].img.get('src') | |
if li[1].font: | |
addr = li[1].font.get('title') | |
else: | |
addr = li[1].span.text + li[1].contents[1] | |
sslaright = food.find(attrs={'class': 'sslaright'}) | |
price = '' | |
if sslaright: | |
# 判断该条目是否含有价格信息 | |
price = sslaright.find(attrs={'class': 'junjia'}) | |
if price: | |
price = price.text.strip() | |
self.datas.put((keywords['strCity'], keywords['strDistrict'], keywords['strPurpose'], keywords['Railway'], | |
keywords['strPrice'], keywords['unit'], name, href, state, tag, addr, price)) | |
return True | |
except: | |
global LOCK | |
LOCK.acquire() | |
traceback.print_exc(file=open('log/failed_get_pages_list.txt', 'a')) | |
with open('log/failed_get_pages_list.txt', 'a') as f: | |
print >> f, self.store_details.__name__, 'failed\n' | |
LOCK.release() | |
return False | |
class PageGet(threading.Thread): | |
""" | |
请求从'下一页'标签提取的链接,获取html文本 | |
""" | |
def __init__(self, pages, next_urls, proxies): | |
threading.Thread.__init__(self) | |
self.pages = pages | |
self.next_urls = next_urls | |
self.proxies = proxies | |
def run(self): | |
while True: | |
next_url = self.next_urls.get() | |
global DEBUG | |
if DEBUG: | |
global LOCK | |
LOCK.acquire() | |
print self.name, self.__class__ | |
print next_url['strCity'], next_url['strDistrict'], next_url['strPurpose'], next_url['Railway'], \ | |
next_url['strPrice'] | |
print next_url['host'] + next_url['url'] | |
print u'正在请求此链接获取网页内容...' | |
LOCK.release() | |
try: | |
r = requests.get(next_url['host'] + next_url['url'], proxies=self.proxies) | |
sleep(1) | |
page = next_url.copy() | |
page['html'] = r.content | |
self.pages.put(page) | |
except: | |
LOCK.acquire() | |
print next_url['host'] + next_url['url'], u'请求失败!' | |
traceback.print_exc(file=open('log/failed_get_next_pages_list.txt', 'a')) | |
with open('log/failed_get_next_pages_list.txt', 'a') as f: | |
print >> f, next_url | |
LOCK.release() | |
self.next_urls.task_done() | |
class ParametersPost(threading.Thread): | |
""" | |
POST (区域,类型, 价格)或(地铁,类型, 价格)参数,获取相应的房源数据 | |
""" | |
def __init__(self, payloads, pages, proxies): | |
threading.Thread.__init__(self) | |
self.payloads = payloads | |
self.pages = pages | |
self.proxies = proxies | |
def run(self): | |
while True: | |
# if self.pages.qsize() > 200: | |
# sleep(10) | |
post_data = self.payloads.get() | |
global DEBUG | |
if DEBUG: | |
global LOCK | |
LOCK.acquire() | |
print self.name, self.__class__ | |
print post_data['strCity'], post_data['strDistrict'], post_data['strPurpose'], post_data['Railway'], \ | |
post_data['strPrice'] | |
print post_data['host'] + post_data['url'] | |
print u'正在POST此参数' | |
LOCK.release() | |
try: | |
data = { | |
'strCity': post_data['strCity'].encode('gb18030'), | |
'strDistrict': post_data['strDistrict'].encode('gb18030'), | |
'strPrice': post_data['strPrice'].encode('gb18030'), | |
'Railway': post_data['Railway'].encode('gb18030'), | |
'strPurpose': post_data['strPurpose'].encode('gb18030'), | |
'show_type': post_data['show_type'], | |
} | |
r = requests.post(post_data['host'] + post_data['url'], data=data, proxies=self.proxies) | |
sleep(1) | |
page = post_data.copy() | |
page['html'] = r.content | |
self.pages.put(page) | |
except: | |
LOCK.acquire() | |
print post_data['strCity'], post_data['strDistrict'], post_data['strPrice'], post_data['strPurpose'], \ | |
post_data['Railway'], u'POST此参数失败!' | |
traceback.print_exc(file=open('log/failed_parameters_post_list.txt', 'a')) | |
with open('log/failed_parameters_post_list.txt', 'a') as f: | |
print >> f, post_data['strCity'].encode('utf8'), post_data['strDistrict'].encode('utf8'), \ | |
post_data['strPrice'].encode('utf8'), post_data['strPurpose'].encode('utf8'), \ | |
post_data['Railway'].encode('utf8') | |
LOCK.release() | |
self.payloads.task_done() | |
class PostParametersGenerate(threading.Thread): | |
""" | |
POST (区域,类型)或(地铁,类型)参数,获取相应的价格参数数据 | |
""" | |
def __init__(self, posts, payloads, proxies): | |
threading.Thread.__init__(self) | |
self.posts = posts | |
self.payloads = payloads | |
self.proxies = proxies | |
def run(self): | |
while True: | |
# if self.payloads.qsize() > 100: | |
# sleep(10) | |
post_data = self.posts.get() | |
global DEBUG | |
if DEBUG: | |
global LOCK | |
LOCK.acquire() | |
print self.name, self.__class__ | |
print post_data['strCity'], post_data['strDistrict'], post_data['strPurpose'], post_data['Railway'] | |
print post_data['host'] + post_data['url'] | |
print u'正在POST获取strPrice' | |
LOCK.release() | |
try: | |
data = { | |
'strCity': post_data['strCity'].encode('gb18030'), | |
'strDistrict': post_data['strDistrict'].encode('gb18030'), | |
'Railway': post_data['Railway'].encode('gb18030'), | |
'strPurpose': post_data['strPurpose'].encode('gb18030'), | |
'show_type': post_data['show_type'], | |
} | |
r = requests.post(post_data['host'] + post_data['url'], data=data, proxies=self.proxies) | |
sleep(1) | |
soup = BeautifulSoup(r.content, 'lxml', from_encoding='gb18030') | |
# 判断未包含价格参数时是否有房源信息 | |
if soup.find(attrs={'class': 'searchNoInfo'}): | |
self.posts.task_done() | |
continue | |
s3 = soup.find(id="sjina_B01_07").find(attrs={'class': 's3'}) | |
price_flag = False | |
for c in s3.contents[::-1]: | |
if isinstance(c, bs4.element.Tag): | |
if c.name == 'span': | |
unit = c.string | |
elif c.name == 'a': | |
payload = post_data.copy() | |
payload['strPrice'] = c.string | |
payload['unit'] = unit | |
self.payloads.put(payload) | |
# 标记含有价格参数 | |
price_flag = True | |
# 没有价格信息 | |
if not price_flag: | |
payload = post_data.copy() | |
payload['strPrice'] = '' | |
payload['unit'] = '' | |
self.payloads.put(payload) | |
except: | |
LOCK.acquire() | |
print post_data['host'] + post_data['url'], u'获取strPrice参数失败!' | |
traceback.print_exc(file=open('log/failed_generate_strPrice_list.txt', 'a')) | |
with open('log/failed_generate_strPrice_list.txt', 'a') as f: | |
print >> f, post_data['strCity'].encode('utf8'), post_data['strDistrict'].encode('utf8'), \ | |
post_data['strPurpose'].encode('utf8'), post_data['Railway'].encode('utf8') | |
LOCK.release() | |
self.posts.task_done() | |
class PostDataGenerate(threading.Thread): | |
""" | |
生成城市的区域,类型,地铁参数等post数据 | |
""" | |
def __init__(self, citys, posts, proxies): | |
threading.Thread.__init__(self) | |
self.citys = citys | |
self.posts = posts | |
self.proxies = proxies | |
def run(self): | |
while True: | |
city, host, url = self.citys.get() | |
params = self.get_post_params(host + url) | |
if not params: | |
global LOCK | |
LOCK.acquire() | |
print city, host, url, u'获取区域,类型,地铁参数失败!' | |
LOCK.release() | |
with open('log/failed_city_list.txt', 'a') as f: | |
print >> f, city.encode('utf8'), url.encode('utf8') | |
else: | |
global DEBUG | |
if DEBUG: | |
LOCK.acquire() | |
print self.name, self.__class__ | |
print city, host + url | |
print u'区域,类型,地铁 参数生成' | |
LOCK.release() | |
for district in params[0]: | |
for purpose in params[1]: | |
self.posts.put({ | |
'strCity': city, | |
'strDistrict': district, | |
'Railway': '', | |
'strPurpose': purpose, | |
'show_type': '', | |
'url': url, | |
'host': host | |
}) | |
for railway in params[2]: | |
for purpose in params[1]: | |
self.posts.put({ | |
'strCity': city, | |
'strDistrict': '', | |
'Railway': railway, | |
'strPurpose': purpose, | |
'show_type': 'rail', | |
'url': url, | |
'host': host | |
}) | |
self.citys.task_done() | |
def get_post_params(self, url): | |
""" | |
获取post请求需要的参数 | |
:param url: | |
:return: 返回区域,类型,地铁三元组 | False | |
""" | |
def to_name(s): | |
""" | |
删除 xxx(xx) 格式字符串的带括号部分 | |
:param s: | |
:return: | |
""" | |
pos = s.find('(') | |
if pos != -1: | |
return s[:pos] | |
else: | |
pos = s.find(u'(') | |
if pos != -1: | |
return s[:pos] | |
else: | |
return s | |
try: | |
r = requests.get(url, proxies=self.proxies) | |
sleep(1) | |
sp = BeautifulSoup(r.content, 'lxml', from_encoding='gb18030') | |
purpose_div = sp.find(id="sjina_B01_06") | |
if purpose_div: | |
purpose = [to_name(a.string.strip()) | |
for a in purpose_div.find(attrs={'class': 's3'}).find_all('a')] | |
district_div = sp.find(id="sjina_B01_05") | |
if district_div: | |
district = [to_name(a.string.strip()) | |
for a in district_div.find(attrs={'class': 's3'}).find_all('a')] | |
railway_div = sp.find(id="sjina_B01_09") | |
if railway_div: | |
railway = [to_name(a.string.strip()) | |
for a in railway_div.find(attrs={'class': 's3'}).find_all('a')] | |
if district_div and railway_div: | |
return district, purpose, railway | |
elif district_div: | |
return district, purpose, [] | |
else: | |
return False | |
else: | |
global LOCK | |
LOCK.acquire() | |
with open('log/failed_get_post_params.txt', 'a') as f: | |
print >> f, url | |
print >> f, sp.encode('utf8') | |
LOCK.release() | |
except: | |
LOCK.acquire() | |
traceback.print_exc(file=open('log/failed_get_post_params.txt', 'a')) | |
LOCK.release() | |
return False | |
class PrintThread(threading.Thread): | |
def __init__(self, citys, posts, payloads, next_urls, pages, datas): | |
threading.Thread.__init__(self) | |
self.citys = citys | |
self.posts = posts | |
self.payloads = payloads | |
self.next_urls = next_urls | |
self.pages = pages | |
self.datas = datas | |
def run(self): | |
while True: | |
global LOCK | |
LOCK.acquire() | |
print 'city_queue ', self.citys.qsize() | |
print 'post_queue ', self.posts.qsize() | |
print 'payload_queue', self.payloads.qsize() | |
print 'next_urls ', self.next_urls.qsize() | |
print 'pages ', self.pages.qsize() | |
print 'datas ', self.datas.qsize() | |
# for t in sorted(threading.enumerate()): | |
# print t | |
LOCK.release() | |
sleep(5) | |
def create_threads(class_name, num, *args): | |
if num > 0: | |
for i in range(num): | |
t = class_name(*args) | |
t.setDaemon(True) | |
t.start() | |
import proxy | |
def main(): | |
# 初始化队列 | |
# citys -> posts | |
# posts -> payloads | |
# payloads -> pages | |
# next_urls -> pages | |
# pages -> datas | |
# pages -> next_urls | |
citys = Queue.Queue() | |
posts = Queue.Queue() | |
payloads = Queue.Queue() | |
next_urls = Queue.Queue() | |
pages = Queue.Queue(1000) | |
datas = Queue.Queue(5000) | |
con = MySQLdb.connect(host='localhost', user='root', passwd='root', db='soufun', | |
charset='utf8') | |
proxies = None | |
proxieslist = { | |
'http': [] | |
} | |
create_threads(PostDataGenerate, 1, citys, posts, proxies) | |
create_threads(PostParametersGenerate, 1, posts, payloads, proxies) | |
create_threads(ParametersPost, 10, payloads, pages, proxies) | |
create_threads(PageGet, 10, pages, next_urls, proxies) | |
create_threads(PageParse, 15, pages, next_urls, payloads, datas) | |
create_threads(SqlExecute, 20, datas, con) | |
create_threads(PrintThread, 1, citys, posts, payloads, next_urls, pages, datas) | |
# 代理更新 | |
proxy.proxy(proxies, proxieslist) | |
if len(sys.argv) > 2: | |
print u'运行参数不正确.' | |
return | |
add_city_to_queue(citys, sys.argv[1], posts, payloads, next_urls, pages, datas) | |
if __name__ == '__main__': | |
main() | |
# new_house_cities.txt | |
北京 http://soufun.com/house/web/Search_Result.php | |
天津 http://newhouse.tj.soufun.com/house/web/Search_Result.php | |
重庆 http://newhouse.cq.soufun.com/house/web/Search_Result.php | |
合肥 http://newhouse.hf.soufun.com/house/web/Search_Result.php | |
芜湖 http://newhouse.wuhu.soufun.com/house/web/Search_Result.php | |
淮南 http://newhouse.huainan.soufun.com/house/web/Search_Result.php | |
蚌埠 http://newhouse.bengbu.soufun.com/house/web/Search_Result.php | |
阜阳 http://newhouse.fuyang.soufun.com/house/web/Search_Result.php | |
安庆 http://newhouse.anqing.soufun.com/house/web/Search_Result.php | |
巢湖 http://newhouse.chaohu.soufun.com/house/web/Search_Result.php | |
滁州 http://newhouse.chuzhou.soufun.com/house/web/Search_Result.php | |
六安 http://newhouse.luan.soufun.com/house/web/Search_Result.php | |
铜陵 http://newhouse.tongling.soufun.com/house/web/Search_Result.php | |
淮北 http://newhouse.huaibei.soufun.com/house/web/Search_Result.php | |
宣城 http://newhouse.xuancheng.soufun.com/house/web/Search_Result.php | |
黄山 http://newhouse.huangshan.soufun.com/house/web/Search_Result.php | |
宿州 http://newhouse.ahsuzhou.soufun.com/house/web/Search_Result.php | |
亳州 http://newhouse.bozhou.soufun.com/house/web/Search_Result.php | |
马鞍山 http://newhouse.mas.soufun.com/house/web/Search_Result.php | |
池州 http://newhouse.chizhou.soufun.com/house/web/Search_Result.php | |
万州 http://newhouse.wanzhou.soufun.com/house/web/Search_Result.php | |
涪陵 http://newhouse.fuling.soufun.com/house/web/Search_Result.php | |
綦江 http://newhouse.qijiang.soufun.com/house/web/Search_Result.php | |
黔江 http://newhouse.qianjiang.soufun.com/house/web/Search_Result.php | |
合川 http://newhouse.hechuan.soufun.com/house/web/Search_Result.php | |
永川 http://newhouse.yongchuan.soufun.com/house/web/Search_Result.php | |
福州 http://newhouse.fz.soufun.com/house/web/Search_Result.php | |
厦门 http://newhouse.xm.soufun.com/house/web/Search_Result.php | |
泉州 http://newhouse.qz.soufun.com/house/web/Search_Result.php | |
莆田 http://newhouse.putian.soufun.com/house/web/Search_Result.php | |
漳州 http://newhouse.zhangzhou.soufun.com/house/web/Search_Result.php | |
龙岩 http://newhouse.longyan.soufun.com/house/web/Search_Result.php | |
三明 http://newhouse.sanming.soufun.com/house/web/Search_Result.php | |
南平 http://newhouse.nanping.soufun.com/house/web/Search_Result.php | |
宁德 http://newhouse.ningde.soufun.com/house/web/Search_Result.php | |
平潭 http://newhouse.pingtan.soufun.com/house/web/Search_Result.php | |
广州 http://newhouse.gz.soufun.com/house/web/Search_Result.php | |
深圳 http://newhouse.sz.soufun.com/house/web/Search_Result.php | |
东莞 http://newhouse.dg.soufun.com/house/web/Search_Result.php | |
珠海 http://newhouse.zh.soufun.com/house/web/Search_Result.php | |
中山 http://newhouse.zs.soufun.com/house/web/Search_Result.php | |
佛山 http://newhouse.fs.soufun.com/house/web/Search_Result.php | |
惠州 http://newhouse.huizhou.soufun.com/house/web/Search_Result.php | |
江门 http://newhouse.jm.soufun.com/house/web/Search_Result.php | |
汕头 http://newhouse.st.soufun.com/house/web/Search_Result.php | |
清远 http://newhouse.qingyuan.soufun.com/house/web/Search_Result.php | |
肇庆 http://newhouse.zhaoqing.soufun.com/house/web/Search_Result.php | |
阳江 http://newhouse.yangjiang.soufun.com/house/web/Search_Result.php | |
茂名 http://newhouse.maoming.soufun.com/house/web/Search_Result.php | |
湛江 http://newhouse.zj.soufun.com/house/web/Search_Result.php | |
梅州 http://newhouse.meizhou.soufun.com/house/web/Search_Result.php | |
揭阳 http://newhouse.jieyang.soufun.com/house/web/Search_Result.php | |
河源 http://newhouse.heyuan.soufun.com/house/web/Search_Result.php | |
云浮 http://newhouse.yunfu.soufun.com/house/web/Search_Result.php | |
潮州 http://newhouse.chaozhou.soufun.com/house/web/Search_Result.php | |
韶关 http://newhouse.shaoguan.soufun.com/house/web/Search_Result.php | |
南宁 http://newhouse.nn.soufun.com/house/web/Search_Result.php | |
柳州 http://newhouse.liuzhou.soufun.com/house/web/Search_Result.php | |
桂林 http://newhouse.guilin.soufun.com/house/web/Search_Result.php | |
贵港 http://newhouse.guigang.soufun.com/house/web/Search_Result.php | |
北海 http://newhouse.bh.soufun.com/house/web/Search_Result.php | |
百色 http://newhouse.baise.soufun.com/house/web/Search_Result.php | |
梧州 http://newhouse.wuzhou.soufun.com/house/web/Search_Result.php | |
钦州 http://newhouse.qinzhou.soufun.com/house/web/Search_Result.php | |
防城港 http://newhouse.fangchenggang.soufun.com/house/web/Search_Result.php | |
来宾 http://newhouse.laibin.soufun.com/house/web/Search_Result.php | |
崇左 http://newhouse.chongzuo.soufun.com/house/web/Search_Result.php | |
贵阳 http://newhouse.gy.soufun.com/house/web/Search_Result.php | |
遵义 http://newhouse.zunyi.soufun.com/house/web/Search_Result.php | |
黔东南 http://newhouse.qiandongnan.soufun.com/house/web/Search_Result.php | |
安顺 http://newhouse.anshun.soufun.com/house/web/Search_Result.php | |
毕节 http://newhouse.bijie.soufun.com/house/web/Search_Result.php | |
六盘水 http://newhouse.liupanshui.soufun.com/house/web/Search_Result.php | |
黔西南 http://newhouse.qianxinan.soufun.com/house/web/Search_Result.php | |
兰州 http://newhouse.lz.soufun.com/house/web/Search_Result.php | |
天水 http://newhouse.tianshui.soufun.com/house/web/Search_Result.php | |
海口 http://newhouse.hn.soufun.com/house/web/Search_Result.php | |
三亚 http://newhouse.sanya.soufun.com/house/web/Search_Result.php | |
郑州 http://newhouse.zz.soufun.com/house/web/Search_Result.php | |
洛阳 http://newhouse.ly.soufun.com/house/web/Search_Result.php | |
焦作 http://newhouse.jiaozuo.soufun.com/house/web/Search_Result.php | |
平顶山 http://newhouse.pingdingshan.soufun.com/house/web/Search_Result.php | |
驻马店 http://newhouse.zhumadian.soufun.com/house/web/Search_Result.php | |
新乡 http://newhouse.xx.soufun.com/house/web/Search_Result.php | |
南阳 http://newhouse.nanyang.soufun.com/house/web/Search_Result.php | |
信阳 http://newhouse.xinyang.soufun.com/house/web/Search_Result.php | |
开封 http://newhouse.kaifeng.soufun.com/house/web/Search_Result.php | |
漯河 http://newhouse.luohe.soufun.com/house/web/Search_Result.php | |
安阳 http://newhouse.anyang.soufun.com/house/web/Search_Result.php | |
商丘 http://newhouse.shangqiu.soufun.com/house/web/Search_Result.php | |
周口 http://newhouse.zhoukou.soufun.com/house/web/Search_Result.php | |
许昌 http://newhouse.xuchang.soufun.com/house/web/Search_Result.php | |
濮阳 http://newhouse.puyang.soufun.com/house/web/Search_Result.php | |
鹤壁 http://newhouse.hebi.soufun.com/house/web/Search_Result.php | |
哈尔滨 http://newhouse.hrb.soufun.com/house/web/Search_Result.php | |
大庆 http://newhouse.daqing.soufun.com/house/web/Search_Result.php | |
齐齐哈尔 http://newhouse.qiqihaer.soufun.com/house/web/Search_Result.php | |
佳木斯 http://newhouse.jiamusi.soufun.com/house/web/Search_Result.php | |
牡丹江 http://newhouse.mudanjiang.soufun.com/house/web/Search_Result.php | |
武汉 http://newhouse.wuhan.soufun.com/house/web/Search_Result.php | |
宜昌 http://newhouse.yc.soufun.com/house/web/Search_Result.php | |
襄阳 http://newhouse.xiangyang.soufun.com/house/web/Search_Result.php | |
荆州 http://newhouse.jingzhou.soufun.com/house/web/Search_Result.php | |
十堰 http://newhouse.shiyan.soufun.com/house/web/Search_Result.php | |
黄冈 http://newhouse.huanggang.soufun.com/house/web/Search_Result.php | |
荆门 http://newhouse.jingmen.soufun.com/house/web/Search_Result.php | |
随州 http://newhouse.suizhou.soufun.com/house/web/Search_Result.php | |
恩施 http://newhouse.enshi.soufun.com/house/web/Search_Result.php | |
孝感 http://newhouse.xiaogan.soufun.com/house/web/Search_Result.php | |
黄石 http://newhouse.huangshi.soufun.com/house/web/Search_Result.php | |
鄂州 http://newhouse.ezhou.soufun.com/house/web/Search_Result.php | |
咸宁 http://newhouse.xianning.soufun.com/house/web/Search_Result.php | |
仙桃 http://newhouse.xiantao.soufun.com/house/web/Search_Result.php | |
长沙 http://newhouse.cs.soufun.com/house/web/Search_Result.php | |
株洲 http://newhouse.zhuzhou.soufun.com/house/web/Search_Result.php | |
衡阳 http://newhouse.hengyang.soufun.com/house/web/Search_Result.php | |
岳阳 http://newhouse.yueyang.soufun.com/house/web/Search_Result.php | |
湘潭 http://newhouse.xt.soufun.com/house/web/Search_Result.php | |
常德 http://newhouse.changde.soufun.com/house/web/Search_Result.php | |
益阳 http://newhouse.yiyang.soufun.com/house/web/Search_Result.php | |
永州 http://newhouse.yongzhou.soufun.com/house/web/Search_Result.php | |
娄底 http://newhouse.loudi.soufun.com/house/web/Search_Result.php | |
邵阳 http://newhouse.shaoyang.soufun.com/house/web/Search_Result.php | |
怀化 http://newhouse.huaihua.soufun.com/house/web/Search_Result.php | |
郴州 http://newhouse.chenzhou.soufun.com/house/web/Search_Result.php | |
张家界 http://newhouse.zhangjiajie.soufun.com/house/web/Search_Result.php | |
石家庄 http://newhouse.sjz.soufun.com/house/web/Search_Result.php | |
唐山 http://newhouse.ts.soufun.com/house/web/Search_Result.php | |
保定 http://newhouse.bd.soufun.com/house/web/Search_Result.php | |
沧州 http://newhouse.cangzhou.soufun.com/house/web/Search_Result.php | |
廊坊 http://newhouse.lf.soufun.com/house/web/Search_Result.php | |
邢台 http://newhouse.xingtai.soufun.com/house/web/Search_Result.php | |
邯郸 http://newhouse.hd.soufun.com/house/web/Search_Result.php | |
秦皇岛 http://newhouse.qhd.soufun.com/house/web/Search_Result.php | |
衡水 http://newhouse.hs.soufun.com/house/web/Search_Result.php | |
张家口 http://newhouse.zhangjiakou.soufun.com/house/web/Search_Result.php | |
承德 http://newhouse.chengde.soufun.com/house/web/Search_Result.php | |
固安 http://newhouse.guan.soufun.com/house/web/Search_Result.php | |
燕郊 http://newhouse.yanjiao.soufun.com/house/web/Search_Result.php | |
涿州 http://newhouse.zhuozhou.soufun.com/house/web/Search_Result.php | |
香河 http://newhouse.xianghe.soufun.com/house/web/Search_Result.php | |
南京 http://nanjing.soufun.com/house/web/Search_Result.php | |
苏州 http://newhouse.suzhou.soufun.com/house/web/Search_Result.php | |
无锡 http://newhouse.wuxi.soufun.com/house/web/Search_Result.php | |
徐州 http://newhouse.xz.soufun.com/house/web/Search_Result.php | |
常州 http://newhouse.cz.soufun.com/house/web/Search_Result.php | |
淮安 http://newhouse.huaian.soufun.com/house/web/Search_Result.php | |
扬州 http://newhouse.yz.soufun.com/house/web/Search_Result.php | |
南通 http://newhouse.nt.soufun.com/house/web/Search_Result.php | |
盐城 http://newhouse.yancheng.soufun.com/house/web/Search_Result.php | |
连云港 http://newhouse.lyg.soufun.com/house/web/Search_Result.php | |
宿迁 http://newhouse.sq.soufun.com/house/web/Search_Result.php | |
泰州 http://newhouse.taizhou.soufun.com/house/web/Search_Result.php | |
镇江 http://newhouse.zhenjiang.soufun.com/house/web/Search_Result.php | |
常熟 http://newhouse.changshu.soufun.com/house/web/Search_Result.php | |
张家港 http://newhouse.zjg.soufun.com/house/web/Search_Result.php | |
昆山 http://newhouse.ks.soufun.com/house/web/Search_Result.php | |
吴江 http://newhouse.wj.soufun.com/house/web/Search_Result.php | |
太仓 http://newhouse.tc.soufun.com/house/web/Search_Result.php | |
江阴 http://newhouse.jy.soufun.com/house/web/Search_Result.php | |
宜兴 http://newhouse.yixing.soufun.com/house/web/Search_Result.php | |
南昌 http://newhouse.nc.soufun.com/house/web/Search_Result.php | |
赣州 http://newhouse.ganzhou.soufun.com/house/web/Search_Result.php | |
九江 http://newhouse.jiujiang.soufun.com/house/web/Search_Result.php | |
吉安 http://newhouse.jian.soufun.com/house/web/Search_Result.php | |
上饶 http://newhouse.shangrao.soufun.com/house/web/Search_Result.php | |
萍乡 http://newhouse.pingxiang.soufun.com/house/web/Search_Result.php | |
宜春 http://newhouse.yichun.soufun.com/house/web/Search_Result.php | |
景德镇 http://newhouse.jingdezhen.soufun.com/house/web/Search_Result.php | |
抚州 http://newhouse.jxfuzhou.soufun.com/house/web/Search_Result.php | |
新余 http://newhouse.xinyu.soufun.com/house/web/Search_Result.php | |
长春 http://newhouse.changchun.soufun.com/house/web/Search_Result.php | |
吉林 http://newhouse.jl.soufun.com/house/web/Search_Result.php | |
沈阳 http://newhouse.sy.soufun.com/house/web/Search_Result.php | |
大连 http://newhouse.dl.soufun.com/house/web/Search_Result.php | |
抚顺 http://newhouse.fushun.soufun.com/house/web/Search_Result.php | |
锦州 http://newhouse.jinzhou.soufun.com/house/web/Search_Result.php | |
鞍山 http://newhouse.anshan.soufun.com/house/web/Search_Result.php | |
葫芦岛 http://newhouse.huludao.soufun.com/house/web/Search_Result.php | |
阜新 http://newhouse.fuxin.soufun.com/house/web/Search_Result.php | |
营口 http://newhouse.yk.soufun.com/house/web/Search_Result.php | |
本溪 http://newhouse.benxi.soufun.com/house/web/Search_Result.php | |
朝阳 http://newhouse.chaoyang.soufun.com/house/web/Search_Result.php | |
辽阳 http://newhouse.liaoyang.soufun.com/house/web/Search_Result.php | |
盘锦 http://newhouse.panjin.soufun.com/house/web/Search_Result.php | |
丹东 http://newhouse.dandong.soufun.com/house/web/Search_Result.php | |
银川 http://newhouse.yinchuan.soufun.com/house/web/Search_Result.php | |
呼和浩特 http://newhouse.nm.soufun.com/house/web/Search_Result.php | |
包头 http://newhouse.bt.soufun.com/house/web/Search_Result.php | |
赤峰 http://newhouse.chifeng.soufun.com/house/web/Search_Result.php | |
鄂尔多斯 http://newhouse.erds.soufun.com/house/web/Search_Result.php | |
通辽 http://newhouse.tl.soufun.com/house/web/Search_Result.php | |
乌兰察布 http://newhouse.wlcb.soufun.com/house/web/Search_Result.php | |
巴彦淖尔 http://newhouse.byne.soufun.com/house/web/Search_Result.php | |
西宁 http://newhouse.xn.soufun.com/house/web/Search_Result.php | |
济南 http://newhouse.jn.soufun.com/house/web/Search_Result.php | |
青岛 http://newhouse.qd.soufun.com/house/web/Search_Result.php | |
淄博 http://newhouse.zb.soufun.com/house/web/Search_Result.php | |
潍坊 http://newhouse.wf.soufun.com/house/web/Search_Result.php | |
烟台 http://newhouse.yt.soufun.com/house/web/Search_Result.php | |
临沂 http://newhouse.linyi.soufun.com/house/web/Search_Result.php | |
济宁 http://newhouse.jining.soufun.com/house/web/Search_Result.php | |
滨州 http://newhouse.binzhou.soufun.com/house/web/Search_Result.php | |
德州 http://newhouse.dz.soufun.com/house/web/Search_Result.php | |
东营 http://newhouse.dy.soufun.com/house/web/Search_Result.php | |
枣庄 http://newhouse.zaozhuang.soufun.com/house/web/Search_Result.php | |
聊城 http://newhouse.lc.soufun.com/house/web/Search_Result.php | |
泰安 http://newhouse.taian.soufun.com/house/web/Search_Result.php | |
日照 http://newhouse.rz.soufun.com/house/web/Search_Result.php | |
菏泽 http://newhouse.heze.soufun.com/house/web/Search_Result.php | |
威海 http://newhouse.weihai.soufun.com/house/web/Search_Result.php | |
莱芜 http://newhouse.laiwu.soufun.com/house/web/Search_Result.php | |
太原 http://newhouse.taiyuan.soufun.com/house/web/Search_Result.php | |
长治 http://newhouse.changzhi.soufun.com/house/web/Search_Result.php | |
运城 http://newhouse.yuncheng.soufun.com/house/web/Search_Result.php | |
临汾 http://newhouse.linfen.soufun.com/house/web/Search_Result.php | |
晋中 http://newhouse.jinzhong.soufun.com/house/web/Search_Result.php | |
大同 http://newhouse.datong.soufun.com/house/web/Search_Result.php | |
忻州 http://newhouse.xinzhou.soufun.com/house/web/Search_Result.php | |
吕梁 http://newhouse.lvliang.soufun.com/house/web/Search_Result.php | |
朔州 http://newhouse.shuozhou.soufun.com/house/web/Search_Result.php | |
阳泉 http://newhouse.yangquan.soufun.com/house/web/Search_Result.php | |
晋城 http://newhouse.jc.soufun.com/house/web/Search_Result.php | |
西安 http://newhouse.xian.soufun.com/house/web/Search_Result.php | |
宝鸡 http://newhouse.baoji.soufun.com/house/web/Search_Result.php | |
咸阳 http://newhouse.xianyang.soufun.com/house/web/Search_Result.php | |
渭南 http://newhouse.weinan.soufun.com/house/web/Search_Result.php | |
汉中 http://newhouse.hanzhong.soufun.com/house/web/Search_Result.php | |
安康 http://newhouse.ankang.soufun.com/house/web/Search_Result.php | |
榆林 http://newhouse.sxyulin.soufun.com/house/web/Search_Result.php | |
延安 http://newhouse.yanan.soufun.com/house/web/Search_Result.php | |
铜川 http://newhouse.tongchuan.soufun.com/house/web/Search_Result.php | |
成都 http://newhouse.cd.soufun.com/house/web/Search_Result.php | |
绵阳 http://newhouse.mianyang.soufun.com/house/web/Search_Result.php | |
泸州 http://newhouse.luzhou.soufun.com/house/web/Search_Result.php | |
南充 http://newhouse.nanchong.soufun.com/house/web/Search_Result.php | |
德阳 http://newhouse.deyang.soufun.com/house/web/Search_Result.php | |
乐山 http://newhouse.leshan.soufun.com/house/web/Search_Result.php | |
达州 http://newhouse.dazhou.soufun.com/house/web/Search_Result.php | |
广安 http://newhouse.guangan.soufun.com/house/web/Search_Result.php | |
攀枝花 http://newhouse.panzhihua.soufun.com/house/web/Search_Result.php | |
遂宁 http://newhouse.suining.soufun.com/house/web/Search_Result.php | |
自贡 http://newhouse.zigong.soufun.com/house/web/Search_Result.php | |
内江 http://newhouse.neijiang.soufun.com/house/web/Search_Result.php | |
巴中 http://newhouse.bazhong.soufun.com/house/web/Search_Result.php | |
宜宾 http://newhouse.yibin.soufun.com/house/web/Search_Result.php | |
眉山 http://newhouse.meishan.soufun.com/house/web/Search_Result.php | |
资阳 http://newhouse.ziyang.soufun.com/house/web/Search_Result.php | |
乌鲁木齐 http://newhouse.xj.soufun.com/house/web/Search_Result.php | |
喀什 http://newhouse.kashi.soufun.com/house/web/Search_Result.php | |
巴州 http://newhouse.bazhou.soufun.com/house/web/Search_Result.php | |
伊犁 http://newhouse.yili.soufun.com/house/web/Search_Result.php | |
昆明 http://newhouse.km.soufun.com/house/web/Search_Result.php | |
红河 http://newhouse.honghe.soufun.com/house/web/Search_Result.php | |
曲靖 http://newhouse.qujing.soufun.com/house/web/Search_Result.php | |
玉溪 http://newhouse.yuxi.soufun.com/house/web/Search_Result.php | |
丽江 http://newhouse.lijiang.soufun.com/house/web/Search_Result.php | |
大理 http://newhouse.dali.soufun.com/house/web/Search_Result.php | |
西双版纳 http://newhouse.xishuangbanna.soufun.com/house/web/Search_Result.php | |
杭州 http://newhouse.hz.soufun.com/house/web/Search_Result.php | |
宁波 http://newhouse.nb.soufun.com/house/web/Search_Result.php | |
嘉兴 http://newhouse.jx.soufun.com/house/web/Search_Result.php | |
温州 http://newhouse.wz.soufun.com/house/web/Search_Result.php | |
金华 http://newhouse.jh.soufun.com/house/web/Search_Result.php | |
台州 http://newhouse.tz.soufun.com/house/web/Search_Result.php | |
绍兴 http://newhouse.sx.soufun.com/house/web/Search_Result.php | |
湖州 http://newhouse.huzhou.soufun.com/house/web/Search_Result.php | |
衢州 http://newhouse.quzhou.soufun.com/house/web/Search_Result.php | |
丽水 http://newhouse.ls.soufun.com/house/web/Search_Result.php | |
舟山 http://newhouse.zhoushan.soufun.com/house/web/Search_Result.php | |
长兴 http://newhouse.changxing.soufun.com/house/web/Search_Result.php | |
德清 http://newhouse.deqing.soufun.com/house/web/Search_Result.php | |
上海 http://newhouse.sh.soufun.com/house/web/Search_Result.php | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment