首页 > 编程知识 正文

python设置代理ip,java爬虫代码示例

时间:2023-05-05 09:22:14 阅读:128986 作者:278

域名解析和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等操作方法检索和操作数据。

解析为文档对象

文档文档=jsoup.parse (result;

if (文档==null ) {

logger.error (jsoupparsegetdocumentnull! ' );

}

//id属性从“列表”中获取元素元素对象(您不觉得类似于jQuery吗? )

elementlistele=document.getelementbyid (' list );

根据class属性和属性值过滤元素的元素集合(eachText ) )遍历元素的内容

returnlistele.getelementsbyattributevalue (' target ',' _blank ' ).eachText );

result的内容通过HTTP客户端模拟HTTP请求

HTTPgethttpget=newhttpget(URL;

HTPget.setheader('accept ','文本/html,application/xhtml xml,application/xml; q=0.9,image/webp,image/apng,*/*; q=0.8 ';

HTP get.setheader (' accept-encoding ',' gzip,deflate ' );

HTP get.setheader (' accept-language ',' zh-CN,zh; q=0.9 ';

HTP get.setheader (' 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; Baidu _ ssp _ LCR=https://www.Baidu.com/link? URL=fs 0cc ST 469 d 77 dpdxpcgyjhf7ostltyk6vcmehxt _9_ wd=eqid=fa0e26 f 70002 e 7dd 0000065 c 924649; pgv_pvi=6200530944; pgv_si=s4712839168; hm _ lpvt _ d 39191 a 0b 09 bb1 EB 023933 edaa 468 cd5=1553093270 ';

HTPget.setheader('DNT ','1' );

HTPget.setheader('host ',host );

http get.setheader (' upgrade-insecure-requests ','1' );

HTPget.setheader('user-agent ',' Mozilla/5.0 ) ) windowsnt10.0; WOW64 ) appleWebKit/537.36(khtml,like Gecko ) Chrome/63.0.3239.132

Safari/537.36");

String result = HttpUtils.doGet(httpGet);

HTTP请求工具类

public class HttpUtils {

private static Logger logger = LoggerFactory.getLogger(HttpUtils.class);

public static String doGet(HttpGet httpGet) {

CloseableHttpClient httpClient = null;

try {

httpClient = HttpClients.createDefault();

RequestConfig requestConfig = RequestConfig.custom()

.setConnectTimeout(5000).setConnectionRequestTimeout(10000)

.setSocketTimeout(5000).build();

httpGet.setConfig(requestConfig);

HttpResponse httpResponse = httpClient.execute(httpGet);

if (httpResponse.getStatusLine().getStatusCode() == 200 ||

httpResponse.getStatusLine().getStatusCode() == 302) {

HttpEntity entity = httpResponse.getEntity();

return EntityUtils.toString(entity, "utf-8");

} else {

logger.error("Request StatusCode={}", httpResponse.getStatusLine().getStatusCode());

}

} catch (Exception e) {

logger.error("Request Exception={}:", e);

} finally {

if (httpClient != null) {

try {

httpClient.close();

} catch (IOException e) {

logger.error("关闭httpClient失败", e);

}

}

}

return null;

}

}

新增Controller

@RestController

public class DomainSpiderController {

private static Logger logger = LoggerFactory.getLogger(DomainSpiderController.class);

@Autowired

private DomainSpiderService domainSpiderService;

/**

* @param ip 119.75.217.109

* @return

*/

@RequestMapping("/spider/{ip}")

@ResponseBody

public List domainSpider(@PathVariable("ip") String ip) {

long startTime = System.currentTimeMillis();

List domains = domainSpiderService.domainSpiderOfIp138(ip);

if(domains == null || domains.size() == 0) {

domains = domainSpiderService.domainSpiderOfAizan(ip);

}

long endTime = System.currentTimeMillis();

logger.info("完成爬虫任务总耗时:{}s", (endTime - startTime) / 1000);

return domains;

}

}

怎么样?是不是很简单?

优化改进:有时候仅仅通过一个网站查询的域名数据可能不太准确,甚至查询不到数据,我们也没法判断谁才是正确的,所以,可以通过爬取多个网站的结果结合起来使用,例如:dns.aizhan.com

提出疑问:这些提供根据IP反查域名的网站,是怎么实现的呢?我咨询过其他人,他们的回答是这些网站收集了很多IP和域名的对应关系,真实情况是这样的吗?

示例源码

domain-spider

代码已上传至码云和Github上,欢迎下载学习

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。