Foundations of Python Network Programing,Third Edition 《python网络编程》,本书中的代码可在Github上搜索fopnp下载

本书的第一章中使用到了google地图的api来获取一个地址的经度和纬度,因为众所周知的原因会出现无法访问,我们需要使用代理访问

因此书上的代码需要根据实际情况来修改,我的电脑的代理地址为127.0.0.1:1080,下面放我的代码吧,可根据自己电脑的代理设置进行修改。

运行环境:Windows 10,Anaconda3,python3.6.3,Pycharm Edu 2017.3

调用库:

#search1.py

from pygeocoder importGeocoderif __name__ == '__main__':

a=Geocoder()

a.proxy= "127.0.0.1:1080"address= '207 N. Definace St,Archbold,OH'

print(a.geocode(address)[0].coordinates)

这里使用的是Geocoder中的proxy参数设置代理(需要先使用pip安装pygeocoder),因此必须先实例化,不能像书中一样直接print

应用层:

#search2.pyimportrequests

proxies= {"http": "http://127.0.0.1:1080", "https": "http://127.0.0.1:1080", }defgeocode(address):

parameters= {'address': address, 'sensor': 'falise'}

base= 'http://maps.googleapis.com/maps/api/geocode/json'response= requests.get(base, params=parameters, proxies=proxies)

answer=response.json()print(answer['results'][0]['geometry']['location'])if __name__ == '__main__':

geocode('207 N. Defiance St,Archbold, OH')

这里使用了requests中的proxies参数设置代理

使用HTTP协议:

#search3.py

importhttp.clientimportjsonfrom urllib.parse importquote_plus

base= '/maps/api/geocode/json'

defgeocode(address):

path= '{}?address={}&sensor=false'.format(base, quote_plus(address))

connection= http.client.HTTPSConnection('127.0.0.1', 1080)

connection.set_tunnel('map.google.com')

connection.request('GET', path)

rawreply=connection.getresponse().read()

reply= json.loads(rawreply.decode('utf-8'))print(reply['results'][0]['geometry']['location'])if __name__ == '__main__':

geocode('207 N. Defiance St,Archbold, OH')

这里会提示

Traceback (most recent call last):

File"E:/Learn Python/Python网络编程/search3.py", line 21, in geocode('207 N. Defiance St,Archbold, OH')

File"E:/Learn Python/Python网络编程/search3.py", line 16, ingeocode

reply= json.loads(rawreply.decode('utf-8'))

File"D:\Anaconda3\lib\json\__init__.py", line 354, inloadsreturn_default_decoder.decode(s)

File"D:\Anaconda3\lib\json\decoder.py", line 339, indecode

obj, end= self.raw_decode(s, idx=_w(s, 0).end())

File"D:\Anaconda3\lib\json\decoder.py", line 357, inraw_decoderaise JSONDecodeError("Expecting value", s, err.value) fromNone

json.decoder.JSONDecodeError: Expecting value: line1 column 1 (char 0)

Process finished with exit code 1

很明显报了一个json.decoder.JSONDecodeError的错误 说明没有能够正确访问,json decode失败

print(rawreply)发现rawreply返回的是这样的html文件

b'

\n301 Moved\n

301 Moved

\n

The document has moved\n

here.\r\n

\r\n'

返回了一个301错误,说明需要重定向这里我们使用的是HTTPS协议因此不会像浏览器一样直接重定向,感觉应该是google反爬虫的一种行为

因此我们使用正则表达式提取字符串(方法来自https://www.cnblogs.com/rj81/p/5933838.html),更改后代码如下

#search3.py

importhttp.clientimportjsonfrom urllib.parse importquote_plusimportre

base= '/maps/api/geocode/json'

defgeocode(address):

path= '{}?address={}&sensor=false'.format(base, quote_plus(address))

connection= http.client.HTTPSConnection('127.0.0.1', 1080)

connection.set_tunnel('map.google.com')

connection.request('GET', path)

rawreply=connection.getresponse().read().decode()

newweb= re.findall(r"HREF=\"(.+?)\"", string=rawreply)#print(newweb)

connection.request('GET', newweb[0])

rawreply=connection.getresponse().read()#print(path)

#print(rawreply)

reply = json.loads(rawreply.decode('utf-8'))print(reply['results'][0]['geometry']['location'])if __name__ == '__main__':

geocode('207 N. Defiance St, Archbold, OH')

即可正确输出结果

{'lat': 41.5219645, 'lng': -84.3066496}

Process finished with exit code 0

这里需要注意的是 我一开始以为newweb是一个str,直接使用了connection.request('GET', newweb)

结果发现AttributeError: 'list' object has no attribute 'startswith'的错误,更改之后即可正常输出

直接使用Socket与谷歌地图通信:

设置代理的方法(转自http://www.jb51.net/article/50510.htm)

urllib2:

proxy_handler = urllib2.ProxyHandler({'http' : 'http://地址:端口'})

opener=urllib2.build_opener(proxy_handler, urllib2.HTTPHandler)

urllib2.install_opener(opener)

socket:

importsocks, socket

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"地址", 端口)

socket.socket= socks.socksocket

代码如下:

#search4.py#!/usr/bin/env python3

importsocketimportsocksfrom urllib.parse importquote_plus

request_text= """\

GET /maps/api/geocode/json?address={}&sensor=false HTTP/1.1\r\n\

Host: maps.google.com:80\r\n\

User-Agent: search4.py (Foundations of Python Network Programming)\r\n\

Connection: close\r\n\

\r\n\"""

defgeocode(address):

socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1", 1080)

socket.socket=socks.socksocket

sock=socket.socket()

sock.connect(('maps.google.com', 80))

request=request_text.format(quote_plus(address))

sock.sendall(request.encode('ascii'))

raw_reply= b''

whileTrue:

more= sock.recv(4096)if notmore:breakraw_reply+=moreprint(raw_reply.decode('utf-8'))if __name__ == '__main__':

geocode('207 N. Defiance St, Archbold, OH')

运行输出:

HTTP/1.1 200OK

Content-Type: application/json; charset=UTF-8Date: Fri,12 Jan 2018 07:21:20GMT

Expires: Sat,13 Jan 2018 07:21:20GMT

Cache-Control: public, max-age=86400Access-Control-Allow-Origin: *Server: mafe

X-XSS-Protection: 1; mode=block

X-Frame-Options: SAMEORIGIN

Accept-Ranges: none

Vary: Accept-Language,Accept-Encoding

Connection: close

{"results": [

{"address_components": [

{"long_name" : "207","short_name" : "207","types" : [ "street_number"]

},

{"long_name" : "North Defiance Street","short_name" : "N Defiance St","types" : [ "route"]

},

{"long_name" : "Archbold","short_name" : "Archbold","types" : [ "locality", "political"]

},

{"long_name" : "German Township","short_name" : "German Township","types" : [ "administrative_area_level_3", "political"]

},

{"long_name" : "Fulton County","short_name" : "Fulton County","types" : [ "administrative_area_level_2", "political"]

},

{"long_name" : "Ohio","short_name" : "OH","types" : [ "administrative_area_level_1", "political"]

},

{"long_name" : "United States","short_name" : "US","types" : [ "country", "political"]

},

{"long_name" : "43502","short_name" : "43502","types" : [ "postal_code"]

},

{"long_name" : "1160","short_name" : "1160","types" : [ "postal_code_suffix"]

}

],"formatted_address" : "207 N Defiance St, Archbold, OH 43502, USA","geometry": {"bounds": {"northeast": {"lat" : 41.521994,"lng" : -84.30646179999999},"southwest": {"lat" : 41.521935,"lng" : -84.30683739999999}

},"location": {"lat" : 41.5219645,"lng" : -84.3066496},"location_type" : "ROOFTOP","viewport": {"northeast": {"lat" : 41.5233134802915,"lng" : -84.30530061970849},"southwest": {"lat" : 41.5206155197085,"lng" : -84.3079985802915}

}

},"place_id" : "ChIJk4BHnIy0PYgRXbKj5GjFe_U","types" : [ "premise"]

}

],"status" : "OK"}

Process finished with exit code0

python 谷歌地图api_《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档...相关推荐

  1. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  2. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  3. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  4. 15Java网络编程学习笔记

    Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...

  5. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

  6. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  7. Python 网络编程学习笔记(二)——DNS 域名解析客户端程序设计

    本博文介绍如何使用 Python 网络编程,设计并实现客户端的 DNS 域名解析及缓存服务. 1 基本概念 域名系统(DNS)是一个庞大的.全球的分布式数据库,,它主要用来把主机名转换成 IP 地址, ...

  8. python中documentelement_python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)...

    xml.dom篇 DOM是Document Object Model的简称,XML 文档的高级树型表示.该模型并非只针对 Python,而是一种普通XML 模型.Python 的 DOM 包是基于 S ...

  9. Linux网络编程学习笔记

    声明:1.未经过原作者许可,不可用于商业行为:2.本笔记仅用于知识学习,如有侵权,立即删除. 1.学习链接 黑马程序员-Linux网络编程:https://www.bilibili.com/video ...

最新文章

  1. iOS - MySQL 的安装配置
  2. java和python的web自动化有什么区别-python和java哪个更适合做自动化?
  3. php钩子函数示例,PHP中钩子函数的实现与认识
  4. 【信息安全】ECC加密算法入门介绍
  5. 201205阶段二FFmpeg编码
  6. html判断安装没安装qq,QQ6.1体验版怎么用?腾讯QQ6.1体验版本安装步骤(无须申请体验账号)...
  7. linux添加三权,基于SELinux的三权分离技术的研究
  8. 直角三角形的边角关系_三角形的边角关系巩固练习
  9. 浙大 PAT a1058
  10. linux install nginx
  11. C#之json序列化与反序列化
  12. 励志幽默:郭德纲经典语句
  13. 吃透空洞卷积(Dilated Convolutions)
  14. mac版的PHP集成环境软件MxSrvs软件
  15. 起始方位角怎么确定_工程测量中的导线测量,最初的方位角怎么求?
  16. 颜色空间(一)——RGB色彩模式
  17. Ubuntu各版本代号
  18. Android组件化跨进程通信框架Andromeda解析
  19. 【好用的办公软件】万彩办公大师教程丨标准安装版/绿色免安装版/离线版区别
  20. 小程序转发二维码携带参数不生效的问题

热门文章

  1. winform TreeView树节点上下移动
  2. JavaSE进阶学习笔记-目录汇总(待完成)
  3. linux的基础知识——模型结构和数据包的封装
  4. java-弹簧布局(自适应窗口)
  5. select2实现全选
  6. android传感器博客,Android实现接近传感器
  7. java 设置头错误信息,错误:在node.js中发送标头后无法设置标头
  8. python 首次登陆outlook 脚本_记Python“用户环境”的一次完美应用
  9. android 时间控件使用,android 时间控件的使用
  10. Python找出某元素的索引下标