使用python和selenium+Chrome Headless爬取自如房间信息,并将结果存储在MongoDB中。其中最麻烦的应该是每间房的价格,因为自如是用一张图片和offset来显示价格,所以不能直接获得。但我们可以通过将图片转为文字,再通过偏移量将数字组合为价格。

在这里我们使用的是Chrome Headless而不是PhantomJS, 主要是因为前者不需要设置size大小,同时也更加稳定。因为PhantomJS总是会获取到跟原本元素标签不一样的值。该例子主要爬取的是深圳市南山区,地铁2号线,类型为友家合租房间信息。

在爬取信息时,如果能用逆向解析就最好用逆向解析,因为相比于用动态解析,前者更加的稳定。我们点进自如的网站,会发现每个链接不同的地方在地铁站的名字,所以在爬取时在固定链接后上地铁站名,就可以访问不同地铁站附近的房源。

其次是翻页,我们也能发现同样的规律。除了首页,其他页数都是跟在同样的链接后面。我们可以利用这个规律来进行翻页操作。

下面是具体的代码,对于价格的爬取,也就是文件getNumbers在python爬取自如房间信息(二)中可以看到

# -*- coding:utf-8 -*-
import time
import re
import getNumbers
import pymongo
from config import *
from urllib.request import urlretrieve
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclient = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]option = webdriver.ChromeOptions()
prefs = {'profile.managed.default_content_setting.images':2}
option.add_argument("headless")
option.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome('/Users/zhangxin/Downloads/chromedriver', chrome_options=option)wait = WebDriverWait(browser, 10)def get_picture(stationname, image_url, page):""" 获取图片 """picture_name = stationname + str(page) + 'ziroom.png'urlretrieve(url=image_url, filename='./data/'+picture_name)return picture_namedef get_file_content(file_path):""" 读取图片 """with open("./data/"+file_path, 'rb') as fp:return fp.read()def get_price(stationname, page = 1):html = browser.page_sourcepriceImage = re.compile('var ROOM_PRICE = (.*?);').search(html).group(1)priceImage = eval(priceImage)imageUrl = 'http:' + priceImage['image']imageOffset = priceImage['offset']imageFile = get_picture(stationname, imageUrl, page)print(imageFile)numbers = getNumbers.getNum("./data/"+imageFile)print(imageOffset)print(numbers)return numbers, imageOffsetdef get_rooms_info(newHandle, price):""":param newHandle: the browser page of each room:return: rooms: the information of a room"""browser.switch_to.window(newHandle)html = browser.page_source## html中存在xmlns属性,将此属性替换为空html = html.replace('xmlns="http://www.w3.org/1999/xhtml"','')print('getting the room information')#print(html)time.sleep(2)doc = pq(html)detail = doc('.room_detail_right .detail_room')## 去除<b></b>属性,这个会影响到children取text,但不会影响直接取textdetail('b').remove()#print(detail)new_detail = detail('ul').children()#print(new_detail[0].text)imagesUrl = []for item in doc('.lof-navigator-outer ul li .lidiv img').items():imagesUrl.append(item.attr('src'))rooms = {'roomname': doc('.room_name h2').text(),'images': imagesUrl,'price': price,'size': re.compile('(\d+.*?)').search(new_detail[0].text).group(1),'direction': new_detail[1].text,'structure': re.sub('\s','',new_detail[2].text),'floor': new_detail[3].text,'traffic': doc('.room_detail_right .detail_room .last').text().replace('\n', ' ')}print(rooms)save_to_mongo(rooms)## 获取总的房间
def get_rooms(stationname, page = 1):wait.until(EC.presence_of_element_located((By.ID, "houseList")))links = browser.find_elements_by_css_selector("#houseList .clearfix .txt h3 a")numbers, offsets = get_price(stationname, page)# print(links)count = 0for link in links:print(link.get_attribute('href'))## 当前窗口信息handle = browser.current_window_handle## 获取房间的价格offset = offsets[count]price = []for i in range(len(offset)):price.append(str(numbers[9 - offset[i]]))## 打开每一个房间的详细信息窗口link.click()time.sleep(2)## 所有窗口信息handles = browser.window_handlesfor newHandle in handles:if newHandle != handle:get_rooms_info(newHandle, "".join(price))browser.close()else:continue## 回到主窗口browser.switch_to.window(handle)count += 1### 翻页操作
def next_page(stationname, stationUrl, page = 1 ):try:# print('正在翻页:')browser.get(stationUrl+'?p='+str(page))print(stationUrl+'?p='+str(page))print("page:",page)get_rooms(stationname, page)except Exception:next_page(stationname, stationUrl , page)def get_page(i):### 选择具体的几个站stationUrl = STATION + i + ".html"print(stationUrl)browser.get(stationUrl)# 获取总的页数wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#page')))html = browser.page_sourcepages = re.compile('class="next".*?<span>\w(.*?)\w</span>').search(html).group(1)print('total pages:', pages)get_rooms(i)return pages, stationUrldef save_to_mongo(result):try:if db[MONGO_TABLE].insert(result):print('Save  Success!!!')except Exception:print('Fail')if __name__ == "__main__":for station in STATIONLIST:pages, stationUrl = get_page(station)for page in range(2, int(pages) + 1):next_page(station, page, stationUrl)

配置文件代码:

MONGO_URL = 'localhost'
MONGO_DB = 'ziroom'
MONGO_TABLE = 'rooms'SERVICE_ARGS = ['--disk-cache=true']STATION = "http://sz.ziroom.com/z/nl/z2-s2号线%28蛇口线%29-t"STATIONLIST = ["海上世界", "水湾", "东角头","湾厦","海月", "登良", "后海", "科苑"]

 

python爬取自如房间信息(一)相关推荐

  1. python爬取自如房间信息(二)

    主要是针对自如房价的爬取 .以下代码对房价图片进行处理,将里面的数字提取出来,然后用knn最近邻算法去对图片上的数据进行分类. import sys import cv2 import numpy a ...

  2. Python爬取自如租房信息(价格)笔记——笨办法

    爬取自如租房信息 最近正在学习python爬虫,顺便又要租房子,于是就想爬去自如上的租房信息顺便来联系一下. ·掉进价格的大坑里 在爬取过程中一切都听顺利的,可是到了最关键的房租部分就遇到了问题.居然 ...

  3. 用python爬取网站_「自如网」关于用python爬取自如网信息的价格问题(已解决) - seo实验室...

    自如网 ###这是一篇求助文,我能获取图片并变成字符串,但是无法获取位移量### 前两坛突发奇想想要爬取自如网的租房数据,本来以为能够请求+美丽+ re能全部搞定,没想到这个网站的反爬机制有点让我搞不 ...

  4. 关于用python爬取自如网信息的价格问题(已解决)

    ###这是一篇求助文,我能获取图片并变成字符串,但是无法获取位移量### 前两坛突发奇想想要爬取自如网的租房数据,本来以为能够请求+美丽+ re能全部搞定,没想到这个网站的反爬机制有点让我搞不定先贴个 ...

  5. php爬取房源,用python爬取二手房交易信息并进行分析

    用python爬取二手房交易信息并分析第一步:编写爬虫 爬取某平台上海市十个区共900条二手房的交易信息#爬取上海十个区的二手房价信息 import requests from bs4 import ...

  6. 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇

    项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否则后果自行 ...

  7. 2021最新python爬取12306列车信息自动抢票并自动识别验证码

    项目描述 项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否 ...

  8. python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master].注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一 ...

  9. python爬取12306列车信息自动抢票并自动识别验证码(二)selenium登录验证篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时 ...

最新文章

  1. 适合所有尺寸打印马赛克
  2. sql参数化还是被注入了_SQL注入是什么?
  3. pandas.DataFrame()的基本操作
  4. 转:Java并发编程与高并发解决方案(一)
  5. python 常量 模块_Python字符串模块的有用常量
  6. 害怕运维做到30岁还一事无成?你应该来这里看看
  7. 解决VsCode中C程序无法键盘输入的问题
  8. linux下查看mysql数据库的字段类型_系统运维|[小白技巧]如何在Linux上检查MySQL数据表的存储引擎类型...
  9. Intelligence System HDU - 3072(强连通分量)
  10. 结构可靠性分析中响应面方法的基本思想
  11. github上优秀的源码
  12. ubuntu22.04美化、办公、开发工具安装
  13. android:kotlin语言开发再也不用findViewById与ButterKnife
  14. 【OptiX】第6个示例 折射,玻璃材质
  15. 用一个小故事模拟Spring-Aop(三)--Advice适配器
  16. js 变量、函数重复声明和变量提升浅析
  17. 【Linux】必备故障及原因50个
  18. 半导体激光器——问题整理(一)
  19. 如何通过NLP人工智能大规模分析评论文本洞察消费者心声(干货)
  20. Windows打印的一些常用知识

热门文章

  1. 程序员应当正确突破英语障碍
  2. UE4制作星际天空球
  3. SparkSteaming运行流程分析以及CheckPoint操作
  4. python字典中的值不允许重复_python字典中值不允许重复的原因
  5. NVIDIA显卡驱动的安装失败
  6. 8个优秀的预训练模型,帮助您开始使用自然语言处理(NLP)
  7. python selenium 获取网页源代码
  8. Windows系统的正版与盗版
  9. idea Translation插件问题 TKK: 更新 TKK 失败,请检查网络连接解决办法
  10. Java内存大小换算