适合初学者的Python爬取链家网教程
程序员文章站
2022-12-21 13:22:16
前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者: TinaLY PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cc ......
文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者: tinaly
ps:如有需要python学习资料的小伙伴可以加点击下方链接自行获取
网上很多爬取教程,但是一般存在两个问题:
一是:自己调试会遇到很多bug,一般无法直接使用,对于调试代码有难度的来说比较抓狂;
这次是根据自己的经验,提供小批量爬取的数据,能拆开的代码尽量拆开。
-
用的爬取结构,主要是selenium,网页会连续不断地打开。
-
以济南市为例,为了小规模测试,针对单个行政区分别获取,代码熟悉之后可将区改为循环。
代码如下:
关键包:
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
上一篇: Go 自定义类型来实现枚举类型限制
下一篇: PHP操作Redis数据库常用方法