Yandex.ru serp parser - парсер выдачи яндекса на с++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sert5vert, 14 Jun 2024.

  1. sert5vert

    sert5vert Member

    Joined:
    14 Jun 2024
    Messages:
    31
    Likes Received:
    10
    Reputations:
    0
    Yandex.ru serp parser - парсер выдачи яндекса на с++
    Code:
    #include <stdio.h>
    #include <curl/curl.h>
    #include <string>
    using namespace std;
    #include <wx/stattext.h>
    #include <wx/wx.h>
    //////
    
    
    size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
        size_t written = fwrite(ptr, size, nmemb, stream);
        return written;
    }
    
    int http_request()
    {
     
    
    for(int i {1}; i < 4; i++)
        {
       
    char nameOfFile[12];
       sprintf(nameOfFile, "%d.html",i);
    
       CURL *curl = curl_easy_init();   
     
           if(curl) {
            const char *data1 = "?text=music&search_source=dzen_desktop_safe&lr=65&p=5";
       CURLcode res;
       FILE *fp;
    
            curl_easy_setopt(curl, CURLOPT_URL, "https://yandex.ru/search");
            curl_easy_setopt (curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0");
            /* size of the POST data */
            curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(data1));
    
            /* pass in a pointer to the data - libcurl will not copy */
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data1);
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    
     
            fp = fopen(nameOfFile,"wb");
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    
           /* Perform the request, res will get the return code */
           res = curl_easy_perform(curl);
           /* Check for errors */
           if(res != CURLE_OK)
             fprintf(stderr, "curl_easy_perform() failed: %s\n",
                  curl_easy_strerror(res));
    
    
       
            }
      curl_easy_perform(curl);     
             sleep(2);
        }
     
    
        return 0;
    }
    
    ///////
    
    
    
    class MyApp : public wxApp
    {
    public:
        bool OnInit() override;
    };
    wxIMPLEMENT_APP(MyApp);
    class MyFrame : public wxFrame
    {
    public:
        MyFrame();
    private:
        void OnHello(wxCommandEvent& event);
        void OnExit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        void OnButton1Click1(wxCommandEvent& event);
    };
    enum
    {
        ID_Hello = 1,
        ID_NAME_TEXTCTRL_EX = 11001,
        ID_AGE_SPINCTRL_EX,
        ID_SALARY_TEXTCTRL_EX,
        ID_MARITAL_CHECKBOX_EX,
        ID_SKILLS_LISTBOX_EX
    };
    bool MyApp::OnInit()
    {
        MyFrame *frame = new MyFrame();
        frame->Show(true);
        return true;
    }
    
    void MyFrame::OnButton1Click1(wxCommandEvent& event){
        wxMessageBox("This is a wxWidgets Hello World example",
                     "About Hello World", wxOK | wxICON_INFORMATION);
    }
    MyFrame::MyFrame()    : wxFrame(nullptr, wxID_ANY, "Hello World")
    {
        wxMenu *menuFile = new wxMenu;
        menuFile->Append(ID_Hello, "&Parsing page...\tCtrl-H",
                         "Help string shown in status bar for this menu item");
        menuFile->AppendSeparator();
        menuFile->Append(wxID_EXIT);
        wxMenu *menuHelp = new wxMenu;
        menuHelp->Append(wxID_ABOUT);
        wxMenuBar *menuBar = new wxMenuBar;
        menuBar->Append(menuFile, "&File");
        menuBar->Append(menuHelp, "&Help");
        SetMenuBar( menuBar );
        wxString *m_text = new wxString;
        m_text->Append("sfs12312");
    
    // label
    wxStaticText * name_label = new wxStaticText(this, wxID_ANY, _("Name:"));
    // input
    wxTextCtrl * name_textctrl = new wxTextCtrl(this, ID_NAME_TEXTCTRL_EX, wxEmptyString,
            wxDefaultPosition, wxSize(150,40));
    // listBox
    wxArrayString skills;
        skills.Add(wxT("C/C++"));
        skills.Add(wxT("C#"));
        skills.Add(wxT("Delphi"));
        skills.Add(wxT("Visual Basic"));
        skills.Add(wxT("ASP.NET"));
        skills.Add(wxT("SQL"));
        wxListBox * skills_listbox = new wxListBox(this, ID_MARITAL_CHECKBOX_EX,
            wxDefaultPosition, wxDefaultSize, skills, wxLB_MULTIPLE);
    
    // menu
    
        Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
        Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
        Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
    
    }
    
    
    
    void MyFrame::OnExit(wxCommandEvent& event)
    {
        Close(true);
    }
    void MyFrame::OnAbout(wxCommandEvent& event)
    {
        wxMessageBox("This is a wxWidgets Hello World example",
                     "About Hello World", wxOK | wxICON_INFORMATION);
    }
    void MyFrame::OnHello(wxCommandEvent& event)
    {
        wxLogMessage("Page loaded");
        http_request();
    }
    
    
    компилируется на убунту 24.04 так в терминале:
    нужно установить бибилотеку wxWdigets в операционную систему.

    Программа работала. Еще нужно подключить к курл разгадывание капчи, но я не знаю, как это делается. Плюс, странно, 7 дней назад программа работала, а сейчас она возвращает пустую выдачу яндекса, будто пост, гет-запросы не отправляются к форме поиска. Почему так?

    p.s: если добавить регулярные выражения, то из этих исходных кодов, можно сделать "чекер позиций сайтов в поисковой системе Яндекс".
     
    #1 sert5vert, 14 Jun 2024
    Last edited: 16 Jun 2024
  2. sert5vert

    sert5vert Member

    Joined:
    14 Jun 2024
    Messages:
    31
    Likes Received:
    10
    Reputations:
    0
    Выдает такой код хтмл, при попытке работы программы на линукс.
    [​IMG]

    Как курл ом получить результат выдачи яндекса?