爬虫获取IP归属地和运营商信息的五种方式

学习python爬虫,由入门到入狱。

如题,爬虫获取IP的归属地和运营商信息的五种方式,其实从大体上来介绍的话,就是一种方式——解析HTML源码和获取数据。下面细说:

首先,我们是通过爬虫的方式获取IP地址归属地和运营商的信息,那就是我们所熟知的“爬虫四步走”(个人总结):提交请求——获取网页源码——解析源码并提取数据。

下面就进行操作,按部就班,生搬硬套,循规蹈矩......

  1. 1.提交请求,就是常规的构建URl地址、headers、cookie等等,按照实际情况来就好,比如爬取淘宝和亚马逊就需要cookie的时候就想办法把cookie搞出来行了。
  2. 2.我们这是通过爬虫获取IP相关信息的,所以是不是通过接口的方式获取IP相关信息,而是在网上IP查询的网站里输入IP爬取信息。以下,用https://ipchaxun.com/这个网站进行演示,可以看到一输入查询ip地址,URL就出现了变化,这样就可以构建提交请求的URL了。
  3. 3.获取网页源码,这个就不多说了,就一个requests的get请求返回的response就可以获取源码了。
  4. 4.有了源码后就可以进行解析并提取数据了可以使用python对应的相关网页解析库就可以解决了,例如正则表达式、XPath、Beautiful Soup和PyQuery。

 

下面就简单介绍一下用爬虫获取IP的归属地和运营商信息的五种方式:

介绍以下网页源码内容结构

首先我们所查询的IP有两种,一种是外网IP(公网IP),另一种是局域网IP,两种查询所得网页结构有小小差异。

外网IP(公网IP)

 

局域网IP

注意源码里的内容。

目标查询结果:

 

字符串截取方式

因为字符串也是一个可迭代对象,那么就从它的特点上手,不使用任何类库工具解析提取。

import requests
from urllib.error import URLError

ip = input("请输入你正确的ip地址:")
url = 'https://ipchaxun.com/'+ip
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'
}
try:
    text = requests.get(url=url, headers=headers).content.decode('utf-8')
    #t = text[text.find('data-result'):text.find('container')]   //在这里的这句代码
    num_1 = text.find('归属地')
    num_2 = text.find('运营商')
    print('\n你的ip地址是:',ip)
    if(ip.startswith('192') or ip.startswith('172') or ip.startswith('10')):    #局域网IP的开头筛选
        print(text[num_1:num_1 + 4] + text[num_1 + 31:num_1 + 35])
    else:
        print(text[num_1:num_1 + 4] + text[num_1 + 31:num_1 + 37] + '\t' + text[num_2:num_2 + 4] + text[num_2 + 31:num_2 + 33])
except URLError as e:
    print("获取失败,原因:", e.reason)

 

正则表达式

正则表达式是提取数据非常方便,也不陌生,不做过多介绍。

import re
import requests
from urllib.error import URLError

ip = input("请输入你正确的ip地址:")
url = 'https://ipchaxun.com/' + ip
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'
}
try:
    text = requests.get(url=url, headers=headers).content.decode('utf-8')
    if (ip.startswith('192') or ip.startswith('172') or ip.startswith('10')):
        partten = '<div.*?name">(.*?)</span>.*?value">(.*?)</span>.*?name">(.*?)</span.*?value">(.*?)</span>'
        tup = re.findall(partten, text, re.S)[0]
        print('\n' + tup[0] + tup[1] + '\t' + tup[2] + tup[3])
    else:
        partten = '<div.*?name">(.*?)</span>.*?value">(.*?)</span>.*?name">(.*?)</span.*?value">(.*?)</span>.*?name">(.*?)</span.*?value">(.*?)</span>'
        tup = re.findall(partten, text, re.S)[0]
        print('\n' + tup[0] + tup[1] + '\t' + tup[2] + tup[3] + '\t' + tup[4] + tup[5])
except URLError as e:
    print("获取失败,原因:", e.reason)

 

使用XPath

XPath是一门在XML文档中查找信息的语言,但同样使用于HTML文档的搜索。

import requests
from urllib.error import URLError
from lxml import etree

ip = input("请输入你正确的ip地址:")
url = 'https://ipchaxun.com/'+ip
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'
}
try:
    text = requests.get(url=url, headers=headers).content.decode('utf-8')
    html = etree.HTML(text)
    if(ip.startswith('192') or ip.startswith('172') or ip.startswith('10')):
        span = html.xpath('//div[@class="info"]//span/text()')
        print('\n' + span[0] + span[1] + '\t' + span[2] + span[3])
    else:
        span = html.xpath('//div[@class="info"]//span/text()')
        print('\n'+span[0]+span[1]+'\t'+span[2]+span[3]+'\t'+span[4]+span[5])
except URLError as e:
    print('获取失败,原因:', e.reason)

 

使用BeautifulSoup

BeautifulSoup是一个强大的解析工具,借助网页的结构和特性来解析网页。它提供简单的、python式的函数来处理导航、搜索、修改分析树等功能。

import requests
from bs4 import BeautifulSoup
from urllib.error import URLError

ip = input("请输入你的正确ip地址:")
url = 'https://ipchaxun.com/'+ip
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'
}
try :
    text = requests.get(url=url,headers=headers).content.decode('utf-8')
    soup = BeautifulSoup(text,'lxml')
    labels = soup.find_all(name='label')
    info = []
    for label in labels:     #嵌套查询
        for s in label:
            info.append(s.string)
    while '\n' in info:             #清洗抓取下来含有换行符的数据
        info.remove('\n')
    if(ip.startswith('192') or ip.startswith('172') or ip.startswith('10')):
        print('\n' + info[0] + info[1] + '\t' + info[2] + info[3])
    else:
        print('\n'+info[0]+info[1]+'\t'+info[2]+info[3]+'\t'+info[4]+info[5])
except URLError as e:
    print('获取失败,原因:',e.reason)

 

使用PyQuery

如果更喜欢CSS选择器,那么PyQuery会更适合你。

import requests
from urllib.error import URLError
from pyquery import PyQuery as pq

ip = input('请输入你正确的ip地址:')
url = 'https://ipchaxun.com/'+ip
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'
}
try:
    text = requests.get(url=url,headers=headers).content.decode('utf-8')
    doc = pq(text)
    print(doc('label span').text())
except URLError as e :
    print('获取失败,原因:',e.reason)

以上选择了使用url来构建我们请求的查询ip,有些网站的请求url里不会出现我们查询的ip,这样就不够构建请求获取信息了。不过也是可以的,使用selenium来模拟浏览器获取输入框和输出信息也是可以的。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00