python实现nslookup真实蜘蛛ip查询

写在前面

今天我们介绍下如何利用IP反查方法,判断蜘蛛是否为百度蜘蛛,谷歌蜘蛛等等。通常我们判断是否是百度蜘蛛抓取看用户代理字符串也就是User-Agent,但是User-Agent是可以模拟的,所以很多时候也会有虚假的模拟伪装成百度蜘蛛来抓取,这时候我们就需要学会分辨真伪。采用nslookup反查ip就可以判断是否是真的蜘蛛ip。

必要库安装

pip install subprocess
pip install threading
pip install pandas
pip install queue

必要事项

1. 从宝塔里下载网站日志文件并将其命名为1.log
2. spider.txt文件里可以自定义查找蜘蛛类型,一行一个,根据自己的需求更改
3. 使用前确保spider.txt,spider.py,1.log三个文件在同一目录下,否则会报错
4. 运行结束后会在该目录下生成一个蜘蛛访问.xlsx文件,点击即可查看

代码实现

import subprocess
import threading
import pandas as pd
import queue


# 用户自定义蜘蛛函数
def spider_data():
    spider_list = []  # 自定义查询spider列表
    with open("spider.txt") as spider:
        for word in spider:
            spider_list.append(word.strip())
    return spider_list


# 日志获取函数
def log_data():
    line_list = []  # 每条日志列表
    with open("1.log") as logfile:
        # print(len(logfile.readlines()))  # 获取文件行数
        for line in logfile:
            line_list.append(line)
    return line_list


# 多线程
def thread_nslookup(line_list, spider_list):
    thread_nslookups = []
    for line in line_list:
        thread_nslookups.append(threading.Thread(target=lognslookup_find, args=(line, spider_list)))
    for thread_nslookup in thread_nslookups:
        thread_nslookup.start()
    for thread_nslookup in thread_nslookups:
        thread_nslookup.join()


# 日志nslookup查询
def lognslookup_find(line, spider_list):
    ip = str.split(line, ' - - ')[0]  # 获取访问ip
    url = str.split(str.split(line, ' - - ')[1], 'HTTP')[0][34:]  # 获取访问受访页面url
    nslookup = 'nslookup ' + ip  # nslookup查询
    nslookup_find = subprocess.Popen(nslookup, stdout=subprocess.PIPE)
    nslookup_find.wait()
    nslookup_result = nslookup_find.stdout.read().decode("gbk")
    if any(spider_name in nslookup_result for spider_name in spider_list):
        ip_list.put(ip)
        url_list.put(url)
        spider_name_list.put(str.split(str.split(str.split(nslookup_result, '名称:    ')[1], 'Address')[0], '-')[0])
        ip_list_pd.append(ip_list.get())
        url_list_pd.append(url_list.get())
        spider_name_list_pd.append(spider_name_list.get())


# 真实蜘蛛日志文件输出
def logspider_out(ip_list_pd, url_list_pd, spider_name_list_pd):
    visit = pd.DataFrame({'ip段': ip_list_pd, '受访页面': url_list_pd, '蜘蛛类型': spider_name_list_pd})
    visit.to_excel('蜘蛛访问.xlsx')


if __name__ == '__main__':
    ip_list = queue.Queue()  # ip的q对象
    url_list = queue.Queue()  # url的q对象
    spider_name_list = queue.Queue()  # 真实spider的q对象
    ip_list_pd = []
    url_list_pd = []
    spider_name_list_pd = []
    spider_list = spider_data()
    line_list = log_data()
    thread_nslookup(line_list, spider_list)
    logspider_out(ip_list_pd, url_list_pd, spider_name_list_pd)

写在最后

相关意见,建议,请在下方留言,bug多多包涵[aru_1]

相关文件下载
没有了,已经是最后文章
发表评论 取消回复
表情 图片 链接 代码

分享