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 hidden or 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