python爬取代理ip,python selenium 代理ip
域名解析和IP地址
域名解析是将域名指向网站空间的IP,方便人们通过注册的域名访问网站的服务;IP地址是在网络上标识站点的数字地址。为了便于记忆,网站地址用域名而不是IP地址来标识。域名解析是指域名到IP地址的转换过程,由DNS服务器进行(例如
我们先来了解两个知识点。
1.一个域名同时只能对应一个IP地址
2.一个IP地址可以解析绑定多个域名,没有限制。
基于以上知识点,如果我知道IP地址,如何将所有的域名信息解析到IP地址?一种方法是工信部可以打开查询接口进行查询。(不知道开不开?);另一种方法是实现下一个共享的——爬虫。根据IP地址反向查找域名。
实现原则
实现原理很简单。目前现有网站提供基于IP地址的域名查询功能,但需要手动登录网站,输入IP地址进行查询。我想让程序自动化,所以我想出了爬行动物的方法。简单来说,就是模拟人的咨询行为,将咨询结果解析成想要的域名列表。
以site.ip138.com为例,打开F12,输入IP查询,观察控制台请求,检查以下信息。
所需的方法是GET。
再者,如果分析Response,页面上看到的绑定域信息就是下图红框中的内容,所以如果可以分析Response的内容,那么获取的内容就可以得到想要的域列表。
上面的回应是一个HTML页面,用jsoup分析HTML再合适不过了。
什么是jsoup?
Jsoup是Java的HTML解析器,直接解析URL地址和HTML文本的内容。提供了一套非常省力的API,可以通过DOM、CSS和jQuery检索和操作数据。
解析到文档对象
document=jsoup . parse(result;
If (document==null) {
logger . error(jsoupparsegetdocumentnull! );
}
//id属性从“列表”中获取元素对象(你不觉得和jQuery很像吗?)
element list ele=document . getelementbyid( list);
根据类属性和属性值,过滤元素的元素集(eachText)来遍历元素的内容。
return list ele . getelementsbyattributevalue( target , _blank )。每个文本);
结果的内容模拟通过HTTP客户端的HTTP请求。
http gethttpget=new httpget(URL;
HTPget.setheader(accept , text /html,application/xhtml xml,application/XML;q=0.9,image/webp,image/apng,*/*;q=0.8 ;
HTP get . set header( accept-encoding , gzip,deflate )。
HTP get . set header( accept-language , zh-CN,zh;q=0.9 ;
HTP get . set header( cache-control , max-age=0 )。
HTPget.setheader(connection , keep-alive );
HTPget.setheader(cookie , hm _ lvt _ d 39191 a 0b 09 bb1 EB 023933 edaa 468 cd5=1553090128;百度_ ssp _ LCR=https://。Baidu.com/link?URL=fs 0cc ST 469d 77 dpdxpcgyjhf 7 ostltyk 6 vcmehxt _ 9 _ wd=eqid=fa 0e 26 f 70002 e 7dd 0000065 c 924649;pgv _ pvi=6200530944pgv _ si=s4712839168hm _ lpvt _ d 39191 a 0b 09 bb1 EB 023933 edaa 468 cd5=1553093270 ;
HTPget.setheader(DNT , 1 );
HTPget.setheader(host ,host);
http get . set header( upgrade-unsecured-requests , 1 );
HTPget.setheader(用户代理, Mozilla/5.0))windows nt 10.0;WOW64 ) appleWebKit/537.36(khtml,像壁虎一样)Chrome/63.0.3239.132
safari/537.36’);
string result=http utils . doget(http get);
HTTP请求工具类
公共类HttpUtils {
private static Logger Logger=Logger factory . get Logger(http utils . class);
公共静态字符串doGet(HttpGet httpGet) {
closeable http client http client=null;
尝试{
http client=http clients . create default();
请求配置request config=request config . custom()。setConnectTimeout(5000)。setconnectionrequesttime out(10000)。setSocketTimeout(5000)。build();
http get . set config(request config);
HttpResponse HttpResponse=http client . execute(http get);
if (httpResponse.getStatusLine()。getStatusCode()==200
httpResponse.getStatusLine()。getStatusCode()==302) {
HttpEntity entity=httpresponse。获取实体();
返回EntityUtils.toString(实体,‘utf-8’);
}否则{
伐木工。错误(请求状态代码={ } ,httpResponse.getStatusLine().getStatusCode());
}
} catch(异常e) {
伐木工。错误(请求异常={ }:,e);
}最后{
if (httpClient!=null) {
尝试{
http客户端。close();
} catch (IOException e) {
logger.error(关闭客户端失败,e);
}
}
}
返回空
}
}
新增控制器
@RestController
公共类DomainSpiderController {
私有静态记录器记录器=记录器工厂。获取记录器(domainspidercontroller。类);
@自动连线
私有域名服务域名服务;
/**
* @ param IP 119.75.217.109
* @返回
*/
@RequestMapping(/spider/{ip} )
@ResponseBody
公共列表域标识(@PathVariable(ip )字符串ip) {
长启动时间=系统。当前时间毫秒();
list domains=domainspiderservice。domainspiderofip 138(IP);
if(domains==null domains。size()==0){
domains=domainspiderservice。domainspiderofaizan(IP);
}
结束时间长=系统。当前时间毫秒();
logger.info(完成爬虫任务总耗时:{}s ,(结束时间-开始时间)/1000);
返回域;
}
}
怎么样?是不是很简单?
优化改进:有时候仅仅通过一个网站查询的域名数据可能不太准确,甚至查询不到数据,我们也没法判断谁才是正确的,所以,可以通过爬取多个网站的结果结合起来使用,例如:dns.aizhan.com
提出疑问:这些提供根据互联网协议(互联网协议)反查域名的网站,是怎么实现的呢?我咨询过其他人,他们的回答是这些网站收集了很多互联网协议(互联网协议)和域名的对应关系,真实情况是这样的吗?
示例源码
域名蜘蛛
代码已上传至码云和开源代码库上,欢迎下载学习
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。