我们首先查看爬取目标,下面是爬取目标的网页展示。
其次对所要爬取的数据进行结构观察,
可以看到所有的数据全部存储在class=‘sellListContent’下面的ul里,其对应的xpath路径为:/html/body/div[1]/div[4]/div[1]/div[4]/ul。在了解了该网页的信息结构以后,我们就可以进行爬虫程序的构建。
首先是对第一页进行爬虫设计,代码如下:
import time
import requests
from bs4 import BeautifulSoup as bs
import pandas
def text(page):
#此处调用函数,通过输入页数利用函数进行数据获取
url='https://sjz.ke.com/ershoufang/yuhua1/pg{}/'.format(page)
#请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36'
}
#利用bs4对网页进行解析
soup=requests.get(url=url,headers=headers)
save = soup.content.decode('utf-8')
shuju = bs(save, 'html.parser')
#利用select组合查询对房子标题所对应的位置进行查找
a=shuju.select('ul.sellListContent>li.clear>div>div>a') #房子标题
#利用select组合查询对房子小区名所对应的位置进行查找
b=shuju.select('ul.sellListContent>li.clear>div>div>div>div>a') #房子小区名
#利用select组合查询对房子特点所对应的位置进行查找
c=shuju.select('ul.sellListContent>li.clear>div>div.address>div.houseInfo')#房子特点
d=shuju.select('ul.sellListContent>li.clear>div>div.address>div.followInfo')#房子关注数以及几天前发布
#利用select组合查询对房价所对应的位置进行查找
e=shuju.select('ul.sellListContent>li.clear>div>div.address>div.priceInfo>div.totalPrice.totalPrice2>span')#房价
#利用select组合查询对房价单价对应的位置进行查找
f=shuju.select('ul.sellListContent>li.clear>div>div.address>div.priceInfo>div.unitPrice>span')#房价单价
#对每个房子对应的详情页链接位置进行获取
g=shuju.select('ul.sellListContent>li.clear>a.img.CLICKDATA.maidian-detail')#房子详情页url
#遍历并存储进title数列
for i in a:
title.append(i['title'])#提取title属性的值
#对小区名字进行存储
for i in b:
xiaoqu.append(i.get_text())#获取标签里的文本信息
#对特点进行存储
for i in c:
z=i.get_text().split()#对标签里的文本信息进行获取,并进行切割
str=''
#遍历切割获得的数列,对字符串进拼接
for j in z:
str += j
tedian.append(str)
#对发布时间以及关注人数进行存储
for i in d:
z=i.get_text().split()#同上进行切割存储
str = ''
for j in z:
str += j
xinxi.append(str)#发布信息时间以及关注人数
#对房子价格进行存储,存储形式为'200万'
for i in e:
price.append(i.get_text()+'万')
#对房子单价进行存储
for i in f:
uprice.append(i.get_text())
#对房子详情页的url链接进行存储
for i in g:
href.append(i['href'])
#将所获得的数据进行数据整合,首先将每个数据整合成一个字典对象,然后将字典对象存储进info数列
for a,b,c,d,e,f in zip(title,xiaoqu,tedian,xinxi,price,uprice):
z={
'title':a,
'xiaoqu':b,
'tedian':c,
'xinxi':d,
'price':e,
'uprice':f,
'href':g
}
info.append(z)
在对数据爬取完毕以后,我们则要将数据存储进csv文件,以便我们以后对信息进行查询,避免反复爬取。
主函数以及存储函数如下:
#存储csv所用函数
def save():
z = {'标题': title, '小区': xiaoqu, '特点': tedian, '信息': xinxi, '价格': price, '单价': uprice,'链接':href}
dm_file = pandas.DataFrame(z)
# dm_file.to_excel('Dongman.xlsx', sheet_name="动漫数据分析")
dm_file.to_csv("房价1.1.csv", encoding='utf-8-sig', index=True, index_label='序号')
#主函数
if __name__ == '__main__':#!!!!!!!!请先从此处开始程序!!!!!!!!
info=[]#每一页的房子信息总数列
title = []#标题数列
xiaoqu = []#小区名字数列
tedian = []#特点数列
xinxi = []#信息数列
price = []#房子价格数列
uprice = []#房子单价数列
xuhao=[]#存储序号数列
href=[]#房子详情页连接数列
z=input('请输入开始爬取页数:')
k=input('请输入结束爬取页数:')
for i in range(int(z),int(k)+1):
print('开始爬取{}页数据,请勿关机或停止该程序'.format(i))
try:
text(i)#此处调用text函数对数据进行爬取
print('第{}页已爬取完毕'.format(i))
time.sleep(5)#硬核休眠,避免因爬取频率过高而导致的banIP
except Exception as e:
print('错误为:'+e)
time.sleep(2)#在对单独一样存储完毕以后再次进行休息,以免被封
save()#触发save函数,将所爬取的数据存储进csv文件
print('信息已保存完毕,文件存储位置为当前程序所在文件夹,祝君开心')
爬取过程效果图:
爬取信息所得的csv文件效果:
希望能够对您有所帮助
本着分享代码的原则为大家免费下载,无需积分,点击此处进行下载资源跳转
2022-04-18更新:
项目上传到了GitHub,项目地址为:https://github.com/ZhuMengMeng666/KugouSpider