Python对城市距离自动化爬取【python小型项目】( 四 )


参考文件:
作为老牌库,在中一般都搜索的到,参数的说明不过多的赘述 。
因为我的代码都是用 utf-8 写的所以在配置时,加入了 utf-8 的信息 。
result={'code':'9999','message':'执行批量插入异常','data':[]}print ("数据库错误|insert_data : %s" % (e.args[0]))logging.basicConfig(stream=open(config.src_path + '/log/syserror.log', encoding="utf-8", mode="a"), level = logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')logger = logging.getLogger(__name__)logger.exception(e)
测试爬取网站
测试网站是否可以传参进行 post,获取后的两地的地理距离
通过测试 ,设置测试地点洪山区和江夏区,网站显示距离为 16.5 公里
解析 html 发现
测试结果:网站的数据是通过 js 文件获取传参的 。
var map = new BMap.Map("container");map.centerAndZoom(new BMap.Point(116.404, 39.915), 14);var oGl = document.getElementById("div_gongli");var ofname = document.getElementById("tbxArea");var otname = document.getElementById("tbxAreaTo");if (ofname.value != "" && otname.value != "") {var output = "全程:";var searchComplete = function(results) {if (transit.getStatus() != BMAP_STATUS_SUCCESS) {return;}var plan = results.getPlan(0);output += plan.getDistance(true); //获取距离output += "/";output += plan.getDuration(true); //获取时间}var transit = new BMap.DrivingRoute(map, {renderOptions: {map: map,panel: "results",autoViewport: true},onSearchComplete: searchComplete,onPolylinesSet: function() {oGl.innerText = output;}});transit.search(ofname.value, otname.value);}...
我们查看网站加载的 js 文件,发现获取 Bmap 这个对象原来是来自于
https://api.map.baidu.com/?qt=nav&c=131&sn=2%24%24%24%24%24%24%E6%B4%AA%E5%B1%B1%E5%8C%BA%24%240%24%24%24%24&en=2%24%24%24%24%24%24%E6%B1%9F%E5%A4%8F%E5%8C%BA%24%240%24%24%24%24&sy=0&ie=utf-8&oue=1&fromproduct=jsapi&res=api&callback=BMap._rd._cbk35162&ak=zS6eHWhoEwXMUrQKkaaTlvY65XsVykFf
很明显,这个网站也是调用的百度的 api 。
我们查看 js 文件传递的部分参数:
content: {dis: 16538,…}dis: 16538kps: [{a: 7, dr: "", dw: 0, ett: 17, ic: "", iw: 0, pt: ".=zl83LBgOCJVA;", rt: 1, tt: 1},…]rss: [{d: 0, g: "", n: "", rr: 0, t: 0, tr: 0},…]taxi: {detail: [{desc: "白天(05:00-23:00)", kmPrice: "2.3", startPrice: "14.0", totalPrice: "47"},…],…}time: 1516toll: 0...
核实里的 dis 和 time 是否就是网站显示的距离和时间
当我们更换测试地点后,显示的距离和中的内容一样
time:1516%60=25.?,和显示的 26 分钟也是核对的 。
测试结果:网站没有反爬虫机制,但是调用的是百度地图 pai 获取数 。
创建接口 - 调用高德地图 api
在高德的管理平台注册个人开发:

Python对城市距离自动化爬取【python小型项目】

文章插图
申请个人的 key 。每日调用量有上线,所以只能一点点的做 。
我们将申请到的 key 写入配置信息文件中:
/.py
【Python对城市距离自动化爬取【python小型项目】】#!/usr/bin/python# -*- coding: utf-8 -*-#__author__: stray_camelimport os,sys#当前package所在目录的上级目录src_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))geo_key = '3e2235273ddtestdef4'#key我已经打马赛克了,请自己去申请
完成功能:
通过地域名查询经纬度;
对出发 / 目的地点 - 路程 - 路线,数据进行查询,并插入到数据库中,现已实现 。但对于数据量较多的情况,数据库的操作较慢 。
首先前往高德地图注册个人用户,获取一个 key,之后我们可以通过构造 url,通过来获取数据 。