关于博彩域名采集的过程

目标采集10万条关于博彩方面的域名,博彩域名的时效性比较低,所以结果就没公布出来。这篇文记录如何获取域名的心路,涉及技术少。

0x01 起因

接到一个挑战,说是要类似博彩网站的域名,而且这一要的量就是10W+。域名采集是一个比较琐碎的活,不能类比于其他的爬虫数据都能够很好地看到与爬取,这个域名采集的话就不容易收集,虽然都是在互联网上但是我并没有发现那个网站能很统一的收集此类域名。

另一个让我哭笑不得的事情,之前给这位老哥爬取过网站数据,大概5w的数据只收了他80,而且那次的爬虫还不容易,事后都觉得亏大了,这次搜集域名,他自信的说,我给你160,气得我没话说。什么时候爬虫工程师的劳动力这么不值钱了?wtf!!!

0x02 思考

后来我在想如果搜集域名,我该如何进行呢?这类域名还都是关于博彩类型。
当时的想法去一些域名爆破网站。提取某些段的域名,然后获取这些域名的title,然后利用分词判断是否博彩网站,后来一想这个方法的效率真的是太低了。

然后想着使用爬虫,爬取某些网站的所有a的href,通过得到的a在进行爬取,深度遍历网站。爬取的域名用集合的方式进行过滤,去重。

在构思爬虫与实践写爬虫的时候出现了很大的分歧。

  1. url过滤去重这个方面,不能确定是过滤域名哪些特征,因为爬取的a-href千奇百怪,在获取到的a-href不能重组。
  2. a-href的方式不再是原来的的简单的标签,现在一些网站已经加上了js的操作,或者跳转到一个内置的页面,总之简单的爬取方式失效。
  3. 如果爬到一些非博彩网站的链接,就会直接产生一个无底洞,一直索引好的域名。

0x03 行动

这一部分的编码应该是我按照之前的想法,是一个错误的示例,有许多都不能够实现,效果也不明显

从google搜索了一些关键字菠菜网站,摘抄其中的一些域名作为起始的链接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = 'AJay'
__mtime__ = '2019/5/12 0012'

"""

import requests

import urllib
from db import MongoUrl
import time
import threading

from urllib.parse import urlparse
from pyquery import PyQuery as pq


class DomainSpider():
def __init__(self):
self.dburl = MongoUrl()
self.url_set = set()
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.12 Safari/537.36"}



def parse_a(self, srart_url, html):
d = pq(html)
title = d('title').text()

self.dburl.find_one_update_new_title(srart_url, title)

def req_news_a(self):
while True:
start_url_obj = self.dburl.find_one_update_flag1()

if not start_url_obj:
print('url已经全部扫描完毕')
time.sleep(5)
continue

url_list = start_url_obj.get('url').split('\n')
# print(urlparse(url_list[0]))
if 'http' not in url_list[0]:
new_url = 'http://' + url_list[0]

else:

new_url = url_list[0]

print('起始url', new_url)
try:
# if 1==1:
req = requests.get(url=new_url, headers=self.headers, timeout=30,verify=False)
if req.status_code < 400:
req.encoding = req.apparent_encoding
text = req.text

# 获取所有的a ,并解析url 然后判断主域名是否在site中
self.parse_a(srart_url=start_url_obj.get('url'), html=text)

else:
print('请求请求是400', )
self.dburl.update_url_flag0(start_url_obj.get('url'))
except Exception as e:
# 网站没有反爬。一般超时重新请求
print('请求超时', e)
self.dburl.update_url_flag0(start_url_obj.get('url'))

def run(self):
thread_list = []
for i in range(11):
Treq_page = threading.Thread(target=self.req_news_a)
thread_list.append(Treq_page)
for t in thread_list:
# t.setDaemon(True)
t.start()
# t.join()


if __name__ == '__main__':
ds = DomainSpider()

ds.run()

0x03 中转

看到数据库中的数据,这样的采集效率实在够呛。然后在网上找有没有收录恶意域名的网站。https://jubao.anquan.org/exposure这是一个举报网站的网站。里面的数据可以查询到3年前,而且数据量很大,但是数据大多是网站被黑或者被骗,博彩类寥寥无几。

0x04 高潮

正在打算放弃回去的时候。去关闭网页,然后看到之前打开的zoomeye和fofa。我苦苦寻找这么久,这个不就是我们要找的资产吗。通过查看fofa语法,直接返回域名,然后就根据批量爬取,找到fofa的会员账号,先测试官方的api接口,官方只出了一个python2版本的库,打开后发现库不是很那,果断改成了python3,然后刚测了两下就说f币不够。看来官方的api接口还要钱,但是在api sdk中一点都没介绍。

今晚又是不眠夜。

那就只能传统的爬取,使用大佬给的爬取软件,发现软件是请求的时间间隔固定,访问几分钟就不返回信息,而且返回的信息只有url,不太满足我这边的需求。

然后就写自己的爬虫,调用浏览器、获取信息、解析信息。一切妥妥的。后来发现fofa的查询只支持1000页的查询。所有想要获取更多的信息,就要用语法进行限制。这里选用了这几种过滤方式:1地区(美国、香港、中国)、2时间(after与before),再加上关键字,数据量已经足够。

0x05 结果

由于限制了爬虫速率,1个小时才爬取了1W条数据。

而且同一台电脑还不能进行两个浏览器同时爬取,接下来一天只能慢慢等喽!