前言

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

作者: 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('')
temparray.append('')
# 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('')
temparray.append('')
except NoSuchElementException as msg:
print("两种情况均查不到")
allarray.append(temparray)
driver.close()
text_save(allarray, 'lianjia_fangwu.txt')
pageid += 1

适合初学者的Python爬取链家网教程的更多相关文章

  1. Scrapy实战篇(一)之爬取链家网成交房源数据(上)

    今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据. 这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便. ...

  2. Python的scrapy之爬取链家网房价信息并保存到本地

    因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ​ 爬虫结构: ​ 其中封装了一个数据库处理模 ...

  3. Python爬取链家二手房源信息

    爬取链家网站二手房房源信息,第一次做,仅供参考,要用scrapy.   import scrapy,pypinyin,requests import bs4 from ..items import L ...

  4. Scrapy实战篇(二)之爬取链家网成交房源数据(下)

    在上一小节中,我们已经提取到了房源的具体信息,这一节中,我们主要是对提取到的数据进行后续的处理,以及进行相关的设置. 数据处理 我们这里以把数据存储到mongo数据库为例.编写pipelines.py ...

  5. Scrapy实战篇(九)之爬取链家网天津租房数据

    以后有可能会在天津租房子,所以想将链家网上面天津的租房数据抓下来,以供分析使用. 思路: 1.以初始链接https://tj.lianjia.com/zufang/rt200600000001/?sh ...

  6. python爬取链家二手房信息,确认过眼神我是买不起的人

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  7. python - 爬虫入门练习 爬取链家网二手房信息

    import requests from bs4 import BeautifulSoup import sqlite3 conn = sqlite3.connect("test.db&qu ...

  8. python 爬取链家

    import json import requests from lxml import etree from time import sleep url = "https://sz.lia ...

  9. 爬取链家网租房图 使用ImagesPipeline保存图片

    # 爬虫文件 # -*- coding: utf-8 -*- import scrapy import os from urllib import request from lianjia.items ...

随机推荐

  1. EF中存储过程的使用

    存储过程即用来完成一个特定功能的一段代码.它的优缺点 优点 存储过程可封装,并隐藏复杂的商业逻辑. 存储过程可以回传值,并可以接受参数. 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与 ...

  2. 一起学Android之音频视频

    概述 Android多媒体框架支持各种常见的媒体类型,可以很容易地将音频.视频和图像集成到App中.通过MediaPlayer Api,可以从应用程序资源(RAW).文件系统或网络上数据流资源来播放音 ...

  3. MySQL逻辑控制语句的使用

    一.IF语句     1).   IF(expr1,expr2,expr3) 如果expr1为true则结果为expr2否则为expr3 -->相当于三元运算符                  ...

  4. 创建线程之三:实现Callable接口

    通过Callable和Future创建线程 i. 创建Callable接口的实现类,并实现call方法,该call方法将作为线程执行体,并且有返回值,可以抛出异常. ii. 创建Callable实现类 ...

  5. 关于mybtis 使用过程中发生There is no getter for property named 'id' in class 'java.lang.String' 错误

    今天在修改一个关于mybtis语句时,偶然发现的一个错误  There is no getter for property named 'id' in class 'java.lang.String' ...

  6. 使用Settings sync同步VS Code配置

    使用Settings sync同步VS Code配置 因为要在多台电脑上使用VSCode,想要简单地管理VSCode地配置,不用每次手动去一一配置,保持多个开发环境的同步,于是使用Settings s ...

  7. 框架用多了真的会死人的,spring-cloud全家桶与mybitais 集成完整示例(附下载)

    ​ 题外话: 看到这一长串包含各种技术名词的标题,一路走来感觉研发深深的被各种框架给绑架了,从我们刚出生最简单的jsp,servlet打天下,到spring mvc的盛行,再到现在spring-boo ...

  8. Druid-类图-属性表

    所属文章:池化技术(一)Druid是如何管理数据库连接的? 本篇为「工具人」文章,建议直接用「ctrl+f」进行查找属性.方法.类名,快速了解其含义和所属类. 主要流程里主要涉及到的类名称.类属性.类 ...

  9. 16.输入密码查看 flag

    直接进行burpsuite 的 intruder 爆破模块进行爆破, 得到密码为 13579. 输入进去得到flag

  10. mock 模拟数据在框架中的简单使用

    首先在框架中需要安装mock模块 cnpm i mockjs -S 其次在src文件夹下新建mock文件夹,在mock文件夹中新建一个index.js文件 代码如下: const Mock = req ...