Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43329
  • 博文数量: 9
  • 博客积分: 245
  • 博客等级: 二等列兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-27 14:45
文章分类

全部博文(9)

文章存档

2013年(2)

2012年(7)

我的朋友

分类: LINUX

2012-12-04 16:50:39

环境:Linux 5.4
整体思路是这样的
1、下载导航网站的首页,命名为hao.htm
2、通过shell脚本过滤出hao.htm中涉及到的各种网址
3、通过c语言编程,得到这些网址所对应的IP地址,然后把域名和IP地址一块存入数据库中。

第一步、获取网页。
     这一步使用工具curl来完成。如果系统中默认没有安装curl,可以参考下面地址中的教程。
     为了更方便的操作,单独创建一个目录
     mkdir /test/ 以后的操作都是在test下面进行
输入:
     curl -o hao.htm
下载网页完成。
第二步、使用sed 和 awk获取文件中的网址
cat hao.htm |sh awk.sh |sed  -e 's/[^a-z0-9.]*//g'|sort -u >addr_list.txt
其中awk是一个脚本,内容如下:
awk '
BEGIN {
FS="[/ \"]"
NS=">"
}
$0~/href/ {
for(i=1;i<=NF;i++)
{
                if(match($i,/com$/) || match($i,'/^www/') || match($i,/cn$/))
                {
                        if(match($i,/\./) && (length($i) < 20)) //默认一般的网址都在20个字节内
                        {
                                print $i;
                        }
                }
}
}
'
$*

经过这一步的处理,网址已经保存在了addr_list.txt文件中。
第三步,通过c编程,把addr_list.txt文件中的网址转换为IP地址,并且与该网址一块保存到Mysql数据库中。
c程序代码如下:

名称:insert.c
内容:
#include
#include
#include
#include
#include
#include
#include
#include
#include



#define MAX_LINE  100
#define FILE_PATH "/temp"

extern int Connect_Mysql(MYSQL *m_mysql);


int main(int argc ,char* argv[])
{
MYSQL m_mysql;
char filename[40];
char sql[100];
char line[MAX_LINE];
int len = 0;
FILE * pf;
char ** paddr;
struct hostent * phost;

memset(filename,0,40);
printf("filename:%s\n",argv[1]);
sprintf(filename,"%s/%s",FILE_PATH,argv[1]);
pf = fopen(filename,"r");
if(pf == NULL)
{
printf("failed to read web list file\n");
return -1;
}
if(1 != Connect_Mysql(&m_mysql))
{
printf("failed to connect to mysql\n");
return -1;
}
while(fgets(line,MAX_LINE,pf) != NULL)
{
memset(sql,0,100);
len = strlen(line);
line[len-1] = '\0';
phost = gethostbyname(line);
if(phost == NULL)
{
printf("host name :%s\n",line);
perror("get Host Name Error\n");
continue;
}
paddr = phost->h_addr_list;
while(*paddr)
{
sprintf(sql,"insert into web_list(web_name,ip) values('%s','%s')",line,inet_ntoa(*((struct in_addr *)*paddr++)));
if(0 != mysql_real_query(&m_mysql,sql,strlen(sql)))
{
printf("failed to insert data \n");
printf("query = %s\n",sql);
//return -1;
}
printf("%s\n",sql);
}
paddr = NULL;

}
fclose(pf);
mysql_close(&m_mysql);
return 1;

}


最后,把所有的步骤,整合到一个脚本中,得到下面的脚本:

名称:getAddr.sh
参数:参数为要获取网址的网页地址,如:
内容:
#!/bin/bash
if [ $# -lt 1 ];then
        echo "$#"
        echo "usage :$0 para" 
        exit
fi
curl -o temp $1
cat temp |sh awk.sh |sed  -e 's/[^a-z0-9.]*//g'|sort -u >addr_list.txt
./insert addr_list.txt

阅读(4065) | 评论(0) | 转发(0) |
0

上一篇:这是一首词

下一篇:epoll详解

给主人留下些什么吧!~~