requests库爬虫实例——房价

本次爬虫试图获得各个城市2015年-2021年每个月的房价均价情况

考虑到不同城市等级的城市房价可能存在明显差距,我们参考城市等级排名2022给所有城市划分等级

本次爬虫主要爬取一线、新一线、二线这三个级别城市的房价

本次爬虫主要使用requests库和BeautifulSoup库 

结果展示:

目录

1、引入需要的库

2、搭建爬虫模块

2.1 获取网页的源代码 

2.2 获取网页集合

 2.3 解析获取的网页

 2.4 衔接函数和处理爬虫报错

2.5 构建主函数,将数据写入csv文件

3、爬虫实际操作

1、引入需要的库

from bs4 import BeautifulSoup  
import requests 
import re
import csv

本次爬虫主要使用requests库获取网站的源代码,再通过BeautifulSoup库解析成文本,通过re库获取关键数据。

2、搭建爬虫模块

2.1 获取网页的源代码 

def getHtml(url): #定义获取网页信息的函数,输出为网页信息
    #伪装成浏览器
    headers = {'User-Agent': 'MMozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0)Gecko/20100101 Firefox/31.0'}  
    r = requests.get(url,headers=headers) 
    r.encoding= r.apparent_encoding
    return r.text 

说明:这个函数的作用非常简单,就是获取网址源代码,然后打印下来

2.2 获取网页集合

​
def urllist(x): #获取url列表的函数
    url="https://www.anjuke.com/fangjia/{}{}/"
    urllist=[url.format(m,n) for m in x for n in range(2015,2022)]
    return urllist

说明:为什么写这个函数呢?因为我们爬取的数据不在一个网页,我们需要爬取很多的网页才能获得这些数据,而这些网页的构成是有规律的,因此我们需要仔细观察之后写出来!!!

 因此,我们只需要给urllist函数一个城市代号列表,这个函数就可以直接生成众多的url供我们使用!!!

效果如下:

 2.3 解析获取的网页

def bsoup(url): #煲汤解析得到的源代码
    soup = BeautifulSoup( getHtml(url), 'lxml')
    a=soup.find_all(name="a", attrs = {'class':'nostyle'})#观察源代码,发现所要得到的数据格式
    b=soup.select('div[class="fjlist-box boxstyle2"]>h3') #发现a中没有城市名,查找源代码,发现城市名所在的部分
    cs=re.findall("年([\u4e00-\u9fa5]+)房价均价",b[0].text)#使用正则表达式获得城市名
    
    for i in range(len(a)):#发现a中是一年12个月的数据,使用循环获得一个月的数据
        b=a[i].text.strip().split("\n")#去除不需要的符号
        b.append(cs[0])#加上城市名
        #调整一下各个部分的顺序,
        didian=b[-1]
        shijian=b[0][0:-2]
        junjia=b[1][0:-3]
        bianhualv=b[2][0:-2]
        b[0]=shijian
        b[1]=didian
        b[2]=junjia
        b[3]=bianhualv
        #加入到l列表中,l列表成为了一个二元数组
        l.append(b)

说明:这段代码的功能主要是获取我们想要的内容,通过BeautifulSoup库解析源代码,通过三种方式最终获得我们需要的数据。通过for循环保存到列表中。

下面展示部分数据存在的源代码!

以北京市2020年12月房价均价为例,用F12查看网页源代码,找到网站中房价对应的代码,发现规律。

下面找到城市名称对应的源代码部分!

这里我使用的是正则表达式获得城市名称! 

 下面展示结果

 2.4 衔接函数和处理爬虫报错

def li(x):#定义一个函数,将煲汤模块和获取url列表模块粘在一起
    for url in urllist(x):
        #发现后面的程序可能报错,从而使该部分函数无法执行,采取try-except函数予以报错处理
        try:
            bsoup(url)
        except:
            continue#使用continue函数跳过报错的语句,继续对下一条url进行处理

说明:在实际操作时,我们发现这样一个问题:部分地区的某些时间的房价数据不存在,如果按照我们的代码直接执行,会使得函数发生错误而中断,为了克服这个问题带来的麻烦,我们使用try-except方法来处理报错,通过continue函数跳过报错的循环,直接执行下一次循环,完美解决了这个问题。

2.5 构建主函数,将数据写入csv文件

def main(x,name):#定义主函数,将获得的二维数组写入csv文件
    li(x)
    f = open(name, 'w', encoding='utf-8', newline="")
    headers=["时间","地点","均价","变化率"]#给csv文件加表头
    csv_write = csv.writer(f)
    csv_write.writerow(headers)
    for i in l:
        csv_write.writerow(i)#一行一行的写入
    f.close()

由此,爬虫框架构建完毕,下一步准备引入要爬虫的城市名列表,开始爬!!!

3、爬虫实际操作

这里我们根据城市等级进行分组爬虫,写入不同的csv文件!!!

#在百度上搜索城市等级排名2022,重点关注一线、新一线、二线
#在尝试爬取之后发现报错,查看原网址,发现有些城市不存在,逐一删去
#再次报错,发现有些城市使用首字母简写,有些使用全部拼音,逐一前往原网址核对
#大功告成,分别建立一线、欣一线、二线列表
yixian=["beijing","guangzhou"]
xinyixian=["hangzhou","suzhou","nanjing","chongqing","wuhan","tianjin","cs",\
           "xa","qd","zhengzhou","nb","foshan","dg","hf"]
erxian=["wuxi","xm","fz","jinan","sy","dalian","km","heb","cc","quanzhou","wenzhou","sjz","gy","nanning","nc",\
        "cz","zh","nantong","zh","yt","shaoxing","jx","huizhou","ty","tangshan","jinhua","weifang","taiz",\
       "zs","yangzhou","lanzhou"]

#对一线房价进行爬虫
l=[]
main(yixian,name="yixian.csv")
#对新一线房价进行爬虫
l=[]
main(xinyixian,name="xinyixian.csv")
#对二线房价进行爬虫
l=[]
main(erxian,name="erxian.csv")

值得一提的是,这里很多城市名用的是缩写,需要自己去查看网址确认,这一点比较麻烦,只能一个一个查找了!!!

感兴趣的同学可以自己引入三线、四线、五线城市继续爬取!!!

下一部分,我们将简单的进行可视化,本篇文章就到这里,谢谢各位看官!!!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西西弗斯推石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值