举一反三的贝壳网爬虫


前言

写过各种爬虫代码,但一直没有写过具体的实现过程,现分享一个简单的爬虫实现过程,其它复杂的爬虫也能举一反三,下面爬取的是一个售房网站


一、基本库介绍

安装:requests是python的一个三方扩展库,可用pip直接安装,或者手动在pypi下载后使用pip离线安装。
安装方法(安装python方法省略,这里默认你已经安装好python):

python3 -m pip  install requests, pyecharts, pandas

一般导入方法:

import requests

通常调试web页面使用浏览器自带的调试工具即可,
打开浏览器,按f12进入调试模式,查看网络请求栏的xhr请求,滚动页面,直到看到新的请求,这就是我们想要的url,找到变化规律即可,后面会用到。

二、具体实现步骤

1.引入库和请求头的初始化

引入常用库

import json
import requests
import pandas as pd

# 这里使用的是iphonex的请求头,移动端的API更容易解析
headers={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}

2.获取移动端接口的数据

请求移动端H5的接口

# 贝壳找房网的在售房源列表,最后的数字为变量
beike_url = "https://m.ke.com/sh/loupan/pg1/?_t=1&source=index"
res = requests.get(beike_url, headers=headers)

# 将json字符串转换成dict
res_context = json.loads(res.text)
print(res_context)

3.存储和解析

接下来开始解析数据和存储

# 获取结果列表
result_list = res_context['data']['body']['_resblock_list']
print(result_list)

# 保存数据到excel,由于这个列表里面都是有相似结构的dict,可以直接保存到excel
df = pd.DataFrame(result_list)
df.to_excel('fangchan.xlsx')
print(df)

保存成功之后即可在看到程序执行的目录下生成了一个xlsx文件,可用excel打开

4.获取多页数据

以上是基本的爬虫获取单页数据,但爬虫最主要的目的是批量获取数据,
接下来我门编写批量获取数据的代码:

# 基本的方法是找到url的规律,然后指定一个区间,使用for循环遍历
beike_url = "https://m.ke.com/sh/loupan/pg{}/?_t=1&source=index"

# 使用一个空列表用于缓存数据
result_list = []
error_counter = 0
for i in range(1, 1000):
	# 这里加一个异常判断,避免程序中断导致后续无法进行
	try:
		res = requests.get(beike_url.format(i), headers=headers)

		res_list = json.loads(res.text)['data']['body']['_resblock_list']
		print(beike_url, res_list)
		result_list+=res_list
	except Exception as e:
		error_counter += 1
		if error_counter >= 6:
			break
		continue

# 最后使用pandas存储数据到excel表格,先存储,避免后续程序崩溃数据丢失
df = pd.DataFrame(result_list)
df.to_excel('multi_fangchan.xlsx')

使用excel打开表格,显示如下:
在这里插入图片描述

5.可视化数据

读取数据,清洗数据(预处理数据,提取gps坐标和相关信息,去除干扰值)

import pandas as pd

df = pd.read_excel('multi_fangchan.xlsx')
# 获取名字和经纬度,最后的去除NaN的行使用dropna(axis=0)
gps_data = df.loc[:,['resblock_name', 'longitude', 'latitude', 'average_price']].dropna(axis=0)

# 生成gps列表,用于后续数据的数据填充
fangchan_gps_info = [(i, j, k) for i,j,k,l in gps_data.values]

使用pyecharts将坐标点可视化到地图上,最后会生成fangchan_analyse.html,使用浏览器打开即可,代码如下

from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType, SymbolType
import pandas as pd
import json
def add_address_json() -> Geo:
    # test_data_ = [("测试点1", 116.512885, 39.847469), ("测试点2", 125.155373, 42.933308), ("测试点3", 87.416029, 43.477086)]
    test_data_ = fangchan_gps_info
    count = [l for i,j,k,l in gps_data.values]
    address_ = []
    json_data = {}
    for ss in range(len(test_data_)):
        json_data[test_data_[ss][0]] = [test_data_[ss][1], test_data_[ss][2]]
        address_.append(test_data_[ss][0])
    
    json_str = json.dumps(json_data, ensure_ascii=False, indent=4)
    with open('test_data.json', 'w', encoding='utf-8') as json_file:
        json_file.write(json_str)
    
    c = (
        Geo()
        .add_schema(maptype="china") # 可以换成 world,或 china
        .add_coordinate_json(json_file='test_data.json') # 加入自定义的点
        # 为自定义的点添加属性
        .add("", data_pair =[list(z) for z in zip(address_, count)], symbol_size = 25, large_threshold = 400000, symbol="pin")
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts( visualmap_opts=opts.VisualMapOpts(max_ = 400000),title_opts=opts.TitleOpts(title="地理坐标数据可视化"))
        )
    return c
if __name__ == '__main__': 
    add_json = add_address_json()
    add_json.render(path="fangchan_analyse.html")

可视化结果如图所示,这里显示的是上海0-40万/平 的房价,由于房价差距太大,所以看起来青色居多,超高房价最高达到38万一平:
在这里插入图片描述


总结

简单介绍了一个基本爬虫的编写过程,
由于该站点没有明显的反爬措施,我们也没有使用复杂的反反爬措施,仅使用了移动浏览器的请求头,
但是一个高级的爬虫不仅限于此,
很多站点有反爬措施,会对IP的访问量进行限制,
这时候就需要使用代理IP进行访问了,
还有部分站点是动态渲染的,这时候就需要用到浏览器内核进行渲染才能得到想要的数据,甚至是需要反编译某些移动端APP。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值