Python爬⾍获取“房天下“房价数据(上)
上期博客我们通过Python爬⾍获取了京东商城的⼿机价格及其详细配置数据, 这期我们试着通过爬⾍在房天下()上获取乌鲁⽊齐的⼆⼿房信息, 同时利⽤之前已经测试过的坐标查询代码来获得每⼀个⼆⼿房的详细位置.
分析URL
进⼊⼆⼿房的销售列表, 其中包括房屋的售卖标题、户型、⾯积、楼层情况、朝向、建成年份、售价、位置等信息. 那么本期就先从房屋的基本属性开始爬取, 关于其详细信息的爬取会在(下)中给出.
进⼊开发者⼯具
不难看出, 存放这些信息的标签很容易就可以到, 那么就很容易了, 先给出结果:
import numpy as np
import matplotlib.pyplot as plt红字发票导入xml文件格式错误
import os
import pandas as pd
from bs4 import BeautifulSoup
import requests
邮件服务器端口
import time
headers ={
'User-Agent':
'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36' }
#xj.esf.fang/house/i31/  http example
#url = 'xj.esf.fang'
meanUrl ="xj.esf.fang/house/i31"
meanPage = (meanUrl, headers=headers)
print("页⾯状态码:{0}".format(meanPage.status_code))
soup = ,"html.parser")
tag = soup.find_all("script")[3]
a =str(tag).find("rfss")
var_t4 = meanUrl
var_t3 =str(text)[a:a +28]
newUrl = var_t4 +"?"+ var_t3
print("当前访问为 {0}:".format(newUrl))
newPage = (newUrl, headers=headers)
newSoup = ,"html.parser")
#print(newSoup)
fangData =[]
attrs =["户型","⾯积","楼层","朝向","建成时间","经纪⼈","地址","单价"]
df = pd.DataFrame(columns=attrs)
def process_bar(percent, start_str='', end_str='', total_length=0):
bar =''.join(京东python入门教程
["\033[31m%s\033[0m"%'  ']*int(percent * total_length))+''
bar ='\r'+ start_str + bar.ljust(total_length)+' {:0>4.1f}%|'.format(
percent *100)+ end_str
print(bar, end='', flush=True)
n =10
for i in range(n):
try:
p = newSoup.find_all("dl",{"class":"clearfix"})[i].dd.p  #⾸页信息
span = newSoup.find_all("p",{"class":"add_shop"})[i]#地址信息
info = place("\t","").replace("\n",
"").split("|")#信息汇总(list)
price = newSoup.find_all("dd",{"class":"price_right"})[i]#单价
info.append()
info.append(__)
jquery创建html标签time.sleep(0.5)
df.loc[i]= info
except:
passcriticise
end_str ='100%'
process_bar(i/(n-1), start_str='', end_str=end_str, total_length=15)
newDf = df.reset_index(drop=True)
print(newDf)
运⾏结果
代码中坐标查询部分可以查看我的这期博客: .
tips
需要注意的是我只爬取了第⼀页上的房价信息, ⽽在代码中给出URL则是xj.esf.fang/house/i31⽽不是开始提到的xj.esf.fang/
这是因为在测试代码的过程中, 我发现上述两个URL都指向第⼀页的内容, 但两者给出的商品房信息则是不尽相同的, 下图是xj.esf.fang/house/i31给出的内容(从第⼆条信息开始就不相同了)
tag = soup.find_all("script")[3]
a =str(tag).find("rfss")
var_t4 = meanUrl
var_t3 =str(text)[a:a +28]
newUrl = var_t4 +"?"+ var_t3
这样就能保证正确的访问我们需要的URL了
在爬取的过程中还存在着另外⼀个问题, 即有些标签内并不含有我们需要的信息, 导致find_all()⽆法返回结果就会报错, 所以我们采⽤try except的代码形式来跳过错误或不完整信息
try:
p = newSoup.find_all("dl",{"class":"clearfix"})[i].dd.p  #⾸页信息
span = newSoup.find_all("p",{"class":"add_shop"})[i]#地址信息
info = place("\t","").replace("\n",
"").split("|")#信息汇总(list)
price = newSoup.find_all("dd",{"class":"price_right"})[i]#单价
excel表格制作序号怎么拉出来全是1
info.append()
info.append(__)
time.sleep(0.5)
df.loc[i]= info
except:
pass
这虽然能保证代码的正常运⾏, 但跳过⼀些标签也导致了最后返回DataFrame时数据的索引并不是⽆间断排序的, 所以还需要加⼀段newDf = df.reset_index(drop=True)
⼀点说明
def process_bar(percent, start_str='', end_str='', total_length=0):
bar =''.join(
["\033[31m%s\033[0m"%'  ']*int(percent * total_length))+''
bar ='\r'+ start_str + bar.ljust(total_length)+' {:0>4.1f}%|'.format(
percent *100)+ end_str
print(bar, end='', flush=True)
这段代码是加⼊了爬取的进度条, 并不是出于美观, ⽽是⼤规模爬⾍时进度条能很快的反映程序有没有出错, 错误在哪⼀次循环, 好让我们快速的debug.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。