作业题目
本次实验主要考察大家的编程能力及子域名的信息收集方法,在文件
夹“Lab1_code”提供了使用 Bing 搜索引擎的域名收集功能。请对该
代码进行扩展,使其可支持百度搜索引擎的域名收集功能。需要实现
如下功能:
a) 支持百度搜索引擎的域名提取,其中从百度搜索引擎提取的域名
需为真实域名,而非百度的域名跳转链接;
b) 可扩充其他功能,比如域名所在的标题等信息。
实验步骤及结果
- 执行示例代码
执行代码,结果如下:
该代码实现了用Bing搜索引擎搜集部分qq.com子域名的功能。
- 理解并修改示例代码
检查headers中的User-Agent字段,检测是否携带cookie和要求有referer都是常见的反爬手段,设置这样一个请求头绕过反爬机制。
所以,这部分代码不用修改。
打开链接,是一个用Bing搜索domain:qq.com的网页。
用浏览器审查元素,发现子域名url就是html文件中<h2>标签下<a>标签href属性的值。
所以,对代码进行如下修改:
在百度搜索引擎中搜索:domian:baidu.com,复制链接,将代码中变量url的值修改为该链接。
发现对于百度搜素引擎来说,我们需要的结果在<h3>标签下,所以将h2改为h3。
修改结果:
同时也可以发现,<h3>标签下的结果并不是原始链接,百度使用短链接,方便用户访问原始的网站,我们需要将短链接还原成长链接。
加入代码,执行代码,得到结果:
可以发现,得到的结果并不多,只返回了第一页的内容。这是因为百度的搜索结果是动态加载,初始的htm响应不包含所有的结果。
写一个循环实现“翻页”,同时修改url:
这时执行代码,有时候会爬到一些不符合url的内容产生报错:
用正则表达式对内容过滤:
执行代码,得到结果:
有时运行代码时会有如下报错:
将str(urlparse(link).schema和urlparse(link).netloc变为字符串再连接:
可以解决。
有时也会发现,得到的结果里有并不是百度子域名的域名:
可能是因为百度在搜索时并没有完全过滤:
- 进一步完善功能(域名所在标题)
通过在搜索引擎审查网页元素,可以观察到域名所在标题信息就是<a>标签的内容。
定义一个空列表存储搜集子域名的标题:
在子域名加到域名列表后搜集它的标题加入标题列表:
执行代码,结果:
完成。
- 最终代码