网络爬虫初探

网络爬虫作为一个在网络中搜索数据的神器,在接下来的一系列文章中我会持续跟新,实现的语言使用C++,权当做是把丢掉多年的C++再重新捡起来。

数据获取利器之网络爬虫
1、什么是网络爬虫
网络爬虫是一种可以按照一定的规则,自动抓取网页上内容的程序或者脚本。通过对抓取到的内容进行分析,就可以得到感兴趣的数据。
如今的我们生活在一个大数据时代,大数据的应用就显得非常重要,而这一切的前提是你得有数据。如今的互联网中包含着体积量巨大的数据,网络爬虫就是可以从互联网中获得数据的一种工具。我们可以使用网络爬虫,从互联网中获得我们想要的数据,对数据进行分析、研究,从中获得结论。对于这样一个很酷炫、对大数据研究很有帮助的一款工具,在本文中会为大家介绍网络爬虫工作流程。
3、网络爬虫的工作流程
网络一般可以分为三个部分:数据获取、数据分析、数据存储。
3.1数据获取
数据获取就是通过一个原始的Url,获得这个Url指向的网页中的内容,并从这个内容中抽取新的Url,在进行获得、抽取,依次类推。网络爬虫的数据获取更像是数据搜索,只不过搜索的是包含在网页中的Url。常见的搜索策略有深度优先搜索策略、广度优先搜索策和最佳优先搜索策略。如图1所示,利用深度优先搜索策略的结果为A、B、D、E、C、F,利用广度优先搜索策略搜索的结果为A、B、C、D、E、F。其中的深度优先策略容易使爬虫陷入死循环中。比如图2。最佳优先搜索策略需要做一些网页分析的工作,预测候选的网页中与目标网页的相似度,相似度最高的一些网页进行抓取。由于深度优先策略的短板,比较常用的是广度优先策略和最佳优先策略。在在使用最佳优先策略中,又衍生出各种网页分析方法,网页分析算法可以归纳为基于网络拓扑、基于网页内容和基于用户访问行为三种类型。

这里写图片描述
图 1 搜索略树

3.2 数据分析与存储
这里的数据分析是对抓取到的html网页或者json数据进行分析,通常会利用用来解析html、json数据格式的相应工具与正则表达式来完成。这样就能获得到我们预期想要的数据,比如邮箱、电话、地址等数据。解析后的获得的数据就可以保存在数据库或者文件中。这样就可以获得数据,用这些数据我们对数据进行分析,从而得到我们想要的结果。

就先介绍到这,下面是代码,这里的代码是只可以获得网页中的内容,以及获得超链接,里面还有许多需要优化的地方在后面我回继续优化!

#include <WinSock2.h>
#include<iostream>
#include <string>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <regex>
using namespace std;
#pragma comment(lib,"ws2_32.lib")

bool SatrtWSA()//启动Socket库
{
    WSADATA wsdata;
    WSAStartup(MAKEWORD(2,0),&wsdata);
    if (LOBYTE(wsdata.wVersion) != 2 || HIBYTE(wsdata.wVersion) != 0)
    {
        WSACleanup();
        return false;
    }
    return true;
}

bool GetSrcFormUrl(string url,string name)
{
    vector<char> *con=new vector<char>;
    SOCKET netsocket=socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(80);
    hostent *p=::gethostbyname("www.csdn.com");
    memcpy(&addr.sin_addr,p->h_addr,4);
    if (connect(netsocket,(const sockaddr *) &addr,sizeof(addr))==-1)
    {
        cout<<"链接错误"<<endl;
    }
    int port = 80;
    string request = "GET " + name + " HTTP/1.1\r\nHost:" + url + "\r\nConnection:Close\r\n\r\n";
    if (send(netsocket,request.c_str(),request.size(),0)==-1)
    {
        cout<<"发送错误"<<endl;
    }
    string path;
    if (regex_match(url,regex(".jpg")))
    {
        path=url+".gif";
    }else{
         path=url+".txt";
    }       
    fstream fs(path,ios::out|ios::binary);
    char buffer[1024];
    int n=0;
    while((n=recv(netsocket,buffer,sizeof(buffer)-sizeof(char),0))>0)
    {
        for (int i=0;i<n;i++)
        {
            con->push_back(buffer[i]);
        }

        fs.write(buffer,n);
    }
    try {
        string ss;
        ss.insert(ss.begin(),con->begin(),con->end());
        ///ss+="saturday";
        cout<<ss<<endl;

        regex reg("\"(https?:)?//\\S+\"");
        smatch r3;
        sregex_token_iterator tit(ss.begin(), ss.end(), reg);
        sregex_token_iterator tend;
        for(; tit != tend; ++tit)
        {
            string ss=tit->str();
            cout << ss << endl;
        }
        cout<<boolalpha<<regex_match(ss,r3,reg)<<endl;;
        cout<<"r3匹配结果:"<<r3.str()<<endl;
    } 

    catch (const std::regex_error& e) {
        std::cout << "regex_error caught: " << e.what() << '\n';
        if (e.code() == std::regex_constants::error_brack) {
            std::cout << "The code was error_brack\n";
        }
    }
    fs.close();
    closesocket(netsocket);
return true;
}

void main()
{
    SatrtWSA();

    GetSrcFormUrl("http://spikeking.blog.51cto.com/5252771/1387957","200");
    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值