c语言获取直播吧最近一周nba比赛信息

就是用c语言的写的一个简单http请求,并分析其响应,原理很简单,主要是分析http响应,麻烦的是提取其中的比赛信息

代码如下:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <syslog.h>
#include <pthread.h>
#include <sys/mman.h>
#include <netdb.h>    //struct hostent结构的头文件
#include <time.h>

#define USERAGENT "Wget/1.10.2"
#define ACCEPT "*/*"
#define ACCEPTLANGUAGE "zh-cn,zh;q=0.5"
#define ACCEPTENCODING "gzip,deflate"
#define ACCEPTCHARSET "gb2312,utf-8;q=0.7,*;q=0.7"
#define KEEPALIVE "300"
#define CONNECTION "keep-alive"
#define CONTENTTYPE "application/x-www-form-urlencoded"

#define HOSTNAME "www.zhibo8.cc"
#define DEBUG 1
char Request[409600]="";
char Recive[409600]="";
struct hostent *host;
int sockfd=0;
FILE *fp;
struct sockaddr_in server_addr;
int year;
int mon;
int day;
int wday;
int count=0;

void HandLine(char *l);
void SaveResult();
void GetDayInfo();
void GetTime();
int GetLocalAgent(char * UserAgent, char * Accept, char * AcceptLanguage, char * AcceptEncoding, char * AcceptCharset, char * KeepAlive, char * Connection, char * ContentType)
{
  memcpy(UserAgent, USERAGENT, strlen(USERAGENT));
  memcpy(Accept, ACCEPT, strlen(ACCEPT));
  memcpy(AcceptLanguage, ACCEPTLANGUAGE, strlen(ACCEPTLANGUAGE));
  memcpy(AcceptEncoding, ACCEPTENCODING, strlen(ACCEPTENCODING));
  memcpy(AcceptCharset, ACCEPTCHARSET, strlen(ACCEPTCHARSET));
  memcpy(KeepAlive, KEEPALIVE, strlen(KEEPALIVE));
  memcpy(Connection, CONNECTION, strlen(CONNECTION));
  memcpy(ContentType, CONTENTTYPE, strlen(CONTENTTYPE));
  return 0;
}

void CreatRequest()
{
    char UserAgent[1024] = "", Accept[1024] = "", AcceptLanguage[1024] = "", AcceptEncoding[1024] = "", AcceptCharset[1024] = "", KeepAlive[1024] = "", Connection[1024] = "", ContentType[1024] = "";
    if((host=gethostbyname("www.zhibo8.cc"))==NULL) /* get ip address by domain */
     {
           if(DEBUG)  fprintf(stderr,"\tGethostname '%s' error, %s\n", HOSTNAME, strerror(errno));
           exit(1);
     }
    GetLocalAgent(UserAgent, Accept, AcceptLanguage, AcceptEncoding, AcceptCharset, KeepAlive, Connection, ContentType); /* Get client browser information */
    sprintf(Request, "GET /%s/%s HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: %s\r\nConnection: %s\r\n\r\n", "/", "", HOSTNAME, UserAgent, Accept, Connection);
}

代码如下:

void ConnectWeb()
{
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
       fprintf(stderr,"\t SOCKET ERROR:%s\a\n",strerror(errno));
       exit(1);
    }
    memset(&server_addr,0,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port   = htons(80);   
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr))==-1)
    {
       fprintf(stderr,"\t CONNECT ERROR:%s\a\n",strerror(errno));
       exit(1);
    }
}

void SendRequest()
{
    int wn=0;
    wn=write(sockfd,Request,strlen(Request));
    if(wn==-1)
    {
     fprintf(stderr,"\t SEND ERROR:%s\a\n",strerror(errno));
     exit(1);
    }
     fprintf(stdout, "\n\tRequest.  send OK!\n" );
}
void SaveResult()
{
    fd_set readfds;
   struct timeval tival;

int i,j,ret;
   i=j=ret=0;
  int n=0;
   RECIVE:
   FD_ZERO(&readfds);
   tival.tv_sec=10;
   tival.tv_usec=0;
   if(sockfd>0)
     FD_SET(sockfd,&readfds);
   ret=select(sockfd+1,&readfds,NULL,NULL,&tival);
   if(ret==0)
   {
     if(n++<2)
      goto RECIVE;

}
   if(FD_ISSET(sockfd,&readfds))
   {
     /*读取全部相应内容到本地文件*/
     while(read(sockfd,Recive,sizeof(Recive)))
     {       
        fwrite(Recive,sizeof(Recive),1,fp);
        memset(Recive,0,sizeof(Recive));
     }

}
}

代码如下:

void EchoResult()
{
   fd_set readfds;
   struct timeval tival;

int i,j,ret;
   i=j=ret=0;
  int n=0;
   RECIVE:
   FD_ZERO(&readfds);
   tival.tv_sec=2;
   tival.tv_usec=0;
   if(sockfd>0)
     FD_SET(sockfd,&readfds);
   ret=select(sockfd+1,&readfds,NULL,NULL,&tival);
   if(ret==0)
   {
     if(n++<2)     
      goto RECIVE;

}
   if(FD_ISSET(sockfd,&readfds))
   {     
      char c; 
      while(read(sockfd,&c,1))
     {       
         if(c=='d')
         {
            read(sockfd,&c,1);
            if(c=='i')
     {              
  read(sockfd,&c,1);
         if(c=='v')
  {
     read(sockfd,&c,1);
            if(c==' ')
     {
        read(sockfd,&c,1);
               if(c=='c')
        {      
          read(sockfd,&c,1);
          if(c=='l')
          {
     read(sockfd,&c,1);
     if(c=='a')
     {
               read(sockfd,&c,1);
                      if(c=='s')
               {
    read(sockfd,&c,1);
           if(c=='s')
    {
              read(sockfd,&c,1);
                     if(c=='=')
              {
         read(sockfd,&c,1);
                if(c=='"')
         {
                                        read(sockfd,&c,1);
            if(c=='t')
     {
               read(sockfd,&c,1);
                      if(c=='i')
        {
           read(sockfd,&c,1);
                  if(c=='t')
           {                                                 
         read(sockfd,&c,1);
         if(c=='l')
         {
           read(sockfd,&c,1);
                  if(c=='e')
           {
        read(sockfd,&c,1);
               if(c=='b')
        {
                  read(sockfd,&c,1);
           if(c=='a')
           { 
                                                                read(sockfd,&c,1);  
        if(c=='r');
        {
           read(sockfd,&c,1);
                  if(c=='"')
                                                                     GetDayInfo();
               } 
           }
        } 
           }     
         }  
           }      
        }
     }
         }     
       }    
    } 
        }      
     }  
          }
        }     
     }   
  }  
            }
         }

}
   }

}

代码如下:

void GetDayInfo()
{
  //  int f=open("./s.txt",O_WRONLY|O_CREAT);   
    char t;
    char Line[1024]="";
    int sday=wday+count;
    if(count++>=7)
    return;
    printf("\n***********%d年 %d月 %d日, 星期 %d  **********************\n\n",year,mon,day+count-1,sday>7?sday%7:sday);
    while(read(sockfd,&t,1)) /*处理每天的比赛信息即<ul></ul>里的内容*/
    {

if(t=='l')
 {
   read(sockfd,&t,1);
          if(t=='i');
          {
             int ln=0;
             memset(Line,0,sizeof(Line));    
      while(read(sockfd,Line+(ln++),1))/*处理每行的信息<li></li>里的内容*/
      {

char *s=strstr(Line,"</li>");
                if(s!=NULL)
                  break;
      }
      Line[ln]=0;                      
             HandLine(Line);
   }  
 }
       else if(t=='/')
 {
          read(sockfd,&t,1);
   if(t=='u')
   {
      read(sockfd,&t,1);
             if(t=='l');
              return;     
   }
        }
    }
}
void HandLine(char *l)
{
   l++;  
   char *NBA="NBA常规赛";
   char *p=strstr(l,NBA);
   if(p==NULL)
 return;
   char *t=strstr(l,"<b");
   int lt=strlen(l)-strlen(t);
   char *time=(char*)malloc(sizeof(char)*lt);
   memcpy(time,l,lt);
   char *p1=strstr(p,"/b>");
   char *p2=strstr(p,"<a");
   int n=strlen(p1)-strlen(p2)-3;
   char *TeamVsTeam=(char*)malloc(n*sizeof(char));
   memcpy(TeamVsTeam,p1+3,n);
   char *p3=strstr(p2,"_blank\">");
   char *p4=strstr(p3,"</a>");
   int m=strlen(p3)-strlen(p4)-8;
   char *Live=(char*)malloc(sizeof(char)*m);
   memcpy(Live,p3+8,m);
   printf("time:%s The Teams:%s TV Live:%s\n",time,TeamVsTeam,Live);
}
void GetTime()
{
    time_t rawtime;
    struct tm *timeinfo;
    time(&rawtime);
    timeinfo=localtime(&rawtime);
    year=timeinfo->tm_year+1900;
    mon =timeinfo->tm_mon+1;
    day =timeinfo->tm_mday;
    wday=timeinfo->tm_wday;
   if(wday==0)
     wday=7;
}

int main()
{
    fp=fopen("Info.txt","w");
    if(fp==NULL)
    {
      fprintf(stderr,"creat file is error \n");
      exit(1);
    }
    CreatRequest();
    ConnectWeb();
    SendRequest();   
    EchoResult();
    printf("IS END !!\n");
    return 0;
}

(0)

相关推荐

  • c语言获取直播吧最近一周nba比赛信息

    就是用c语言的写的一个简单http请求,并分析其响应,原理很简单,主要是分析http响应,麻烦的是提取其中的比赛信息 复制代码 代码如下: #include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <signal.h>#include <errno.h>#include <sys/socket.h>#include

  • 利用Python第三方库实现预测NBA比赛结果

    主要思路 (1)数据选取 获取数据的链接为: https://www.basketball-reference.com/ 获取的数据内容为: 每支队伍平均每场比赛的表现统计: 每支队伍的对手平均每场比赛的表现统计: 综合统计数据: 2016-2017年NBA常规赛以及季后赛的每场比赛的比赛数据: 2017-2018年NBA的常规赛以及季后赛的比赛安排. (2)建模思路 主要利用数据内容的前四项来评估球队的战斗力. 利用数据内容的第五项也就是比赛安排来预测每场比赛的获胜队伍. 利用方式为: 数据内

  • Seaborn数据分析NBA球员信息数据集

    目录 1. 数据介绍 2. 案例演示 2.1 获取数据 2.2 查看数据基本信息 2.3 数据分析 2.3.1 效率值相关性分析 本案例使用 Jupyter Notebook进行案例演示,数据集为NBA球员信息数据集.本项目将进行完整的数据分析演示. 1. 数据介绍 数据集共有342个球员样本,38个特征,即342行×38列. 数据集主要信息如下表所示: 球员姓名 位置 身高 体重 年龄 球龄 上场次数 场均时间 进攻能力 防守能力 是否入选过全明星 球员薪金 本数据集主要可以用来做数据处理以及

  • 详解阿里云视频直播PHP-SDK接入教程

    阿里云 视频直播 配置 及 PHP-SDK 接入教程 个人感觉,阿里的文档比微信的要坑很多- 微信最多是有些比较重要的东西放到比较不起眼.比较难发现的地方. 阿里的文档就是要么就是sdk已经更新了,但是文档还没更新,导致文档与SDK不匹配.在关键点卡我一下- 要么是同样的功能有好几个版本的SDK以及文档,却不告诉你哪个是最新的- 吐槽结束~ 准备工作 1.最重要的,先仔细看下视频直播文档! 2. 购买阿里云的视频直播服务 ,用量不大的时候建议使用按量收费的方式结算,接通之后消耗了流量才扣钱: 3

  • Python利用PyQt5制作一个获取网络实时NBA数据并播报的GUI程序

    制作NBA数据爬虫 捋顺思路 我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相关的数据 我们点击进去后,可以发现这是一个非常简洁的网址 我们看一下这个地址栏,发现毫无规律https://tiyu.baidu.com/live/detail/576O5Zu955S35a2Q6IGM5Lia56%2Bu55CD6IGU6LWbI2Jhc2tldGJhbGwjMjAyMS0wNi0xMyPniLXlo6t2c%2BWspritq%2Bi

  • Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI功能

    制作NBA数据爬虫 捋顺思路 我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相关的数据 我们点击进去后,可以发现这是一个非常简洁的网址 我们看一下这个地址栏,发现毫无规律https://tiyu.baidu.com/live/detail/576O5Zu955S35a2Q6IGM5Lia56%2Bu55CD6IGU6LWbI2Jhc2tldGJhbGwjMjAyMS0wNi0xMyPniLXlo6t2c%2BWspritq%2Bi

  • python pandas 时间日期的处理实现

    摘要在上一篇文章,时间日期处理的入门里面,我们简单介绍了一下载pandas里对时间日期的简单操作.下面将补充一些常用方法. 时间日期的比较 假设我们有数据集df如下 在对时间日期进行比较之前,要先转一下格式. 转格式的时候用 import pandas as pd pd.to_datetime() 我们需要先对df中的date这一列转为时间格式. df['date']=pd.to_datetime(df['date']) 转完后,我们可以输出数据集的数据类型来看看. print df.info(

  • 微信小程序实现时间轴

    本文实例为大家分享了微信小程序实现时间轴的具体代码,供大家参考,具体内容如下 一.显示样式 二.代码 1.wxml: <view class="header">     <view class="header-left">         <view class="header-left-top">{{selectedDay.year}}/{{selectedDay.month}}/{{selectedDay.

  • SpringBoot整合Mybatis与thymleft实现增删改查功能详解

    首先我们先创建项目 注意:创建SpringBoot项目时一定要联网不然会报错 项目创建好后我们首先对 application.yml 进行编译 #指定端口号server: port: 8888#配置mysql数据源spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/nba?serverTimezone=Asia/Shanghai    use

  • Go项目中添加生成时间与版本信息的方法

    目录 一.获取生成时间 1.使用Go编译时的链接参数来指定生成时间 2.使用C语言获取生成时间 二.获取Git版本信息 三.获取Go的相关信息 我们在编写软件时,一般会有版本号以及生成的时间,Go编译的程序中,如何添加当时的编译时间以及版本信息? C/C++语言,非常方便,可以直接使用__DATE__宏即可知道生成时间,但是Go语言没有.既然Go语言没有, C语言有,那我们可以直接使用CGO来使用C语言的功能.当然也可以使用Go的编译链接参数来指定,只是这种方式不适用于Windows. 一.获取

随机推荐