工作比较忙,最近才有点想法,复习下c++,抽空写一个类似网络爬虫的的小程序
遍历访问网站的每个页面
用map做唯一判断,成功的放入queue中
用socket写一个http的get请求来访问
条件控制还有许多地方可以改善
有些地方可以直接在程序中写死,需要提取出来作为变量或其他方式
正则表达式是最需要改进的地方,我用的是最简单的筛选
先放上来仅供参考,需要改进的地方很多
#include <iostream>
#include <iosfwd>
#include <fstream>
#include <regex>
#include <string>
#include <winsock2.h>
#include <map>
#include <queue>
//使用socket实现最简单的http协议访问,其中http协议直接写,
//初步了解了http协议的构成和简单实现
//下一步计划实现输入url,遍历查找下载页面上的jpg格式图片
using namespace std;
SOCKET sock;
//测试主机和端口
const char *testHostName="www.001bz.com";
const short testPort=80;
const string testPortChar="80";
//vector<string> vectormapurl;
//vector<string> vectorhtmlurl;
queue<string> queueHtmlUrl;
queue<string> queueMapUrl;
map<string,int> mapMapUrl;
int mapUrlInt;
map<string,int> mapHtmlUrl;
int htmlUrlInt;
string mapType=".jpg";
int fileNameInt;
//发送http请求包
bool sendHttpQuery(string sendQueryStr){
int n=0;
//初始化socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
cout << "建立socket失败! 错误码: " << WSAGetLastError() << endl;
return false;
}
sockaddr_in sa = { AF_INET };
n = bind(sock, (sockaddr*)&sa, sizeof(sa));
if (n == SOCKET_ERROR)
{
cout << "bind函数失败! 错误码: " << WSAGetLastError() << endl;
return false;
}
struct hostent *p = gethostbyname(testHostName);
if (p == NULL)
{
cout << "主机无法解析出ip! 错误吗: " << WSAGetLastError() << endl;
return false;
}
sa.sin_port = htons(testPort);
memcpy(&sa.sin_addr, p->h_addr, 4);// with some problems ???
//sa.sin_addr.S_un.S_addr = inet_addr(*(p->h_addr_list));
//cout << *(p->h_addr_list) << endl;
//连接
n = connect(sock, (sockaddr*)&sa, sizeof(sa));
if (n == SOCKET_ERROR)
{
cout << "connect函数失败! 错误码: " << WSAGetLastError() << endl;
return false;
}
//按照h