工具| 手把手教你制作信息收集器之网站备案号
本期任务:
1.掌握备案号的收集 。 2.练习从http返回包中获取信息的能力。 3.所需工具: pip,http请求库:requests库,匹配库:re库、Beautiful Soup,json
问题引入:
1. 何为网站备案号以及为什么收集它?
答:备案号是网站是否合法注册经营的标志,一个网站的域名是需要去备案的。上一期我们教大家如何用搜索引擎收集网站的子域名,思路是从主域名下手,延伸下去获取尽可能多的子域名。而一家企业的网站资产中,远远不止有一个主域名,有很多隐藏的主域名我们未能发现,通过查询备案号能够得到更多的信息。
2. 去哪里收集备案号? 查备案号的地址有很多,比如收集百度备案号的地址:
http://www.beianbeian.com/search/baidu.com
http://www.sojson.com/api/beian/baidu.com
http://icp.chinaz.com/info?q=baidu.com
......
查到了备案号,比如是:京ICP证030173号,然后进行反查:
http://www.beianbeian.com/search-1/京ICP证030173号
http://icp.chinaz.com/京ICP证030173号
3.代码编写难点在哪?
其实收集信息并不难,本次重在于练习获取信息的能力。
收集器制作开始:
简单的从返回包中获取备案号信息:
http://www.beianbeian.com/search/+domain
在返回包中我们发现了我们想要的备案号,而且在反查链接里面~
<a href="/search-1/京ICP证030173号">[反查]</a>
根据上一篇的姿势,此处用上我们最最简单的 非贪婪匹配(.*?)
就可以获取到备案号。
下一步,我们可以进行备案号反查http://www.beianbeian.com/search-1/京ICP证030173号。
从图片中得到的信息我们发现,我们想要的信息是网站名称和网站首页网址。
通过查看源代码,可以发现每一行的网站名称和网址都存在于一个比较大的<tr>标签里面,这个时候,如果我们想用正则匹配这两个字段,规则比较难写,怎么处理呢?
奉上一碗美味的汤 美味的汤,Beautiful Soup,是python的一个库,用它我们可以很方便的从html或者是xml标签中提取我们想要的内容。
举个例子,假设我们获取的返回包的html内容:
比如有一些标签看起来是这样:
<span class="green">ILoveStudy</span>
而另一些标签卡起来是这样:
<span class="red">StudyMakeMeHappy</span>
我们可以先获取返回包的内容,然后创建一个BeautifulSoup对象:
import requests
from bs4 import BeautifulSoup
html=requests.get(url).content
bsObj=BeautifulSoup(html,"lxml")
建立了BeautifulSoup对象,我们可以用find_all函数获取比如说只包含在<span></span>
标签里的文字:
getlist=bsObj.find_all("span",{"class":"green"})
for get in getlist:
print get.get_text()
结果:
ILoveStudy
回到上面我们获取到的返回包中,我们要的信息:分别在<td>
和<div>
标签中,并且标签属性是有规律的。
<td style="word-break:break-all;word-wrap:break-word;">
鸿媒体
</td>
<div id="home_url"><div><a href="/go?url=www.hongmeiti.com" target="_blank">www.hongmeiti.com</a></div>
因此我们可以写出我们的规则出来:
namelist=soup.find_all("td",{"style":"word-break:break-all;word-wrap:break-word;"})
domainlist=soup.find_all("div",{"id":"home_url"})
此时,我们得到是两个列表,如何同时遍历两个列表呢?
此时,我们得到是两个列表,如何同时遍历两个列表呢? 可以使用zip把两个列表打包,举个小例子:
list1 = [1,2,3,4]
list2 = [5,6,7,8]
for (i1, i2) in zip(list1,list2):
print i1,i2
结果:
1 5
2 6
3 7
4 8
给出一个小小的demo来:
#-*-coding:utf-8-*-
import requests,re
from bs4 import BeautifulSoup
def get_record_1(key):
url="http://www.beianbeian.com/search/"+key #先查一个备案号来
match='<a href="(.*?)">[反查]</a>'
response=requests.get(url=url).content
print "正在查询地址 :"+url+",结果如下: "
path=re.findall(match,response)[0]
url="http://www.beianbeian.com/"+path #查到了直接拼接url再次进行反查
response_1=requests.get(url).content
soup = BeautifulSoup(response_1,"lxml")
namelist = soup.find_all("td", {"style": "word-break:break-all;word-wrap:break-word;"})
namelist=namelist[2:]
domainlist = soup.find_all("div", {"id": "home_url"})
for (name, domain) in zip(namelist, domainlist):
print name.get_text().replace("n", "").strip() + ":" + domain.get_text()
if __name__ == '__main__':
key = raw_input("请输入所要查询备案号的一级域名:")
get_record_1(key)
运行效果:
JSON大法 :
如果你有各种网站API,例如http://www.sojson.com/api/beian/baidu.com
这种查询就是直接使用API的接口,那么返回来的数据一般是JSON的格式。我们可以把获得的json当成python的dict来读取。
import json
url="http://www.sojson.com/api/beian/"+key
r=requests.get(url=url,headers=headers).json()
print r["sitename"]+" "+r["nowIcp"]
小结:
还有一些查询地址未演示,不同的返回页面匹配规则的不同,大家可以回去练习。本次手把手教你制作信息收集器之收集备案号就到这里,我们下期见~
- tomcat相关配置技巧梳理
- 用Layer.search快速查询图元
- Ado.Net连接池的速度测试
- Excel小账本使用说明
- Enterprise Library 4.1学习笔记8----缓存应用程序块之FileDependency
- CSS实现按钮的两张图片的同步出现
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(6)--在线调整虚拟机的大小
- 关于vb中的容器
- 关于vb中的容器
- Mysql数据库之Binlog日志使用总结
- 揭秘新人机大战柯洁对手天壤 AI排名已力压Deepzen
- 一路走到java工程师,java都快出java9了,到底该如何学java?
- 网站发布合并bll问题的解决
- 痛并快乐着:浅谈大数据时代的分布式存储架构
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【SpringBoot WebFlux 系列】WebFlux 之 Path 参数解析与 url 映射
- Oracle的expdp和impdp的使用方法
- python中的密度图与柱状图
- 单细胞数据(scRNAseq)可以做GSEA吗?
- mybatis-plus的collection、association 标签传递多参数
- 100 的阶乘末尾有多少个0?
- C语言面试之——地址的强制转换
- Redis:我承载了上千万人的火影青春
- 使用云函数 SCF+COS 快速开发全栈应用
- intrins.h 简介
- 细节决定成败
- 如何注释你的文档-doxygen版
- c#语言学习笔记(1)
- c#的运算符
- c#中的继承学习总结