当前位置:
首页 > Python基础教程 >
-
适合初学者的Python爬取链家网教程
前言
文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者: TinaLY
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef
网上很多爬取教程,但是一般存在两个问题:
一是:自己调试会遇到很多bug,一般无法直接使用,对于调试代码有难度的来说比较抓狂;
二是:由于网页数据的格式不是完全规整的,寻找的代码块可能会遇到问题,所以需要设置一个异常抛出机制,以免前面爬取的数据没来得及保存,耗时耗力。
这次是根据自己的经验,提供小批量爬取的数据,能拆开的代码尽量拆开。
- 用的爬取结构,主要是selenium,网页会连续不断地打开。
- 以济南市为例,为了小规模测试,针对单个行政区分别获取,代码熟悉之后可将区改为循环。
代码如下:
关键包:
from selenium import webdriver
from urllib import request,parse
from selenium.common.exceptions import NoSuchElementException
定义参数(前三行是高德API获取坐标用得到,第四行是爬取的城市,一般网页链接接中会有):
amap_web_key = '你的key'
poi_search_url = "http://restapi.amap.com/v3/place/text"
poi_boundary_url = "https://ditu.amap.com/detail/get/detail"
city ='jinan'
关键代码:
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'}
driver1 = webdriver.Chrome()
pageid = 1
while(pageid <='页码数')://此处页码数是指进入某个区之后显示的页码数量
allarray = []
print('pageid =',pageid)
url ='https://jn.lianjia.com/xiaoqu/pingyin/pg'+str(pageid)
driver1.get(url)
driver1.implicitly_wait(5)
house_list =driver1.find_elements_by_class_name('img')
for i in range(house_list.__len__()):
time.sleep(2)
temparray =[]
detailurl = house_list[i].get_attribute('href')
print(i,'detailurl',detailurl)
driver = webdriver.Chrome()
driver.get(detailurl)
try:
housename =driver.find_element_by_class_name('detailTitle').text
price = driver.find_element_by_class_name('xiaoquUnitPrice').text
xiaoquinfo = driver.find_elements_by_class_name('xiaoquInfoContent')
# [占地面积,建筑面积,容积率,绿化率,停车位,楼栋总数,总户数,物业公司,物业费,物业描述,楼层状况]
xiaoquage = xiaoquinfo[0].text #建筑年代
jianzhuleixing = xiaoquinfo[1].text # 建筑类型
wuyefei = xiaoquinfo[2].text # 物业费用
dongshu = xiaoquinfo[5].text # 楼栋总数
hushu = xiaoquinfo[6].text #房屋总数
temparray.append(housename)
temparray.append(price)
temparray.append(jianzhuleixing) # 户数
temparray.append(wuyefei) # 物业费
temparray.append(dongshu) # 容积率
temparray.append(hushu) # 绿化率
# location = getpoi_page(temparray[0])//调用利用高德API获取坐标的函数
# 通过高德查询经纬度
//获得小区的最终目的要落到地图上,所以需要获得坐标点,高德开源API可以获得,但是
//由于一个key的查询数量有限,为了防止中间出错,建议先把所有房屋数据建立起来之后,
//统一查坐标,对于初学者,一切以简单易实现为主!
temparray.append('0')
temparray.append('0')
# if (location == ''):
# temparray.append('0')
# temparray.append('0')
# else:
# temparray.append(location[0])
# temparray.append(location[1])
# break
# print(temparray)
except NoSuchElementException as msg:
//异常抛出函数非常非常重要,虽然诸如淘宝、阿里巴巴等页面都有统一的HTML标签格式,
//但是有经验的童鞋应该知道,总会有那么一两个不按常规出牌的,如果异常抛出机制写
//不好,经常容易前功尽弃
# print("第",i,"个小区查找元素失败")
try:
housename = driver.find_element_by_class_name('detailTitle').text
price = driver.find_element_by_css_selector("[class='xiaoquPrice clear']").text
//对比上面的price可以看出,异常抛出是因为对于price属性出现了两种标签
xiaoquinfo = driver.find_elements_by_class_name('xiaoquInfoContent')
# [占地面积,建筑面积,容积率,绿化率,停车位,楼栋总数,总户数,物业公司,物业费,物业描述,楼层状况]
xiaoquage = xiaoquinfo[0].text # 建筑年代
jianzhuleixing = xiaoquinfo[1].text # 建筑类型
wuyefei = xiaoquinfo[2].text # 物业费用
dongshu = xiaoquinfo[5].text # 楼栋总数
hushu = xiaoquinfo[6].text # 房屋总数
temparray.append(housename)
temparray.append(price)
temparray.append(jianzhuleixing) # 户数
temparray.append(wuyefei) # 物业费
temparray.append(dongshu) # 容积率
temparray.append(hushu) # 绿化率
temparray.append('0')
temparray.append('0')
except NoSuchElementException as msg:
print("两种情况均查不到")
allarray.append(temparray)
driver.close()
text_save(allarray, 'lianjia_fangwu.txt')
pageid += 1
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式