zoukankan      html  css  js  c++  java
  • 适合初学者的Python爬取链家网教程

    前言

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

    作者: TinaLY

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

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

    网上很多爬取教程,但是一般存在两个问题:

    一是:自己调试会遇到很多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
  • 相关阅读:
    DNS-PreFetch 技术及其他前端优化加载技术
    Windows10 睡死
    Dns Over Https(DoH) --- Windows10 预览版 19645
    原生JavaScript(JS)修改添加CSS样式表 (更好的性能)
    技术的本质
    工程设计
    文件分配表 FAT -WIKI
    博客皮肤修复: 行号和搜索引擎快照(基于 Cnblogs-Theme-SimpleMemory v1.3.3)
    java-知识点学习和补充
    红黑树01--[红黑树简介&添加修复]
  • 原文地址:https://www.cnblogs.com/Qqun821460695/p/11917940.html
Copyright © 2011-2022 走看看