基于python的ip定位及权重查询脚本

最近闲来无事,src也刷累了,无意间看到一朋友的定位脚本感觉很酷,寻思着自己写一个,而且还方便补天刷洞。

首先要ip定位,于是打算直接获取www.ip.cn的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def get_ipaddress(ip):
# 获取ip定位
try:
url = ('https://www.ip.cn/?ip={}'.format(ip))
r = requests.get(url=url, headers=headers, timeout=3)
pattern = re.compile(
'setTimeout.*?所在地理位置:<code>(.*?)</code></p><p>GeoIP: <code>(.*?)</code>',
re.S)
address = re.findall(pattern, r.text)
for add in address:
print('GeoIP:{}'.format(add[1]))
print('地理位置:{}'.format(add[0]))
except:
pass

但是我们在实际应用中还会遇到url或者域名的情况,于是写了一个判断以及url转域名,域名转ip

1
2
3
4
def get_domain(domain):
# url转域名
res = urlparse(domain)
return res.netloc
1
2
3
4
5
6
7
8
def get_ip(domain):
# 域名转ip
try:
result = socket.getaddrinfo(domain, None)
ip = result[0][4][0]
return ip
except:
return None

现在完成一半了,再加上个爱站网权重查询岂不是美滋滋,于是上爱站网卡卡点

API市场,感觉事情应该没那么简单,但是还是用常规requests爬虫试试,果然

发现部分可以获取下来,部分显示为n,于是我重新审查了爱站网权重查询的过程,发现在查询一个从未查过的网站时,先是显示n,再显示成数字

再看看他的源码

虽然前端页面刷新了但是网页源码还是n,于是刷新一次浏览器发现前端直接显示数字,源码也有数字了。这里我猜测第二次应该是直接返回的浏览器缓存,这里思路就清晰了。经Azrael师傅提示写一个判断语句,权重是n就再requests请求一次看看能不能解决这个问题,试了下,问题依然存在。那应该就是requests请求并不记录缓存,而是每次请求就像第一次请求一样,都是全新的请求。这里我想到了就直接调用浏览器访问就行了呀。于是导入selenium模块调用Chrome浏览器。

1
2
from selenium import webdriver
browser=webdriver.Chrome()

每次查询都刷新一次再爬取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def get_seo(domain):
# 爱站网seo
azurl = 'https://www.aizhan.com/seo/'
url = azurl + domain
browser.get(url)
browser.refresh()
html = browser.page_source
pattern = re.compile('''<li>百度权重:<a id="baidurank_br" target="_blank".*?alt="(.*?)"></a></li>
<li>移动权重:<a id="baidurank_mbr" target="_blank".*?alt="(.*?)"></a></li>
<li>360权重:<a id="360_pr" target="_blank".*?alt="(.*?)"></a></li>
<li>神马:<a id="sm_pr" target="_blank".*?alt="(.*?)"></a></li>
<li>搜狗:<a id="sogou_pr" target="_blank".*?alt="(.*?)"></a></li>
<li>谷歌PR:<a id="google_pr" target="_blank".*?alt="(.*?)"></a></li>.*?<li>备案号:<a target="_blank".*?id="icp_icp">(.*?)</a></li>
<li>性质:<span id="icp_type">(.*?)</span></li>
<li>名称:<span id="icp_company">(.*?)</span></li>
<li>审核时间:<span id="icp_passtime">(.*?)</span></li>''', re.S)
seos = re.findall(pattern, html)
for seo in seos:
print('百度权重:{} 移动权重:{} 360权重:{} 神马:{} 搜狗:{} 谷歌PR:{}'.format(seo[0], seo[1], seo[2], seo[3], seo[4], seo[5]))
print('备案号:{} 性质:{} 名称:{} 审核时间:{}'.format(seo[6], seo[7], seo[8], seo[9]))

但是这样每次用脚本都得弹出个Chrome浏览器很不爽,于是换成phantomjs无界面浏览器。我的archlinux没安装,于是安装一个,编译了是十分钟还报错编译失败。。。算了直接上官网下载安装并配置环境变量吧。

万事具备运行一下

提示报错:

1
2
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '

用是能用,但是看见报错总是不爽的

报错意思是:

1
2
3
用户警告:对PhantomJS的Selenium支持已经被弃用,请改用Chrome或Firefox的无头版本

warning.warn('对PhantomJS的Selenium支持已被弃用,请使用headless'

那好吧,不能用phantomjs了,看了看新的用法

1
2
3
4
5
6
7
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=chrome_options)

然后,做了一些简单优化就完成了,看看效果

由于需要后台开启浏览器而且每次获取权重都得访问两遍,所以速度有些缓慢,还待改进。

项目地址:

https://github.com/BestReder/infoscan

Thank you very much if you can.

欢迎关注我的其它发布渠道