适合初学者的Python爬取链家网教程

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理。css

做者: TinaLYweb

PS:若有须要Python学习资料的小伙伴能够加点击下方连接自行获取api

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef网络

网上不少爬取教程,可是通常存在两个问题:app

一是:本身调试会遇到不少bug,通常没法直接使用,对于调试代码有难度的来讲比较抓狂;函数

二是:因为网页数据的格式不是彻底规整的,寻找的代码块可能会遇到问题,因此须要设置一个异常抛出机制,以避免前面爬取的数据没来得及保存,耗时耗力。学习

此次是根据本身的经验,提供小批量爬取的数据,能拆开的代码尽可能拆开。测试

  • 用的爬取结构,主要是selenium,网页会接二连三地打开。ui

  • 以济南市为例,为了小规模测试,针对单个行政区分别获取,代码熟悉以后可将区改成循环。url

代码以下:

关键包:

1 from selenium import webdriver
2 from urllib import request,parse
3 from selenium.common.exceptions import NoSuchElementException

 

定义参数(前三行是高德API获取坐标用获得,第四行是爬取的城市,通常网页连接接中会有):

1 amap_web_key = '你的key'
2 poi_search_url = "http://restapi.amap.com/v3/place/text"
3 poi_boundary_url = "https://ditu.amap.com/detail/get/detail"
4 city ='jinan'

 

关键代码:

 1 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36'}
 2 driver1 = webdriver.Chrome()
 3 pageid = 1
 4 while(pageid <='页码数')://此处页码数是指进入某个区以后显示的页码数量
 5     allarray = []
 6     print('pageid =',pageid)
 7     url ='https://jn.lianjia.com/xiaoqu/pingyin/pg'+str(pageid)
 8     driver1.get(url)
 9     driver1.implicitly_wait(5)
10     house_list =driver1.find_elements_by_class_name('img')
11     for i in range(house_list.__len__()):
12         time.sleep(2)
13         temparray =[]
14         detailurl = house_list[i].get_attribute('href')
15         print(i,'detailurl',detailurl)
16         driver = webdriver.Chrome()
17         driver.get(detailurl)
18         try:
19             housename =driver.find_element_by_class_name('detailTitle').text
20             price = driver.find_element_by_class_name('xiaoquUnitPrice').text
21             xiaoquinfo = driver.find_elements_by_class_name('xiaoquInfoContent')
22             # [占地面积,建筑面积,容积率,绿化率,停车位,楼栋总数,总户数,物业公司,物业费,物业描述,楼层情况]
23             xiaoquage = xiaoquinfo[0].text  #建筑年代
24             jianzhuleixing = xiaoquinfo[1].text  # 建筑类型
25             wuyefei = xiaoquinfo[2].text  # 物业费用
26             dongshu = xiaoquinfo[5].text  # 楼栋总数
27             hushu = xiaoquinfo[6].text #房屋总数
28             temparray.append(housename)
29             temparray.append(price)
30             temparray.append(jianzhuleixing)  # 户数
31             temparray.append(wuyefei)  # 物业费
32             temparray.append(dongshu)  # 容积率
33             temparray.append(hushu)  # 绿化率
34             # location = getpoi_page(temparray[0])//调用利用高德API获取坐标的函数
35             # 经过高德查询经纬度      
36             //得到小区的最终目的要落到地图上,因此须要得到坐标点,高德开源API能够得到,可是
37             //因为一个key的查询数量有限,为了防止中间出错,建议先把全部房屋数据创建起来以后,
38             //统一查坐标,对于初学者,一切以简单易实现为主!
39             temparray.append('0')
40             temparray.append('0')
41             # if (location == ''):
42             #     temparray.append('0')
43             #     temparray.append('0')
44             # else:
45             #     temparray.append(location[0])
46             #     temparray.append(location[1])
47             # break
48             # print(temparray)
49         except NoSuchElementException as msg:
50             //异常抛出函数很是很是重要,虽然诸如淘宝、阿里巴巴等页面都有统一的HTML标签格式,
51             //可是有经验的童鞋应该知道,总会有那么一两个不按常规出牌的,若是异常抛出机制写
52             //很差,常常容易前功尽弃
53             # print("第",i,"个小区查找元素失败")
54             try:
55                 housename = driver.find_element_by_class_name('detailTitle').text
56 price = driver.find_element_by_css_selector("[class='xiaoquPrice clear']").text
57 //对比上面的price能够看出,异常抛出是由于对于price属性出现了两种标签
58 xiaoquinfo = driver.find_elements_by_class_name('xiaoquInfoContent')
59                 # [占地面积,建筑面积,容积率,绿化率,停车位,楼栋总数,总户数,物业公司,物业费,物业描述,楼层情况]
60                 xiaoquage = xiaoquinfo[0].text  # 建筑年代
61                 jianzhuleixing = xiaoquinfo[1].text  # 建筑类型
62                 wuyefei = xiaoquinfo[2].text  # 物业费用
63                 dongshu = xiaoquinfo[5].text  # 楼栋总数
64                 hushu = xiaoquinfo[6].text  # 房屋总数
65                 temparray.append(housename)
66                 temparray.append(price)
67                 temparray.append(jianzhuleixing)  # 户数
68                 temparray.append(wuyefei)  # 物业费
69                 temparray.append(dongshu)  # 容积率
70                 temparray.append(hushu)  # 绿化率
71                 temparray.append('0')
72                 temparray.append('0')
73             except NoSuchElementException as msg:
74                 print("两种状况均查不到")
75         allarray.append(temparray)
76         driver.close()
77     text_save(allarray, 'lianjia_fangwu.txt')
78 pageid += 1
相关文章
相关标签/搜索