使用http协议访问遍历访问下载网站的所有图片

本文介绍了一个使用C语言编写的简单网络爬虫程序,通过HTTP GET请求遍历网站页面,并利用正则表达式筛选出图片链接进行下载。程序使用socket实现网络通信,使用map存储已访问链接,通过队列管理待访问页面。目前程序存在优化空间,如条件控制、变量提取及正则表达式的改进。
摘要由CSDN通过智能技术生成

工作比较忙,最近才有点想法,复习下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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值