概述
文章目录
- 前言
- 一、基本库介绍
- 二、具体实现步骤
- 1.引入库和请求头的初始化
- 2.获取移动端接口的数据
- 3.存储和解析
- 4.获取多页数据
- 5.可视化数据
- 总结
前言
写过各种爬虫代码,但一直没有写过具体的实现过程,现分享一个简单的爬虫实现过程,其它复杂的爬虫也能举一反三,下面爬取的是一个售房网站
一、基本库介绍
安装: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。
最后
以上就是野性可乐为你收集整理的举一反三的贝壳网爬虫前言一、基本库介绍二、具体实现步骤总结的全部内容,希望文章能够帮你解决举一反三的贝壳网爬虫前言一、基本库介绍二、具体实现步骤总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复