前言

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

作者: 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. Exe4j 打包: this executable was created with an evaluation version of exe4j

    异常 this executable was created with an evaluation version of exe4j   异常.png 问题原因 当前打包使用exe4j未授权 解决方法 ...

  2. 上海街头灵魂摄影师:勤劳de小懒熊

    上海中年大叔,街头摄影师,眼光比较独特,题材不限于: 酒吧晚上醉酒躺尸的.喝多亲嘴的.拉拉les的.流泪告别的.地铁露肉的.短裤露沟的. 尺度不大,但比较真实,艺术来源于生活,比那些摆拍的有意思. 大 ...

  3. 程序员修神之路--redis做分布式锁可能不那么简单

    菜菜哥,复联四上映了,要不要一起去看看? 又想骗我电影票,对不对? 呵呵,想去看了叫我呀 看来你工作不饱和呀 哪有,这两天我刚基于redis写了一个分布式锁,很简单 不管你基于什么做分布式锁,你觉得很 ...

  4. spark log4j 日志配置

    现在我们介绍spark (streaming) job独立配置的log4j的方法,通过查看官方文档,要为应用主程序(即driver端)或执行程序使(即executor端)自定义log4j配置,需要两步 ...

  5. 周会材料:高并发程序设计<一>

    第一章 几个概念 同步:一次方法调用须等到其返回后才能有后续 异步:一次方法调用后在另一线程执行,调用者可不必等其返回就可进行后续 并发:任务以极短的时间交替进行 并行:任务同时进行 临界区:公共资源 ...

  6. linux远程登入/远程上传文件

    一.远程登入 1.安装 Xshell5 2.查看是否具备连接 在linux 主机上输入 chkconfig --list | grep sshd #sshd 0:关闭 1:关闭 2:启用 3:启用 4 ...

  7. Playbook剧本小结

    1.Playbook剧本小结 1.什么是playbook,playbook翻译过来就是"剧本",那playbook组成如下 play: 定义的是主机的角色task: 定义的是具体执 ...

  8. iozone - a filesystem benchmark tool 主要是用来测试文件系统 性能

    简介:    磁盘设备之上是文件系统,测试磁盘的工具往往就是调用块设备驱动的接口进行读写测试.而文件系统的测试软件就是针对文件系统层提供的功能进行测试,包括文件的打开关闭速度以及顺序读写随机位置读写的 ...

  9. [PHP] 解决php中上传大文件的错误

    修改nginx配置文件,下面这个参数client_max_body_size 110M; 修改php配置文件中下面两个参数在php.ini中找到下面两个配置,配置项给改大,如果找不到php.ini的位 ...

  10. Java学习笔记(8)---Scanner类,浅谈继承

    1.Scanner类: a.定义: java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. Scanner s = new Scanner(S ...