好久没写代码了,今天有空写了一个爬虫,爬取了链家南沙小区二手房的简要数据(采集于2022年5月26日),花了差不多一个小时。
一、南沙在售二手房数量超过50套的41个小区
| 序号 | 小区名称 | 4月参考均价 | 90天成交套数 | 在售套数 |
| 1 | 南沙碧桂园 | 17482 | 10套 | 232 |
| 2 | 碧桂园天玺湾 | 24512 | 2套 | 217 |
| 3 | 时代南湾 | 24589 | 11套 | 185 |
| 4 | 南沙奥园 | 16545 | 2套 | 182 |
| 5 | 南沙金茂湾 | 33195 | 4套 | 178 |
| 6 | 南沙万达广场 | 7964 | 4套 | 152 |
| 7 | 丰庭花园 | 19325 | 2套 | 133 |
| 8 | 越秀滨海珺城 | 29134 | 5套 | 133 |
| 9 | 星河山海湾 | 34085 | 1套 | 123 |
| 10 | 凯德新玥 | 13831 | 7套 | 113 |
| 11 | 时代长岛 | 24888 | 1套 | 113 |
| 12 | 南沙境界家园 | 18690 | 4套 | 103 |
| 13 | 万科府前一号 | 27333 | 0套 | 101 |
| 14 | 越秀滨海隽城 | 24698 | 3套 | 98 |
| 15 | 南沙碧桂园豪庭 | 21863 | 6套 | 98 |
| 16 | 万科南方公元 | 20897 | 2套 | 95 |
| 17 | 叠翠峰 | 31055 | 2套 | 94 |
| 18 | 广晟海韵兰庭 | 21117 | 1套 | 91 |
| 19 | 南沙保利城 | 23813 | 0套 | 86 |
| 20 | 阳光城丽景湾 | 17645 | 4套 | 85 |
| 21 | 海力花园 | 20200 | 1套 | 82 |
| 22 | 越秀滨海御城 | 28937 | 4套 | 81 |
| 23 | 龙光棕榈水岸 | 27772 | 2套 | 78 |
| 24 | 广州时代云图 | 27151 | 0套 | 77 |
| 25 | 广州星河丹堤 | 23561 | 5套 | 77 |
| 26 | 珠江源昌花园 | 18218 | 1套 | 76 |
| 27 | 富力伯爵山 | 18539 | 1套 | 76 |
| 28 | 大岗翡翠蓝湾北区 | 13339 | 3套 | 72 |
| 29 | 南沙珠江湾 | 21697 | 1套 | 72 |
| 30 | 星河盛世 | 28219 | 4套 | 72 |
| 31 | 中大城 | 22356 | 0套 | 69 |
| 32 | 碧桂园海湾1号 | 24380 | 1套 | 67 |
| 33 | 珠光南沙御景 | 13245 | 5套 | 65 |
| 34 | 龙光棕榈水岸北区 | 26977 | 4套 | 64 |
| 35 | 富力天海湾 | 15775 | 2套 | 64 |
| 36 | 创鸿嘉园 | 18334 | 1套 | 61 |
| 37 | 优山美墅 | 19809 | 0套 | 60 |
| 38 | 优山悦海 | 21604 | 1套 | 58 |
| 39 | 海璟奥园 | 20108 | 2套 | 56 |
| 40 | 越秀滨海悦城 | 29380 | 1套 | 50 |
| 41 | 南沙湾东苑 | 29944 | 0套 | 50 |
二、90天成交套数最多的29个小区。
| 序号 | 小区名称 | 4月参考均价 | 90天成交数 |
| 1 | 时代南湾 | 24589 | 11 |
| 2 | 南沙碧桂园 | 17482 | 10 |
| 3 | 凯德新玥 | 13831 | 7 |
| 4 | 南沙碧桂园豪庭 | 21863 | 6 |
| 5 | 越秀滨海珺城 | 29134 | 5 |
| 6 | 广州星河丹堤 | 23561 | 5 |
| 7 | 珠光南沙御景 | 13245 | 5 |
| 8 | 南沙金茂湾 | 33195 | 4 |
| 9 | 南沙万达广场 | 7964 | 4 |
| 10 | 南沙境界家园 | 18690 | 4 |
| 11 | 阳光城丽景湾 | 17645 | 4 |
| 12 | 越秀滨海御城 | 28937 | 4 |
| 13 | 星河盛世 | 28219 | 4 |
| 14 | 龙光棕榈水岸北区 | 26977 | 4 |
| 15 | 滨海半岛 | 19436 | 4 |
| 16 | 越秀滨海隽城 | 24698 | 3 |
| 17 | 大岗翡翠蓝湾北区 | 13339 | 3 |
| 18 | 碧桂园天玺湾 | 24512 | 2 |
| 19 | 南沙奥园 | 16545 | 2 |
| 20 | 丰庭花园 | 19325 | 2 |
| 21 | 万科南方公元 | 20897 | 2 |
| 22 | 叠翠峰 | 31055 | 2 |
| 23 | 龙光棕榈水岸 | 27772 | 2 |
| 24 | 富力天海湾 | 15775 | 2 |
| 25 | 海璟奥园 | 20108 | 2 |
| 26 | 富佳花园 | 19517 | 2 |
| 27 | 明珠花园(南沙区) | 10439 | 2 |
| 28 | 云水雅苑 | 21161 | 2 |
| 29 | 大岗翡翠蓝湾东区 | 14076 | 2 |
三、爬虫代码
import xlrd
import xlwt
from xlutils.copy import copy
import requests
from lxml import etree
# 采集网页
def get_html(url, max_try_number=5):
#对它的结果进行判断,html_code = get_html(url) if html_code: article_urls = parse_detail(html) for article_url in article_urls:
try_num = 0
while True:
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
return response.text
return None
except Exception as e:
print(url, '抓取报错', e)
try_num += 1
if try_num >= max_try_number:
print('尝试失败{}次后,放弃尝试'.format(max_try_number))
return None
# 对网页内容进行解析
def get_url_list(html_code):
selector = etree.HTML(html_code)
title = selector.xpath('//div[@class="title"]/a/text()')
price = selector.xpath('//div[@class="totalPrice"]/span/text()')
saled = selector.xpath('//div[@class="info"]/div[2]/a[1]/text()')
on_sele = selector.xpath('//a[@class="totalSellCount"]/span/text()') #括号里最高级要用双引号。 #如果没找到,返回[]。如果找内容,后面也要加text()。如果要取图片url,用/img/@src
if len(title) > 0 and len(price) >0:
return (title, price,saled,on_sele)
else:
return None
def write_excel_xls_append(path, value):
workbook = xlrd.open_workbook(path) # 打开工作簿
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
rows_old = worksheet.nrows # 获取表格中已存在的数据的行数
new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格
for i in range(0, 1):
for j in range(0, len(value)):
new_worksheet.write(i+rows_old, j, value[j]) # 追加写入数据,注意是从i+rows_old行开始写入
new_workbook.save(path) # 保存工作簿
print("xls格式表格【追加】写入数据成功!")
def main(url):
html_code = get_html(url)
if html_code:
urls = get_url_list(html_code)
if urls:
print(urls[0])
zz=list(zip(urls[0],urls[1],urls[2],urls[3]))
for i in zz:
write_excel_xls_append("result.xls",i)
else:
print('列表页没取到数据')
if __name__ == '__main__':
for i in range(1,11):
url = "https://gz.lianjia.com/xiaoqu/nansha/pg{}/"
url = url.format(i)
print("{} crawling ......".format(url))
main(url)