江寓租房挂牌房源信息获取

  • 背景
  • 何为Ajax技术
  • 如何破解
  • 完整代码
  • 代码解读
  • 报错及解决办法
  • 免责申明

背景

之前爬取的都只能算静态网页,这次的江寓却变成动态的,而动态网址主要采用了Ajax加载技术,当你翻页的时候,你会发现地址栏的url都不变http://www.jiangroom.com/queryRooms.html

何为Ajax技术

Ajax是Asynchronous JavaScript and XML的缩写,翻译成异步的 JavaScript 和 XML技术,Ajax不是新的编程语言,而是一种网页加载新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。Ajax技术的核心是XMLHttpRequest对象(简称XHR),可以通过使用XHR对象获取到服务器的数据,然后再通过DOM(Document Object Model)将数据插入到页面中呈现。虽然名字中包含XML,但Ajax通讯与数据格式无关,所以我们的数据格式可以是XML或JSON等格式。

如何破解

F12打开开发者模式,Ctrl+R刷新后点击Network,选择XHR,发现请求网页为
http://www.jiangroom.com/queryRoomsAsync?offset=0
然后回原网页点击第2页的时候,会发现
http://www.jiangroom.com/queryRoomsAsync?offset=12
可以推测offset是网页的参数,回原网页点击第3页的时候,变成了
http://www.jiangroom.com/queryRoomsAsync?offset=24

验证了每翻一页,offset增加12,可以推定offset为网页的偏移量,有了网页偏移量参数就可以利用来构造全部一级网页

def generate_pages(num): #构造所有一级网址start_url="http://www.jiangroom.com/queryRoomsAsync?offset={}" #起始网址for i in range(0,num,12): #每个offset步长为12yield start_url.format(i)

既然能够把所以一级网页构造出来,那么就可以从一级网页进入二级网页,在二级网页抓取所需字段。

完整代码

# -*- coding: utf-8 -*-
"""
Created on Fri Aug  2 10:00:46 2019
title:jiangroom
@author: 帅帅de三叔
"""
import requests #导入网页请求模块
import time #导入时间模块
import json #导入json模块
from bs4 import BeautifulSoup #导入网页解析模块
import pymysql #导入数据框模块
header={"User-Agent":"Mozilla/5.0(Windos NT 6.1) AppleWebKit/537.36 (KHTML, like(Gecko) Chrome/75.0.3770.142 Safari/537.36)"} #构造请求头print("start connecting database jiangroom……\n")
db=pymysql.connect("localhost","root","123456","jiangroom",charset='utf8') #链接数据库
cursor=db.cursor()#获取游标
cursor.execute("drop table if exists jiangroom_wh") #重写方式
print("start creating table jiangroom_wh in database jiangroom\n")
c_sql="""create table jiangroom_wh(title varchar(30),area varchar(5),price varchar(8),house_type varchar(8),towards varchar(6),floor varchar(6), address varchar(30),code varchar(20))ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8"""
cursor.execute(c_sql) #执行建表操作
print("table jiangroom_wh has been created") def generate_pages(num): #构造所有一级网址start_url="http://www.jiangroom.com/queryRoomsAsync?offset={}" #起始网址for i in range(0,num,12): #每个offset步长为12yield start_url.format(i)      def get_items(generate_pages): #构造详情页进入详情页获取详情字段session=requests.session() #建立请求会话answer=session.post(generate_pages) #post发出请求#print(answer.text)soup=BeautifulSoup(answer.text,'lxml') #解析网页#print(soup)house_info=soup.find("p").get_text()#房间id值house_info=json.loads(house_info) #jsonload将json格式转化为python的列表格式link="http://www.jiangroom.com/roomDetail?id="for house in house_info:detail_url=link+str(house["id"]) #构造房源详情页print(detail_url) #打印详情页response=requests.get(detail_url,headers=header) #get发出请求time.sleep(1) #进程挂起1秒soup=BeautifulSoup(response.text,"lxml") #解析详情页title=soup.find("div",class_="roomDetails").find("h5",class_="building").get_text() #房源名称address=soup.find("div",class_="roomDetails").find("p",class_="address").get_text().replace("位置:","") #详细地址price=soup.find("div",class_="roomDetails").find("span",class_="price").get_text().replace("¥","") #房价floor=soup.find("div",class_="roomDetails").find("ul",class_="details").findAll("li")[0].find("span",class_="val").get_text().replace("层","") #楼层area=soup.find("div",class_="roomDetails").find("ul",class_="details").findAll("li")[1].find("span",class_="val").get_text() #面积house_type=soup.find("div",class_="roomDetails").find("ul",class_="details").findAll("li")[3].find("span",class_="val").get_text() #房型towards=soup.find("div",class_="roomDetails").find("ul",class_="details").findAll("li")[2].find("span",class_="val").get_text() #朝向code=soup.find("div",class_="roomDetails").find("div",class_="room_num clearfix").find("p",class_="num").find("span").get_text() #编号print(title,code,area,price,house_type,towards,floor,address) #打印详细字段insert_data=("INSERT INTO jiangroom_wh(title,code,area,price,house_type,towards,floor,address)""VALUES(%s,%s,%s,%s,%s,%s,%s,%s)") #控制插入格式jiangroom_data=([title,code,area,price,house_type,towards,floor,address]) #执行插入操作cursor.execute(insert_data,jiangroom_data) #执行插入操作db.commit()#主动提交if __name__=="__main__":num=12*int(input("please input the total pages:")) #输入总的网页数,offset的步长为12for url in generate_pages(num): #对所有的一级网页循环get_items(url) #调用获取详情字段函数

代码解读

整个过程可以分为三步,第一步通过函数generate_pages构造出所有的一级网页,第二步通过post请求在一级网页抓取房源的id,根据房源id值字符串拼接技术 link+str(house[“id”]) 构造房源的详情页,然后进入详情页抓取所需字段,最后存入到数据库,整个过程一气呵成。

报错及解决办法

在写入mysql的时候如果报错

  DataError: (1406, "Data too long for column 'community' at row 1")

可以在在mysql命令里面执行下面语句

SET @@global.sql_mode= '';

免责申明

Python爬虫仅为学习交流,如有冒犯,请告知删。

延申阅读
青客公寓挂牌房源分城市爬取
优客逸家挂牌房源爬取
建方公寓挂牌房源信息爬取

江寓租房挂牌房源信息相关推荐

  1. 建方公寓挂牌房源信息爬取

    爬取建方公寓挂牌房源信息 背景 完整代码 后话 背景 自从青客公寓分城市挂牌房源和优客逸家挂牌房源爬取之后,发现爬虫也挺有趣的,于是今天又拿建方公寓练手,差点栽跟头了,且听我慢慢道来.有前两次爬虫经验 ...

  2. 第5篇-分析北京租房的房源信息

    提前声明:该专栏涉及的所有案例均为学习使用,如有侵权,请联系本人删帖! 文章目录 一.前言 二.网站分析 三.代码编写 一.前言 最近北京的房租是越来越贵了,钱包的钱有点不够呀 因此觉得把北京租房的房 ...

  3. python找房源_Python租房信息分析!找到最适合自己的房源信息!

    原标题:Python租房信息分析!找到最适合自己的房源信息! 租房信息分析 import numpy as np import pandas as pd import matplotlib.pyplo ...

  4. Flask爱家租房--房屋管理(获取房东发布的房源信息条目)

    文章目录 0.效果展示 1.重点总结 2.后端代码 3.前端html 4.前端js 0.效果展示 1.重点总结 1)用户点击"我的房源",页面开始加载,此时myhouse.js限定 ...

  5. 爬取链家所有房源信息(在售、成交、租房)

    环境:Windows10+Anaconda python3.6.5+Spyder 目标:抓取链家北京地区所有房源信息. 打开链家官网 https://bj.lianjia.com/ .粗略的浏览了一下 ...

  6. 为了在上海租房,我用python连夜爬了20000多条房源信息

    文 | 派森酱 来源:Python 技术「ID: pythonall」 最近由于工作突然变动,新的办公地点离现在的住处很远,必须要换房子租了. 我坐上中介的小电驴,开始探索城市各处的陌生角落. 在各个 ...

  7. 如何高效地爬取链家的房源信息(四)

    "Python实现的链家网站的爬虫第四部分,最后一部分." 本系列文将以链家南京站为例,使用Python实现链家二手房源信息的爬虫,将数据爬取,并存入数据库中,以便使用. 本系列第 ...

  8. 如何高效地爬取链家的房源信息(三)

    "Python实现的链家网站的爬虫第三部分." 本系列文将以链家南京站为例,使用Python实现链家二手房源信息的爬虫,将数据爬取,并存入数据库中,以便使用. 本系列第一部分为基础 ...

  9. 如何高效地爬取链家的房源信息(一)

    "Python实现的链家网站的爬虫第一部分." 在之前的文章,以链家成都站为例,分析过链家网站数据的爬取,文章如下: 干货!链家二手房数据抓取及内容解析要点 但是,当时没有根据分析 ...

最新文章

  1. oracle本地连接地址,关于Oracle本地连接出现与监听有关的问题的解决方法探讨,oracle本地连接...
  2. MyBatis学习总结(1)——MyBatis快速入门
  3. MybatisPlus中使用通用CRUD实现插入操作
  4. Hello Kubernetes快速交互实验手册
  5. 7-8垃圾箱分布_您认为有关垃圾收集的7件事-完全错了
  6. C 常用新特性(上)
  7. php使用curl实现get和post请求的方法,数据传输urldecode和json
  8. jenkins java版本_安装jenkins几个版本貌似都有问题
  9. 程序员:请不要对我的代码指手画脚!
  10. $.ajax 简单记录
  11. 【Linux】makefile文件基础
  12. 【转】你用什么手机,你就是什么人品!!
  13. docker安装oracle11g史上最全步骤(带图文)
  14. 一网打尽,音乐高手都在使用的打谱软件不藏私推荐
  15. 找不到任何设备驱动程序.请确保安装介质_win10安装完全手册,详细全面,新手必备...
  16. 如何选择DDoS防御服务器
  17. Interactive Speech and Noise Modeling for Speech Enhancement
  18. 【机器学习】课程设计布置:某闯关类手游用户流失预测
  19. sasl java_SASL协议java实现
  20. 响铃:“头号玩家”乐车邦,恰恰踩到了“无人”的点上

热门文章

  1. 【AUTOSAR-E2E】-1.1-End-to-End通信保护介绍(Functional Safety功能安全相关)
  2. kubesphere 随笔
  3. 给定直线参数在二维散点数据上绘制直线(Python)
  4. 零基础自学3D游戏建模必备,从入门到精通
  5. 与数论的厮守02:整数的因子分解—Pollard_Rho
  6. 在微型计算机中把数据传送到软盘上称为,计算机应用基础知识测试
  7. 微信小程序bug记录
  8. Android 格式化字符串
  9. dell1420电脑故障问题
  10. 抖音跳转微信小程序源码