注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

源码:过滤51Job已经投递的职位  

2013-10-17 21:28:38|  分类: 源码区 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

51Job上面只能过滤一个星期内投递过的职位,一个星期才5天,过了这5天,就很容易重复投同一家公司,下面的程序通过爬取和过滤历史投递的公司信息,使得不至于重复投递同一家公司。

使用时,Ctrl+C复制公司信息 或者公司/职位的URL,程序定时读取剪贴板的信息,再和此前爬取的结果比较,从而判断是否投递过。

代码比较乱,仅供参考:

///////////////////////头文件


struct NODE
{
 CStringA joblink;
 CStringA job;
 CStringA companylink;
 CStringA company;
 CStringA area;
};

// CJobHistoryDlg 对话框
class CJobHistoryDlg : public CDialogEx
{
// 构造
public:
 CJobHistoryDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
 enum { IDD = IDD_DIALOG_HISTORY_GET };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持


// 实现
protected:
 HICON m_hIcon;

 // 生成的消息映射函数
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 DECLARE_MESSAGE_MAP()
public:
 afx_msg void OnClickList_HistoryGet();
 int ThreadProcFunction();

 int m_item_id;
 int m_item_url;

 HWND m_listctrl;

 int InitData(void);
 int ReadData(void);
 virtual BOOL DestroyWindow();
 HANDLE m_hThread;
 CHtmlEditCtrl2 m_ie;
 CStatic m_state;
 CEdit m_url;

 CArray<NODE, NODE &> m_jobhistory;
 afx_msg void OnBnClickedButtonStart();
 afx_msg void OnTimer(UINT_PTR nIDEvent);
 CEdit m_content;
};

 

//cpp文件


CJobHistoryDlg::CJobHistoryDlg(CWnd* pParent /*=NULL*/)
 : CDialogEx(CJobHistoryDlg::IDD, pParent)
{
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 m_listctrl=NULL;
 m_hThread=NULL;
}

void CJobHistoryDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);
 DDX_Control(pDX, IDC_EXPLORER, m_ie);
 DDX_Control(pDX, IDC_STATIC_STATE, m_state);
 DDX_Control(pDX, IDC_EDIT_URL, m_url);
 DDX_Control(pDX, IDC_EDIT_CONTENT, m_content);
}

BEGIN_MESSAGE_MAP(CJobHistoryDlg, CDialogEx)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_HISTORY_GET, &CJobHistoryDlg::OnClickList_HistoryGet)
 ON_BN_CLICKED(IDC_BUTTON_START, &CJobHistoryDlg::OnBnClickedButtonStart)
 ON_WM_TIMER()
END_MESSAGE_MAP()


// CJobHistoryDlg 消息处理程序

BOOL CJobHistoryDlg::OnInitDialog()
{
 CDialogEx::OnInitDialog();

 // 将“关于...”菜单项添加到系统菜单中。

 // IDM_ABOUTBOX 必须在系统命令范围内。
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  BOOL bNameValid;
  CString strAboutMenu;
  bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  ASSERT(bNameValid);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
 //  执行此操作
 SetIcon(m_hIcon, TRUE);   // 设置大图标
 SetIcon(m_hIcon, FALSE);  // 设置小图标

 SetWindowPos(&wndTopMost, 0, 0, 0, 0, 3);

 LPCTSTR ptext=_T("http://my.51job.com/my/history/My_AppHistory.php?pageno=%d");
 m_url.SetWindowText(ptext);

 //得到控件句柄
 m_listctrl=::GetDlgItem(m_hWnd, IDC_LIST_FORM);

 //修改风格
 ::SendMessage(m_listctrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
  (LPARAM) ::SendMessage(m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) | LVS_EX_FULLROWSELECT);

 //插入ListCtrl标题
 LVCOLUMN column;
 column.mask = LVCF_TEXT|LVCF_FMT;
 column.fmt = LVCFMT_LEFT;
 column.mask |= LVCF_WIDTH;

 int i=0;

 tstring str;
 str=g_LoadString(IDS_STRING_ID);
 column.pszText = (LPTSTR)str.c_str();
 column.cx = 45;
 ::SendMessage(m_listctrl, LVM_INSERTCOLUMN, i, (LPARAM)&column);
 m_item_id=i++;

 str=g_LoadString(IDS_STRING_FORM_URL);
 column.pszText = (LPTSTR)str.c_str();
 column.cx = 270;
 ::SendMessage(m_listctrl, LVM_INSERTCOLUMN, i, (LPARAM)&column);
 m_item_url=i++;

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CJobHistoryDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialogEx::OnSysCommand(nID, lParam);
 }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CJobHistoryDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 用于绘制的设备上下文

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // 使图标在工作区矩形中居中
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // 绘制图标
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialogEx::OnPaint();
 }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CJobHistoryDlg::OnQueryDragIcon()
{
 return static_cast<HCURSOR>(m_hIcon);
}

 

DWORD WINAPI ThreadProc(LPVOID lp)
{
 CJobHistoryDlg * pClass=(CJobHistoryDlg *)lp;
 return pClass->ThreadProcFunction();
}

void CJobHistoryDlg::OnClickList_HistoryGet()
{
 if (m_hThread!=NULL)
 {
  return ;
 }

 m_hThread=CreateThread(NULL, NULL, ThreadProc, this, 0, 0);
 return ;
}


BOOL CJobHistoryDlg::DestroyWindow()
{
 if(m_hThread!=NULL)
 {
  TerminateThread(m_hThread, -1);
  CloseHandle(m_hThread);
  m_hThread=NULL;
 }

 return CDialogEx::DestroyWindow();
}

int CJobHistoryDlg::ThreadProcFunction()
{
 m_jobhistory.RemoveAll();

 USES_CONVERSION;
 CString str;
 m_url.GetWindowText(str);
 LPCTSTR ptext=str.GetBuffer(0);

 INT end_si=1;
 INT i=0;
 for (i=0; i<end_si; i++)
 {
  TCHAR buf[1024]={0};
  _stprintf(buf, ptext, i+1);
  m_ie.Navigate(buf, 0, 0, 0, 0);

  _stprintf(buf, _T("[%d/%d]"), i+1, end_si);
  m_state.SetWindowText(buf);
  Sleep(5100);

  CStringA strText;
  m_ie.GetDocumentHTML(strText);

  int from=0;
  INT to=0;

  INT items=m_jobhistory.GetSize();

  while (TRUE)
  {
   NODE node;
   char * pseek="<td width=\"16%\" class=\"padding_l5\"><a href=\"";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }
   from=to+strlen(pseek);

   pseek="\"";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }

   node.joblink=strText.Mid(from, to-from);

   pseek="\"blur()\">";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }
   from=to+strlen(pseek);

   pseek="<";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }

   node.job=strText.Mid(from, to-from);

   pseek="<td width=\"22%\" class=\"padding_l5\"><a href=\"";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }
   from=to+strlen(pseek);

   pseek="\"";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }

   node.companylink=strText.Mid(from, to-from);

   pseek="\"blur()\">";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }
   from=to+strlen(pseek);

   pseek="<";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }

   node.company=strText.Mid(from, to-from);

   pseek="<td width=\"9%\">";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }
   from=to+strlen(pseek);

   pseek="<";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }

   node.area=strText.Mid(from, to-from);

   m_jobhistory.Add(node);
  }

  if (i==0)
  {
   char * pseek="<td><strong class=\"orareg\">";
   to=strText.Find(pseek, 0);
   if (to<0)
   {
    break;
   }
   from=to+strlen(pseek);

   pseek="/";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }
   from=to+strlen(pseek);

   pseek="<";
   to=strText.Find(pseek, from);
   if (to<0)
   {
    break;
   }
   
   end_si=atoi(strText.Mid(from, to-from).GetBuffer(0));
  }
 }

 if(m_hThread!=NULL)
 {
  CloseHandle(m_hThread);
  m_hThread=NULL;
 }
 return 0;
}


void CJobHistoryDlg::OnBnClickedButtonStart()
{
 CString str;
 GetDlgItemText(IDC_BUTTON_START, str);
 if (str.Compare(_T("开始"))==0)
 {
  SetTimer(1, 500, NULL);
  SetDlgItemText(IDC_BUTTON_START, _T("停止"));
 }
 else
 {
  KillTimer(1);
  SetDlgItemText(IDC_BUTTON_START, _T("开始"));
 }
}

//复制字符串到剪贴板
int g_CopyStringFromClipboard(CStringA & str)
{
 if(OpenClipboard(NULL))
 {
  USES_CONVERSION;
  HGLOBAL clipbuffer=NULL;
  char * dest_buffer=NULL;
  clipbuffer = GetClipboardData(CF_TEXT);
  if (clipbuffer!=NULL)
  {
   dest_buffer = (char*)GlobalLock(clipbuffer);
   memset(str.GetBuffer(0), 0, str.GetAllocLength());
   memcpy(str.GetBuffer(0), dest_buffer, min(strlen(dest_buffer), (str.GetAllocLength()-1)));
   GlobalUnlock(clipbuffer);
   str.ReleaseBuffer(-1);
  }
  CloseClipboard();
 }
 else
 {
  return -1;
 }

 return 0;
}


void CJobHistoryDlg::OnTimer(UINT_PTR nIDEvent)
{
 switch (nIDEvent)
 {
 case 1:
//   EmptyClipboard();
//   keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
//   Sleep(500);
//   keybd_event('c', MapVirtualKey('c', 0), 0, 0);
//   Sleep(500);
//   keybd_event('c', MapVirtualKey('c', 0), KEYEVENTF_KEYUP, 0);
//   Sleep(500);
//   keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
//   Sleep(50);

  {
   CStringA str;
   str.Preallocate(256);
   g_CopyStringFromClipboard(str);
   EmptyClipboard();
   if (str.GetLength()>0)
   {
    str.Trim(_T(' '));
    str.Trim(_T('\r'));
    str.Trim(_T('\n'));
    str.Trim(_T('\t'));
    USES_CONVERSION;
    m_content.SetWindowText(A2T(str.GetBuffer(0)));
    for (INT i=0; i<m_jobhistory.GetSize(); i++)
    {
     NODE & node=m_jobhistory[i];
     if (_stricmp(node.company, str.GetBuffer(0))==0 ||
      _stricmp(node.companylink, str.GetBuffer(0))==0 ||
      _stricmp(node.joblink, str.GetBuffer(0))==0)
     {
      CString strContent;
      strContent.Format(_T("%d-%d\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s"),
       (i+1)/10,
       (i+1)%10,
       A2T(node.job.GetBuffer(0)),
       A2T(node.company.GetBuffer(0)),
       A2T(node.joblink.GetBuffer(0)),
       A2T(node.companylink.GetBuffer(0)),
       A2T(node.area.GetBuffer(0))
       );
      m_content.SetWindowText(strContent);
      break;
     }
    }
   }
  }
  break;

 default:
  break;
 }

 CDialogEx::OnTimer(nIDEvent);
}

 

By: zhanyonhu

  评论这张
 
阅读(1268)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016