德胜云资讯,添加一些关于程序相关的内容,仅供大家学习交流(https://www.wxclwl.com)

网站地图

搜索
德胜云咨询
后端分类 爬虫 网络安全 PHP SQL
热门标签:
最新标签:

爬虫网页图片运用Python抓取二手房价格与信息的两种常用方法python网络爬虫爬取图片没想到,

日期:2023/04/02 01:58作者:朱政廷人气:

导读:来源:数据STUDIO 作者:云朵君 最近房地产市场进一步收紧,多地地方政府出台各种收紧政策,以保证房地产健康发展,因此云朵君就想到运用Python网络爬虫,抓取部分房产信息,了解下最近房地产的情况。 接下来以房天下二手房信息,以获取某个城市各个区域二手房房产信息及价格,来一起学习下Python网络爬虫的基本...

来源:数据STUDIO

作者:云朵君

最近房地产市场进一步收紧,多地地方政府出台各种收紧政策,以保证房地产健康发展,因此云朵君就想到运用Python网络爬虫,抓取部分房产信息,了解下最近房地产的情况。

接下来以房天下二手房信息,以获取某个城市各个区域二手房房产信息及价格,来一起学习下Python网络爬虫的基本方法。

备注,本文仅以学习交流,对于爬虫浅尝辄止,以免对服务器增加负担。

一、BeautifulSoup解析数据

分析网站

运用谷歌浏览器开发者工具分析网站

#各区域网站地址如下规律https://cd.esf.fang.com/house-a0129/https://cd.esf.fang.com/house-a0130/https://cd.esf.fang.com/house-a0132/#每个区域不同页的网址规律https://cd.esf.fang.com/house-a0132/i32/https://cd.esf.fang.com/house-a0132/i33/https://cd.esf.fang.com/house-a0132/i34/#因此可定义网址形式如下baseurl =https://cd.esf.fang.com{}.format(regionhref)tailurl =i3{}/.format(page)url = baseurl + tailurl

网址获取

接下来重点获取regionhref, page可以循环获取。

html中找到所有区域及regionhref。

代码

from requestshtml import UserAgentimport requestsfrom bs4 import BeautifulSoupuseragent = UserAgent().randomurl =https://cd.esf.fang.com/res = requests.get(url, headers={"User-Agent": useragent})soup = BeautifulSoup(res.text, features=lxml)# 对html进行解析,完成初始化results = soup.findall(attrs={class:"clearfix choosescreen floatl"})regions = results[].findall(name=a)regionhreflist =[]regionnamelist =[]for region in regions: regionhreflist.append(region[href]) regionnamelist.append(region.text)

本次使用BeautifulSoup解析网页数据,获取regionhref及对应行政区域名称regionname。

获取数据

宏观分析

由于每个行政区域及其各页数据可重复循环获取,因此这里只介绍一个区域(青羊区)的第一页。

分析每条数据所存在的地方。

微观分析

查看每个信息所在的节点。

代码

import reregex = re.compile(\s(\S+)\s)results = soup.findall(attrs={class:clearfix,dataflag:"bg"})result = resultscontent = result.dd#获取项目简述title = regex.findall(content.h4.a.text),.join(title)>>>精装修套三,视野好#获取项目名称与地址name = regex.findall(content.findall(name=p, attrs={class:addshop})[].text)[]address = regex.findall(content.findall(name=p, attrs={class:addshop})[].text)[1]name>>>成都花园上城address>>>贝森-成都花园上城家园南街1号#获取项目描述,包括户型、区域、楼层、朝向、建筑年代describe = regex.findall(content.findall(name=p, attrs={class:telshop})[].text)describe>>>[3室2厅,,141.26,,中层(共22层),,西向,,2008年建,,杨斌]#获取优势标签labels = regex.findall(content.findall(name=p, attrs={class:clearfix label})[].text)labels>>>[距7号线东坡路站约830米]#获取价格prices = result.findall(name=dd, attrs={class:priceright})[].textprices>>>\n\n380万\n26900元/\n

其余部分只需要循环获取即可。

结果

import pandas as pddata = pd.readcsv("成都二手房青羊.csv")data.sample(5)

本次获取一个行政区共6027个二手房信息。

data.shape>>>(6027,13)

二、Selenium模拟浏览器

由于此网站监控较为严格,可利用selenium模拟浏览器一定程度上规避反爬机制。

分析网页的方法同上,但此次并不是循环请求网页获取网页数据,而是通过模拟浏览器操作,再通过Xpath获取数据。

导入并初始化浏览器驱动

import requestsfrom bs4 import BeautifulSoupfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expectedconditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitimport timefrom requestshtml import UserAgentfrom openpyxl import Workbookimport osimport jsonimport numpy as npdef init():"""初始化谷歌浏览器驱动:return:""" chromeoptions = webdriver.ChromeOptions()#不加载图片 prefs ={"profile.manageddefaultcontentsetting.images":2} chromeoptions.addexperimentaloption("prefs", prefs)#使用headless无界面浏览模式 chromeoptions.addargument(--headless) chromeoptions.addargument(--disable-gpu)#加载谷歌浏览器驱动 browser = webdriver.Chrome(options=chromeoptions, executablepath=chromedriver.exe) browser.get(https://cd.esf.fang.com/) wait = WebDriverWait(browser,10)# 最多等待十秒 wait.until(EC.presenceofelementlocated((By.CLASSNAME,screenal)))return browser

获取数据

按页获取数据

此方法是根据xpath路径获取数据。

contentlist = browser.findelementsbyxpath("//div[@class=shoplist shoplist4]/dl")contentlist

得到以 WebElement对象为元素的列表。

可通过遍历的方法遍历获取。

content = contentlist[]describe = content.findelementsbyxpath(dd)[].textprice = content.findelementsbyxpath(dd)[1].textrow =[describe, price, city]row

其中一天信息如下。

代码

def getpagecontent(browser, sheet, region):"""按页获取每页内容:param browser:浏览器驱动:param sheet: excel 工作表:param region:行政区域名称:return:""" contentlist = browser.findelementsbyxpath("//div[@class=shoplist shoplist4]/dl")for content in contentlist:try: describe = content.findelementsbyxpath(dd)[].text price = content.findelementsbyxpath(dd)[1].text row =[describe, price, region] sheet.append(row)except:passreturn browser, sheet

按行政区获取数据

def getregioncontent(browser, href, sheet, region):"""获取行政区域内容:param browser:谷歌浏览器驱动:param href:请求地址:param sheet: excel 工作表:param region:行政区域:return:""" print(f正在爬取{region}区.center(50,*)) browser.findelementbyxpath(f"//a[@href={href}]").click()#滑动到浏览器底部,已保证全部加载完成 browser.executescript(window.scrollTo(0,document.body.scrollHeight)) time.sleep(2)#重新滑动到浏览器顶部 browser.executescript(window.scrollTo(0,0)) wait = WebDriverWait(browser,15)# 最多等待十秒 wait.until(EC.presenceofelementlocated((By.CLASSNAME,pagebox))) browser, sheet = getpagecontent(browser, sheet, region) time.sleep(np.random.randint(10,15))#按页获取每一页的内容for page in range(2,101): print(f正在爬取{region}区的第{page}页.center(30,-))try: browser.findelementbyxpath(f"//a[@href={href}i3{page}/]").click() browser, sheet = getpagecontent(browser, sheet, region) time.sleep(np.random.randint(14,15))except:breakreturn browser, sheet

综合获取数据

def getcontent(): regionhreflist, regionnamelist = gethreflist()for ind, href in enumerate(regionhreflist): browser = init() region = regionnamelist[ind] wb = Workbook() sheet = wb.active sheet.title = region header =[描述,价格,行政区] sheet.append(header) browser, sheet = getregioncontent(browser, href, sheet, region) wb.save(f{region}.xlsx) print(f{region}.xlsx已经存储完毕.center(60,#)) time.sleep(np.random.randint(15,20)) browser.quit()

结果

获取数据后,可以对数据清洗并分析。

排行

网站地图

Copyright © 2002-2022 香港德胜云网络 版权所有 | 备案号:蜀ICP备2023007363号-5

声明: 本站内容全部来自互联网,非盈利性网站仅供学习交流