#include <afxinet.h>CString Content;
CString m_sURL;
HANDLE hEvent;
static DWORD WINAPI SplitThread(LPVOID lpparam);
static DWORD WINAPI InsertInData(LPVOID lpparam);void CSplitDlg::OnGet() 
{
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
CInternetSession httpSession(NULL,0);
CHttpFile* pHttpFile=NULL;
CString text;

m_sURL="http://ship.shippingchina.com/?package=ship&module=bulk";
m_sURL.MakeLower();
m_sURL.TrimLeft(" ");
m_sURL.TrimRight(" ");
if(m_sURL.Find("http://")!=0)
m_sURL=CString("http://") + m_sURL; BeginWaitCursor();
pHttpFile=(CHttpFile*)httpSession.OpenURL(m_sURL);
if(pHttpFile==NULL)
{
EndWaitCursor();
return;
}
Content="";
while(pHttpFile->ReadString(text))
{
Content=Content+"\r\n";
Content=Content+text;
}
int n_begin=Content.Find("<td height=\"22\" width=\"180\">");
int n_end=Content.Find("<td colspan=\"4\" align=\"right\">");
Content=Content.Mid(n_begin,n_end-n_begin);
EndWaitCursor();
pHttpFile->Close();
httpSession.Close(); int m=3;
CString url;
while(m>0)
{
n_begin=Content.Find("<a href=\"");
n_end=Content.Find("\" target=");
url="http://ship.shippingchina.com"+Content.Mid(n_begin+9,n_end-n_begin-9);
n_end=Content.Find("</tr>");
Content=Content.Mid(n_end+5,Content.GetLength()-n_end-5);
m--; //创建线程
DWORD dwThread;
HANDLE hThread;
hThread=CreateThread(NULL,0,SplitThread,(LPVOID)&url,0,&dwThread);
CloseHandle(hThread); 
WaitForSingleObject(hEvent,INFINITE); 
}
}
DWORD WINAPI CSplitDlg::SplitThread(LPVOID lpparam)
{
SetEvent(hEvent); CInternetSession httpSession(NULL,0);
CHttpFile* pHttpFile=NULL;
CString text; CString m_sURL;
CString *s_url=(CString*)lpparam;
m_sURL=s_url->GetBuffer(s_url->GetLength()); m_sURL.MakeLower();
m_sURL.TrimLeft(" ");
m_sURL.TrimRight(" ");
if(m_sURL.Find("http://")!=0)
m_sURL=CString("http://") + m_sURL; pHttpFile=(CHttpFile*)httpSession.OpenURL(m_sURL);
if(pHttpFile==NULL)
{
return 0;
}
CString Content;
while(pHttpFile->ReadString(text))
{
Content=Content+"\r\n";
Content=Content+text;
}
int n_begin=Content.Find("<ul class=\"zz\">");
int n_end=Content.Find("</ul>");
Content=Content.Mid(n_begin,n_end-n_begin); pHttpFile->Close();
httpSession.Close(); //创建线程
DWORD dwThread;
HANDLE hThread;
hThread=CreateThread(NULL,0,InsertInData,(LPVOID)&Content,0,&dwThread);
CloseHandle(hThread); 
WaitForSingleObject(hEvent,INFINITE);  ResetEvent(hEvent); return 1;
}
DWORD WINAPI CSplitDlg::InsertInData(LPVOID lpparam)
{
LRunSql m_runsql;
CString m_sResource;
CString *content=(CString*)lpparam;
m_sResource=content->GetBuffer(content->GetLength()); m_sResource.Replace("</b>","");
Data data;
for(int i=1;i<=10;i++)
{
int begin=m_sResource.Find("<li>");
int end=m_sResource.Find("</li>");
CString str=m_sResource.Mid(begin+4,end-begin-4);
m_sResource=m_sResource.Mid(end+5,m_sResource.GetLength()-end-5);
switch(i)
{
case 1:
str.Replace("所属航线 <b>","");
data.line=str;
break;
case 2:
str.Replace("装运港 ","");
data.load_address=str;
break;
case 3:
str.Replace("卸货港 ","");
data.unload_address=str;
break;
case 4:
str.Replace("开航日期 ","");
data.date=str;
break;
case 5:
str.Replace("航期 ","");
data.number=str;
break;
case 6:
str.Replace("载重吨 ","");
data.zhongliang=str;
break;
case 7:
str.Replace("舱容 ","");
data.changrong=str;
break;
case 8:
str.Replace("联系人 ","");
data.link_man=str;
break;
case 9:
str.Replace("联系方式 ","");
data.link_telephone=str;
break;
case 10:
str.Replace("信息发布公司名称 >> <b>","");
data.company=str;
break;
}
}
sql.Format("insert into Fiata_Scatter_Boat(boat_style,line,load_port,"
"unload_port,StartDate,day_time,boat_load,boot_content,"
"link_man,link_telephone,put_out_company)values('散杂船','%s',"
"'%s','%s','%s','%s','%s','%s','%s','%s','%s')",data.line,
data.load_address,data.unload_address,data.date,data.number,
data.zhongliang,data.changrong,data.link_man,
data.link_telephone,data.company);
AfxMessageBox(sql);
return 0;
}
本程序的作用是抓取http://ship.shippingchina.com/?package=ship&module=bulk页面中"散杂货运输"下面这个表格中"装运港"的链接,为什么第二次运行的时候就会产生一个错误呢?

解决方案 »

  1.   

    结构体定义如下:
    extern CString sql;
    struct Data
    {
    CString line;
    CString load_address;
    CString unload_address;
    CString date;
    CString number;
    CString zhongliang;
    CString changrong;
    CString link_man;
    CString link_telephone;
    CString company;
    };
      

  2.   

    本程序是从http://ship.shippingchina.com/?package=ship&module=bulk这个页面中有关散杂船期这个表格中的每条数据的连接.然后根据这个链接,找到相应的内容.然后再把数据分离出来.保存到数据库.程序第一次运行正常,但再次运行的时候就会产生异常,应该是多线程出现了问题.请问各位问题出现在哪里呢?
      

  3.   

    不明白 你创建的 event 是想用来干什么的?
    你说的第一次运行和再运行是指第二次调用 OnGet()吗?
    报什么错?学习下