Python爬取公交车数据(一):Requests+JSON网络站点爬取8684公交站点公交站台数据
程序员文章站
2022-04-26 11:25:55
...
爬取内容分析
我们首先打开8684手机网页端
在这里,我输入了B22并准备点击查询,在此之前记得打开开发者模式看一下网页的请求
我们已经成功请求到了数据
在开发者模式中,我们可以看到它是使用get方法获取数据的
可以看到这里的headers没有cookies,说明我们不用将cookies给放进去救可以爬取了,还要注意的就是我们的headers,将这两个放进我们的代码中并请求便可以获取数据了
爬取代码实现
代码
首先呢我们来创建一个headers的处理函数
def GetHeaders(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
'referer': url,
'Accept-Language': 'zh-CN,zh;q=0.9',
}
return headers
之后导入requests库,并输入以下函数
def Get8684BUS(url):
rst = requests.get(url,headers = GetHeaders(url))
rst = rst.text
rst = rst.encode('utf-8').decode('unicode_escape')
return rst
最后调用,并保存代码
rst =Get8684BUS("https://api.8684.cn/bus_station_map_station.php?code=1dc114c2&ecity=guangzhou&kind=1")
with open("./8684BUS.txt","w+") as f:
f.write(rst)
运行结果
清洗代码实现
代码
如果上一步实验没有成功的,可以用蓝奏云文件下载后实现这一步骤
我们首先导入json库
def Get8684MSG(msg):
test = json.loads(msg)
code = test.get("error_code")
message = test.get("error_message")
data = test.get("data")
return code,message,data
这样我们就成功分离了其中的模块
接下来我们来分离data中的数据
def QXData(msg):
for i in msg:
lng = i.get("lng")#经度
lat = i.get("lat")#纬度
pm = i.get("pm")#站台
t_name = i.get("t_name")#站台名称
print(str(lng),str(lat),str(pm),t_name,sep = "---")
在这里呢,因为想不到好的处理方法,便直接打印这一个在控制台输出了
实现效果
那么运行结果就如上图所示啦
完整代码
8684BUS.py
import requests
import json
def GetHeaders(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
'referer': url,
'Accept-Language': 'zh-CN,zh;q=0.9',
}
return headers
def Get8684BUS(url):
rst = requests.get(url,headers = GetHeaders(url))
rst = rst.text
rst = rst.encode('utf-8').decode('unicode_escape')
return rst
def Get8684MSG(msg):
test = json.loads(msg)
code = test.get("error_code")
message = test.get("error_message")
data = test.get("data")
return code,message,data
def QXData(msg):
for i in msg:
lng = i.get("lng")#经度
lat = i.get("lat")#纬度
pm = i.get("pm")#站台
t_name = i.get("t_name")#站台名称
print(str(lng),str(lat),str(pm),t_name,sep = "---")
rst =Get8684BUS("https://api.8684.cn/bus_station_map_station.php?code=1dc114c2&ecity=guangzhou&kind=1")
with open("./8684BUS.txt","w+") as f:
f.write(rst)
code,message,data = Get8684MSG(rst)
print(code,message)
QXData(data)