好久没写代码了,今天有空写了一个爬虫,爬取了链家南沙小区二手房的简要数据(采集于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)