一、 引言

一般情况下,没有特殊要求的客户,宽带服务提供商提供的上网服务,给客户家庭宽带分配的地址都是一个宽带服务提供商的内部服务地址,真正对外访问时通过NAT进行映射到一个公网地址,如果我们想确认自己的公网地址还不是很容易,但百度提供了一项服务,在百度查询时输入IP就可以查到浏览器所在本机的公网IP,利用该功能我们就可以查到本机公网IP,本节老猿就是要request+BeatifulSoap实现本机公网地址解析。

二、 百度公网地址解析过程分析

  1. 按《第14.3节 使用google浏览器获取网站访问的http信息》方法老猿截获了在google浏览器中利用百度查询IP的请求报文和应答报文内容:

    1)请求url为:
https://www.baidu.com/s?ie=utf-8&mod=1&isbd=1&isid=e58f9da20005786b&ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=IP&oq=IP&rsv_pq=e58f9da20005786b&rsv_t=d4227yacqXU1daqkMsArHRP4qBKnTUXvwdLeThY9w9ZbVPdHmXf4f6e3jik&rqlang=cn&rsv_enter=0&rsv_dl=tb&bs=IP&rsv_sid=1429_21095_29523_29519_28518_29098_29568_28831_29220_29072&_ss=1&clist=&hsug=&f4s=1&csor=2&_cr1=26201;

匿名方式下对应cookies的信息为(此处后面应用中需要请各位结合自己本机访问百度的cookies信息替换):

BAIDUID=05715D2A65E185B06ECD6CB62056F630:FG=1; BIDUPSID=05715D2A65E185B06ECD6CB62056F630; PSTM=1563498219; BD_UPN=12314353; ispeed_lsm=2; MCITY=-%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_HOME=1; H_PS_PSSID=1429_21095_29523_29519_29721_29568_29220_29072_29640; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; BD_CK_SAM=1; PSINO=7; ZD_ENTRY=baidu; sug=0; sugstore=1; ORIGIN=0; bdime=0; COOKIE_SESSION=15_0_9_9_18_35_0_4_9_5_0_0_69285_0_0_0_1567933423_0_1567941823%7C9%23278256_7_1564840597%7C2; H_PS_645EC=143a70YMQeyHbLrfwaFTZLdW6usn4%2FtO8C6yxMcDcF7RjvdnVWhYHMxScchloWr5ipmN; WWW_ST=1567941827974

2)应答报文中关键标签信息为:

<table><tr><td>
<span class="c-gap-right">本机IP:&nbsp;117.152.67.33</span>湖北省武汉市 移动
</td></tr></table>

2.构建http请求信息头后,利用request向百度发起IP地址查询的http请求;

3.使用BeatifulSoap解析应答信息。

三、 获取本机公网IP的完整代码

from bs4 import BeautifulSoup
import urllib.request def getip():
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
cookie='BAIDUID=05715D2A65E185B06ECD6CB62056F630:FG=1; BIDUPSID=05715D2A65E185B06ECD6CB62056F630; PSTM=1563498219; BD_UPN=12314353; ispeed_lsm=2; MCITY=-%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_HOME=1; H_PS_PSSID=1429_21095_29523_29519_29721_29568_29220_29072_29640; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; BD_CK_SAM=1; PSINO=7; ZD_ENTRY=baidu; sug=0; sugstore=1; ORIGIN=0; bdime=0; COOKIE_SESSION=15_0_9_9_18_35_0_4_9_5_0_0_69285_0_0_0_1567933423_0_1567941823%7C9%23278256_7_1564840597%7C2; H_PS_645EC=143a70YMQeyHbLrfwaFTZLdW6usn4%2FtO8C6yxMcDcF7RjvdnVWhYHMxScchloWr5ipmN; WWW_ST=1567941827974'
try:
req = urllib.request.Request(url='https://www.baidu.com/s?ie=utf-8&mod=1&isbd=1&isid=05715D6F63032916&ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=IP&rsv_spt=1&oq=IP&rsv_pq=a0a4fcb40013a6aa&rsv_t=143a70YMQeyHbLrfwaFTZLdW6usn4%2FtO8C6yxMcDcF7RjvdnVWhYHMxScchloWr5ipmN&rqlang=cn&rsv_enter=0&rsv_dl=tb&inputT=4024&rsv_sug4=4105&bs=IP&rsv_sid=undefined&_ss=1&clist=&hsug=&f4s=1&csor=2&_cr1=28287',headers=header)
text = urllib.request.urlopen(req,timeout=5).read().decode()
except Exception as e:
return "访问网络失败,失败原因:\n"+str(e)
else:
soup = BeautifulSoup(text, 'lxml')
ipinfo=soup.select('table>tr>td span.c-gap-right') return ipinfo getip()

老猿Python,跟老猿学Python!

博客地址:https://blog.csdn.net/LaoYuanPython


老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036

请大家多多支持,点赞、评论和加关注!谢谢!

第14.17节 爬虫实战3: request+BeautifulSoup实现自动获取本机上网公网地址的更多相关文章

  1. 第14.18节 爬虫实战4: request+BeautifulSoup+os实现利用公众服务Wi-Fi作为公网IP动态地址池

    写在前面:本文相关方法为作者独创,仅供参考学习爬虫技术使用,请勿用作它途,禁止转载! 一. 引言 在爬虫爬取网页时,有时候希望不同的时候能以不同公网地址去爬取相关的内容,去网上购买地址资源池是大部分人 ...

  2. 第14.16节 爬虫实战2:赠人玫瑰,手留余香! request+BeautifulSoup实现csdn博文自动点赞

    写在前面:本文仅供参考学习,请勿用作它途,禁止转载! 在<第14.14节 爬虫实战准备:csdn博文点赞过程http请求和响应信息分析>老猿分析了csdn博文点赞处理的http请求和响应报 ...

  3. 第14.15节 爬虫实战1:使用Python和selenium实现csdn博文点赞

    写在前面:本文仅供参考学习,请勿用作它途,禁止转载! 在开始学爬虫时,学习了csdn博客专家(id:明天依旧可好 | 柯尊柏)<实战项目二:实现CSDN自动点赞>的文章,文章介绍了通过Py ...

  4. 第14.14节 爬虫实战准备:csdn博文点赞过程http请求和响应信息分析

    如果要对csdn博文点赞,首先要登录CSDN,然后打开一篇需要点赞的文章,如<第14.1节 通过Python爬取网页的学习步骤>按<第14.3节 使用google浏览器获取网站访问的 ...

  5. 第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码

    Python要访问一个网页并读取网页内容非常简单,在利用<第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头>的方法构建了请求http报文的请求头情况下,使 ...

  6. 第14.9节 Python中使用urllib.request+BeautifulSoup获取url访问的基本信息

    利用urllib.request读取url文档的内容并使用BeautifulSoup解析后,可以通过一些基本的BeautifulSoup对象输出html文档的基本信息.以博文<第14.6节 使用 ...

  7. 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...

  8. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  9. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

随机推荐

  1. JavaScript的原型对象prototype、原型属性__proto__、原型链和constructor

    先画上一个关系图: 1. 什么是prototype.__proto__.constructor? var arr = new Array; 1. __proto__是原型属性,对象特有的属性,是对象指 ...

  2. 对于STM32F103的USART的通讯调试

    USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发 ...

  3. python_端口扫描

    client.py import socket def get_ip_status(ip, port): sk= socket.socket(socket.AF_INET, socket.SOCK_S ...

  4. JS中的Array之方法(2)

    colors=['red','green','black','blue']; (1).  concat(element[|other array])  //联接数组 colors.concat('ye ...

  5. linux 源码下载和在线查看网站

    下载: https://www.kernel.org/ 查看: https://elixir.bootlin.com/linux/

  6. 加解密 C语言实现

    1.加密的基本原理 加密分为对称加密和非对称加密,对称加密就是加密方和解密放用同一个密钥. 加密是分组加密,即将明文数据分成多个密钥大小的块,依次和密钥运算,输出密文. padding,由于加密需要分 ...

  7. WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

    如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...

  8. c++11-17 模板核心知识(五)—— 理解模板参数推导规则

    Case 1 : ParamType是一个指针或者引用,但不是universal reference T& const T& T* Case 2 : ParamType是Univers ...

  9. JetCache 源码分析

    一.简介 JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用. JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL.两级缓存.分布 ...

  10. SpringSecurity之授权

    SpringSecurity之授权 目录 SpringSecurity之授权 1. 写在前面的话 2. web授权 1. 建库 2. 添加查询权限的接口 3. 前端页面的编写 4. SpringSec ...