有源码分享后如何搭建网站 有源码怎么搭建网站

今天给各位分享有源码分享后如何搭建网站的知识,其中也会对有源码怎么搭建网站进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

域名和IP地址信息是非常基础的情报信息,目前网上有很多网站都提供了域名信息的查询、IP地址及归属地的查询。本文通过PythonFlask实现域名及IP情报信息的聚合网站。

因为域名和IP地址信息会有变化,为了减少接口压力,做了本地数据库的存储,新鲜度保存一周,每次查询先从本地数据库获取信息,如果本地库信息有并且没有超过一个星期就从本地库取,没有就从其他网站获取,并更新到本地库。

一、获取域名WHOIS信息

网上提供域名WHOIS信息查询的网站有很多,这里以http://whois.chinafu.com为例实现WHOIS信息的查询和解析。

1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n

importrequests\nfrombs4importBeautifulSoup\nheaders={\n&39;:&39;\n}\n\ndefgetwhoisinfobychinafu(domain):\nret_result={}\nresult=getWhoisInfoFromDB(domain)\niflen(result)==0:\nwhois_service_url=&39;\npost_data={&34;:domain}\n\ntry:\npost_result=requests.post(whois_service_url,post_data)\nifpost_result.status_code==200:\nret_str=post_result.content.decode(&39;)\nsoup=BeautifulSoup(ret_str,&39;)\nitems_tr=soup.find(name=&39;,attrs={&39;:&39;}).find_all(name=&39;)\nforitem_trinitems_tr:\ntd_item=item_tr.find(name=&39;)\nif&39;intd_item.attrs:\nkey_name=&39;\nkey_value=td_item.find(name=&39;,id=&39;).text\nelse:\nkey_name=item_tr.find(name=&39;).text\nkey_value=item_tr.find(name=&39;).text\nret_result[key_name]=key_value\naddchinafuWhoisInfo2DB(ret_result)\nexceptExceptionasr:\nprint(&39;%(r))\n39;select*fromwhoisinfowheredomain_name=&34;andupdated_time>DATE_SUB(CURDATE(),INTERVAL1WEEK)&39;域名DomainName&39;域名状态DomainStatus&39;&39;注册商SponsoringRegistrar&39;&39;DNS服务器NameServer&39;&39;注册日期RegistrationDate&39;&39;更新日期UpdateDate&39;&39;到期日期ExpirationDate&39;&39;详情&39;&39;中国福网&39;deletefromwhoisinfowheredomain_name=&34;andsource=&34;&39;域名DomainName&39;&39;http&39;https://ip.taobao.com/outGetIpInfo&34;ip&34;accessKey&34;alibaba-inc&其中返回数据中code的值的含义为,0:成功,1:服务器异常,2:请求参数异常,3:服务器繁忙,4:个人qps超出\nreturn_json=json.loads(return_data.text)\nifreturn_json[&39;]==0:\nret_ipinfo[&39;]=return_json[&39;][&39;]\nret_ipinfo[&39;]=return_json[&39;][&39;]\nret_ipinfo[&39;]=return_json[&39;][&39;]\nret_ipinfo[&39;]=&39;\nret_ipinfo[&39;]=return_json[&39;][&39;]\nret_ipinfo[&39;]=return_json[&39;][&39;]\nret_ipinfo[&39;]=&39;\nret_ipinfo[&39;]=&39;\nret_ipinfo[&39;]=&39;\naddIPInfo2DB(ret_ipinfo)\nexceptExceptionase:\nprint(&39;%(e))\nreturnret_ipinfo\n

从ipinfo.io获取IP信息

1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n

defgetipinfobyipinfo(ip):\napi_url=&39;+ip\nipinfo={}\ntry:\nreq_return=requests.get(api_url)\nifreq_return.status_code==200:\nipinfo=json.loads(req_return.text)\nipinfo[&39;]=&39;\naddIPInfo2DB(ipinfo)\nexceptExceptionase:\nprint(&39;%(e))\nreturnipinfo\n

从ip-api.com获取IP信息

1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n

defgetipinfobyipapi(ip):\napi_url=&39;+ip\nipinfo={}\ntry:\nreq_return=requests.get(api_url)\nifreq_return.status_code==200:\nipinfo=json.loads(req_return.text)\nipinfo[&39;]=ip\nipinfo[&39;]=&39;\nipinfo[&39;]=str(ipinfo[&39;])+&39;+str(ipinfo[&39;])\naddIPInfo2DB(ipinfo)\nexceptExceptionase:\nprint(&39;%(e))\nreturnipinfo\n

从GeoLite离线库获取IP信息

如何获取GeoLite离线库及如何读取,详见:http://xiejava.ishareread.com/posts/2c5697c0/

1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n

defgetipinfobygeoip2(ip):\nipinfo={}\ndbdir=Config.geoLiteDBdir\nwithgeoip2.database.Reader(dbdir)asreader:\nresponse=reader.city(ip)\nipinfo[&39;]=ip\nipinfo[&39;]=response.country.names[&39;]\nipinfo[&39;]=&39;\nipinfo[&39;]=response.city.name\nipinfo[&39;]=&39;\nipinfo[&39;]=str(response.location.latitude)+&39;+str(response.location.longitude)\nipinfo[&39;]=response.location.time_zone\nipinfo[&39;]=&39;\naddIPInfo2DB(ipinfo)\nreturnipinfo\n

四、搭建一个FLASKWeb应用来查询聚合的域名、IP情报信息

1、FLASKWeb应用的工程组织

2、配置数据及读取配置数据

1)配置数据

配置数据分别放在.env及.flaskenv中,其中.env放的是工程中用到的数据库链接等比较私密的配置信息。.flaskenv放的是Flask运行环境的信息.env的配置信息参考如下:

1\n2\n3\n4\n5\n6\n

DEV_DATABASE_URI=&39;\nTEST_DATABASE_URI=&39;\nPROD_DATABASE_URI=&39;\n\nSQLALCHEMY_TRACK_MODIFICATIONS=True\nSECRET_KEY=yoursecretkey\n

.falskenv配置信息参考如下:

1\n

FLASK_ENV=development\n

2)实现读取配置数据

通过config.py实现配置数据的读取及管理

1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n

importos\nfromdotenvimportload_dotenv\nbasedir=os.path.abspath(os.path.dirname(__file__))\nflaskenv_path=os.path.join(basedir,&39;)\nenv_path=os.path.join(basedir,&39;)\nifos.path.exists(flaskenv_path):\nload_dotenv(flaskenv_path)\nifos.path.exists(env_path):\nload_dotenv(env_path)\n\nclassConfig:\ngeoLiteDBdir=os.path.join(basedir,&39;)\nflaskenv=os.getenv(&39;,&39;)\nSECRET_KEY=os.getenv(&39;,&&39;SQLALCHEMY_TRACK_MODIFICATIONS&39;DEV_DATABASE_URI&39;DEV_DATABASE_URI&39;TEST_DATABASE_URI&39;PROD_DATABASE_URI&39;development&39;testing&39;production&39;default&34;bootstrap/base.html&34;navbarnavbar-inverse&34;navigation&34;container&34;navbar-header&34;button&34;navbar-toggle&34;collapse&34;.navbar-collapse&34;sr-only&34;icon-bar&34;icon-bar&34;icon-bar&34;navbar-brand&34;/&34;navbar-collapsecollapse&34;navnavbar-nav&34;/&34;container&34;page-header&34;post&34;center-block&34;center-block&34;text-align:center&34;tabletable-bordered&34;2&39;详情&34;width:20%&34;width:80%&34;width:20%&34;button&34;collapse&34;34;aria-expanded=&34;aria-controls=&34;>\n{{item}}\n</a>\n</td>\n<tdstyle=&34;>\n<divclass=&34;id=&34;>\n<divclass=&34;>\n{{whois_info[item]}}\n</div>\n</div>\n</td>\n</tr>\n{%endif%}\n{%endfor%}\n</table>\n{%endif%}\n{%ifipinfos|length>0%}\n<tableclass=&34;>\n<tr><th>IP</th><th>国家/地区</th><th>省份</th><th>城市</th><th>机构</th><th>ISP</th><th>经纬度</th><th>来源</th></tr>\n{%foripinfoinipinfos%}\n<tr>\n<td>{{ipinfo[&39;]}}</td>\n<td>{{ipinfo[&39;]}}</td>\n<td>{{ipinfo[&39;]}}</td>\n<td>{{ipinfo[&39;]}}</td>\n<td>{{ipinfo[&39;]}}</td>\n<td>{{ipinfo[&39;]}}</td>\n<td>{{ipinfo[&39;]}}</td>\n<td>\n{%ifipinfo[&39;]==&39;%}\n<ahref=&39;ip&34;target=&34;>{{ipinfo[&39;]}}</a>\n{%elifipinfo[&39;]==&39;%}\n<ahref=&39;ip&34;target=&34;>{{ipinfo[&39;]}}</a>\n{%else%}\n{{ipinfo[&39;]}}\n{%endif%}\n</td>\n</tr>\n{%endfor%}\n</table>\n{%endif%}\n</div>\n</div>\n{%endblock%}\n{%endblock%}\n

路由配置处理中实现了获取表单中的信息,并判断是域名还是IP如果是域名者获取whois信息,并根据域名获取IP信息。如果输入的是IP则获取IP信息,并反馈到页面上。

1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n

@index_bp.route(&39;,methods=[&39;,&39;])\ndefindex():\nname=&39;\nipinfos=[]\nwhois_info=&39;\nform=InputForm()\nifform.validate_on_submit():\nname=form.name.data\nifcheckip(name):\nipinfos=getipinfo(name)\nelse:\nwhois_info=getwhoisinfo(name)\nwhois_ip=getIPbyDomain(name)\nifcheckip(whois_ip):\nipinfos=getipinfo(whois_ip)\nform.name.data=&39;\nreturnrender_template(&39;,form=form,name=name,ipinfos=ipinfos,whois_info=whois_info)\n

4、最终实现效果

至此通过Python快速实现了一个简单的域名、IP信息聚合网站

全部源代码:https://github.com/xiejava1018/infocollect

演示地址:http://test.ishareread.com/

原文链接:https://xiejava.gitee.io/posts/fa820ec9/

OK,本文到此结束,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平