科林Linux7_网络爬虫

一、爬虫

网络资源的下载工具,工作与万维网环境,持续获取网页网站中的网络信息。可持续的数据采集机器人

1、搜索引擎技术使用爬虫

2、数据分析、数据挖掘领域,需要爬虫进行数据准备

3、数据批处理、采集,大量获取某些网站中的网络资源 

爬虫进行数据准备截断,数据下载完毕、如何处理与爬虫无关,爬虫只负责下载

网站之间、网页之间是强关联的,通过超链接技术指向新的网页或网站。通过强关联特性,完成若干网页的拓扑跳转与处理

网页与网页之间有关联:出链接、入链接

理论上,通过一个有效的网页可以拓扑所有的网页。

爬虫在网页的工作:

1. 获取资源

2. 获取跳转地址(新链接)

二、网络资源的种类:

1. 文本资源(txt,html,shtm,xml)

2. 二进制数据(jpg,png,gif,bmp)

3. 音频数据(mp3)

4. 视频数据(mp4,rmvb,flv)

URL网络资源定位符,所有的网络资源,都有唯一的URL

三、关于B/S架构(浏览器/web服务器模型)

爬虫属于客户端,模拟浏览器行为,获取网站资源

使用http协议(基于TCP),只要获取了目标的端口和IP,可以直接对网站web服务进行连接

如果网站使用https协议(SSL),我们需要与网站进行安全连接openssl,否则无法与网站交互

① http协议的使用

② 正则表达式技术(html语言)

1)下载网页

2)提取关键数据

3)匹配更多新地址

爬虫的步骤:

1、下载资源

2、持续拓扑执行,获取若干资源

四、http下载

资源的下载流程(http 80,https 443):

(一)URL地址解析

1. 资源完整的URL

2. 协议类型

3. 网站域名

#include<netdb.h>
struct hostent* ent = gethostbyname(域名);
//ent->h_addr_list;地址表中存储指向服务的公网IP,大端序

4. 存储路径

5. 资源名

6. 端口

7. ip地址

//Analytical_url.c
#include<spider.h>int Analytical_url(url_t* url){int flag=0;//遍历下标int j=0;//写入下标int start_len;//协议头长度int fsize=0;//文件名长度char* array[]={"http://","https://",NULL};//初始化url中未使用数组bzero(url->save_path,1024);bzero(url->domain,1024);bzero(url->file,1024);bzero(url->ip,16);//判定协议类型if(strncmp(url->origin,array[0],strlen(array[0]))==0){url->type=0;url->port=80;start_len=strlen(array[0]);}else{url->type=1;url->port=443;start_len=strlen(array[1]);}//获取域名for(flag=start_len;url->origin[flag]!='/';flag++){url->domain[j]=url->origin[flag];j++;}j=0;//获取文件名长度for(flag=strlen(url->origin);url->origin[flag]!='/';flag--,fsize++);//获取文件名for(flag=strlen(url->origin)-fsize+1;url->origin[flag]!='\0';flag++){url->file[j]=url->origin[flag];j++;}j=0;//获取路径for(flag=start_len+strlen(url->domain);flag<strlen(url->origin)-fsize+1;flag++){url->save_path[j]=url->origin[flag];j++;}//获取ipstruct hostent* ent=NULL;if((ent=gethostbyname(url->domain))==NULL){printf("gethostbyname fail\n");exit(0);}inet_ntop(AF_INET,ent->h_addr_list[0],url->ip,16);printf("spider [1] Analytical_url:\norigin:%s\ndomain:%s\npath:%s\nfile:%s\nip:%s\nport:%d\ntype:%d\n",url->origin,url->domain,url->save_path,url->file,url->ip,url->port,url->type);
}

(二)网络初始化

//Net_initalizer.c
#include<spider.h>int Net_initalizer(){int sock;if((sock=socket(AF_INET,SOCK_STREAM,0))==-1){perror("sock create fail");exit(0);}printf("spider [2] sock create sucess\n");return sock;
}

(三)连接

//Connection_web.c
#include <spider.h>int Connection_web(int sock,url_t* url){//构造网络信息struct sockaddr_in webaddr;webaddr.sin_family=AF_INET;webaddr.sin_port=htons(url->port);inet_pton(AF_INET,url->ip,&webaddr.sin_addr.s_addr);if((connect(sock,(struct sockaddr*)&webaddr,sizeof(webaddr)))==1){perror("connection failed");exit(0);}printf("spider [3] connection sucess\n");return 0;
}

(四)资源下载

1. 构建请求头(http请求协议)

页面请求方式:GET POST 

请求资源权重:对于一个网页的性能和体验来讲,控制好请求发起的优先级是非常重要的,网络带宽是有限的,优先去加载重要的资源,让次要的资源延后,就可以让我们的网站体验提升一个台阶。

长链接:客户端主动连接,客户端主动断开

短连接:客户端主动连接,服务端主动断开,请求响应交互一次

#include<spider.h>int Create_request_str(char* request,url_t* node){bzero(request,4096);sprintf(request,"GET %s HTTP/1.1\r\n"\"Accept:text/html,application/sgtml+xml;q=0.9,image;q=0.8\r\n"\"User-Agent:Mozilla/5.0 (X11; Linux x86_64)\r\n"\"Host:%s\r\n"\"Connection:close\r\n\r\n"\,node->origin,node->domain);printf("spider [4] create_requeset:%s sucess\n",request);return 0;
}

2. 发送请求头

3. 服务器解析请求

4. 爬虫客户端读取响应

根据响应码,判断响应是否成功,成功则进入存储流程

响应头一般都小于8192,为了一次完整的读完响应头,第一次读直接读8192。会读到完整的响应头和一部分响应体

HTTP/1.1 响应码 响应信息\r\n

#include<spider.h>int Get_response_code(char* response){regex_t reg;regmatch_t match[2];int code;char str_code[10];bzero(str_code,10);char* reg_str="HTTP/1.1 \\([^\r\n]\\+\\?\\)\r\n";regcomp(&reg,reg_str,0);if((regexec(&reg,response,2,match,0))==0){snprintf(str_code,match[1].rm_eo-match[1].rm_so+1,"%s",response+match[1].rm_so);}sscanf(str_code,"%d",&code);return code;
}

5. 爬虫处理响应内容获取存储资源到磁盘

//Download.c
#include<spider.h>int Download(char* request,int sock,url_t* url){char buf[8192];char response[4096];bzero(buf,sizeof(buf));bzero(response,sizeof(response));int len;char* pos=NULL;int fd;//发送请求头if((send(sock,request,strlen(request),0))==-1){perror("first send request faile");return -1;;}printf("spider [5] send_requset sucess\n");//首次读取响应if((len=recv(sock,buf,sizeof(buf),0))==-1){perror("firsr recv failed");return -1;}if((pos=strstr(buf,"\r\n\r\n"))==NULL){printf("strstr error\n");return -1;}snprintf(response,pos-buf+4,"%s",buf);//提取响应头printf("spider [6] Get_response head:%s sucess\n",response);//提取响应码int code;code=Get_response_code(response);if(code==200){fd=open(url->file,O_RDWR|O_CREAT,0664);//写入部分write(fd,pos+4,len-(pos-buf+4));bzero(buf,sizeof(buf));while((len=recv(sock,buf,sizeof(buf),0))>0){write(fd,buf,len);}close(fd);printf("spider [7] %d download sucess\n",code);}else{printf("spider [7] %d download fail\n",code);close(sock);return -1;}close(sock);return 0;
}	

五、https下载

关于HHTPS协议,最大限度保证传输安全

openssl技术,可以完成https协议的安全认证

sudo apt-get install libssl-dev
sudo apt-get install libssl-docman SSL

http不安全,数据未加密保护,https如何改善?

1. https协议采用嵌套加密方式,最大限度保证传输安全

2. 通过认证,让客户端验证服务器的CA数字证书,看是否有效

加密:

密钥对。多个公钥和一个私钥构成,密文串由128位随机码组成,保证唯一性

私钥加密数据,公钥解密

对称加密:安全性低,适合加密大段数据,速度快

非堆成加密(RSA):安全性高,适合加密小段重要数据,速度慢

https 单向认证

gcc *.c -I ../include -lssl -lcrypto -o download
//Openssl_init.c
#include<spider.h>ssl_t* Openssl_init(int sock){ssl_t* ssl=NULL;if((ssl=(ssl_t*)malloc(sizeof(ssl_t)))==NULL){perror("malloc ssl faile");return NULL;}SSL_load_error_strings();//初始化错误处理函数SSL_library_init();//初始化ssl库函数OpenSSL_add_ssl_algorithms();//初始化加密散列函数ssl->sslctx=SSL_CTX_new(SSLv23_method());ssl->sslsock=SSL_new(ssl->sslctx);SSL_set_fd(ssl->sslsock,sock);//使用tcp sock设置安全套接字SSL_connect(ssl->sslsock);//发起https安全认证return ssl;
}

//Download.c
#include<spider.h>int Download(char* request,int sock,url_t* url,ssl_t* ssl){char buf[8192];char response[4096];bzero(buf,sizeof(buf));bzero(response,sizeof(response));int len;char* pos=NULL;int fd;if(ssl){//发送请求头if((SSL_write(ssl->sslsock,request,strlen(request)))==-1){perror("first send request faile");return -1;;}printf("spider [5] HTTPS send_requset sucess\n");//首次读取响应if((len=SSL_read(ssl->sslsock,buf,sizeof(buf)))==-1){perror("firsr recv failed");return -1;}if((pos=strstr(buf,"\r\n\r\n"))==NULL){printf("strstr error\n");return -1;}snprintf(response,pos-buf+4,"%s",buf);//提取响应头printf("spider [6] HTTPS Get_response head:%s sucess\n",response);//提取响应码int code;code=Get_response_code(response);if(code==200){fd=open(url->file,O_RDWR|O_CREAT,0664);//写入部分write(fd,pos+4,len-(pos-buf+4));bzero(buf,sizeof(buf));while((len=SSL_read(ssl->sslsock,buf,sizeof(buf)))>0){write(fd,buf,len);}close(fd);free(ssl);ssl=NULL;printf("spider [7] %d HTTPS download sucess\n",code);}else{printf("spider [7] %d HTTPS download fail\n",code);close(sock);free(ssl);ssl=NULL;return -1;}close(sock);	}else{...}return 0;
}	

五、持续拓扑与下载资源

种子URL

优化选项

1、DNS 优化

进程中自建缓存地址,便于后续的使用与访问,减少gethostbyname(开销大)的调用

2、去重优化

使用Hash表保存url,进行哈希去重。为了提高去重效率(哈希冲突),可以采用布隆过滤器。但是使用hash的内存占用问题无法解决

3、并发优化,线程池并发爬虫

获取更多时间片,提高爬虫的工作能力。随不能提高下载速度,但是可以多线程存储、多线程解析,缩减任务的完成时间

4、UA池 IP池

爬虫的抓取策略

可以用图改变爬虫的工作方式

反爬虫机制

反反爬虫

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode题练习与总结:二叉树的前序遍历--144

一、题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;roo…

数据资产的创新应用与未来展望:探讨数据资产在人工智能、物联网等新兴领域的应用前景,提出前瞻性的数据资产解决方案,为企业探索新的增长点,推动行业创新发展

目录 一、引言 二、数据资产在人工智能领域的应用 1、机器学习与深度学习 2、自然语言处理 3、计算机视觉 三、数据资产在物联网领域的应用 1、智能家居 2、工业物联网 3、智慧城市 四、前瞻性的数据资产解决方案 1、构建统一的数据管理平台 2、加强数据安全和隐私…

基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)

以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候&#xff0c;总是报错&#xff0c;因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y&#xff0c;当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时&#…

Linux-网络安全私房菜

文章目录 前言入门基本指令篇章字符集设置cdlsdatemkdirtouch-d-m 修改主机名rmshredrename重命名mv移动tar打包与压缩打包但是不压缩打包且压缩更新包文件解压对应的包 zip压缩文件命令cat查看显示行号交互写入&#xff08;追加&#xff09;显示空行 more和lesshead和tailhead…

期末复习---程序填空

注意&#xff1a; 1.数组后移 *p *(p-1) //把前一个数赋值到后一个数的位置上来覆盖后一个数 2.指针找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指针指向这个已经找到的最大位置&#xff1b;!!!!!!!!! } p; //因为开始没有next &#xff…

Web工程化

1、webpack 1.1 概念 一个前端打包器。 webpack 只识别javascript. 所以需要安装nodejs环境。 1.2 运行环境 Nodejs Nodejs 是运行JavaScript的环境。 因为nodejs发布了许多版本&#xff0c;在不同的技术栈下&#xff0c;需要使用不同的nodejs。 所以需要在电脑上安装n…

web应用技术-第十一次课后作业

验证过滤器进行权限验证的原理。 Filter过滤器&#xff1a;可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。一般完成登录校验、统一编码处理、敏感字符处理等通用操作。 定义&#xff1a;实现Filter接口 配置&#xff1a;WebFilter(urlPatterns"/*&qu…

常见VPS主机术语有哪些?VPS术语解析

常见VPS主机术语有哪些&#xff1f;本期为大家解析一下我们常见到的听到的VPS专业术语&#xff0c;帮助大家更轻松的了解VPS主机相关知识。 常见VPS主机术语 Apache – 世界上最流行的 Web 服务器软件。 CentOS – 旨在提供基于 Red Hat Enterprise Linux 的企业级操作系统的…

基于springboot+vue+uniapp的超市售货管理平台

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

考研生活day2--王道课后习题2.3.1、2.3.2、2.3.3

2.3.1 题目描述&#xff1a; 这题和曾经做过的LeetCode203.移除元素一模一样&#xff0c;所以我们就使用LeetCode进行书写&#xff0c;题目链接203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路 大家的第一反应肯定是根据书上所学的书写方法一样书写&…

【PB案例学习笔记】-26制作一个带浮动图标的工具栏

写在前面 这是PB案例学习笔记系列文章的第26篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

爬虫cookie是什么意思

“爬虫 cookie”指的是网络爬虫在访问网站时所使用的cookie&#xff0c;网络爬虫是一种自动化程序&#xff0c;用于在互联网上收集信息并进行索引&#xff0c;这些信息可以用于搜索引擎、数据分析或其他目的。 本教程操作系统&#xff1a;Windows10系统、Dell G3电脑。 “爬虫…

51-1 内网信息收集 - 内网资源探测

导语 在内网渗透过程中,通常需要利用各种技术来探测内网资源,为后续的横向渗透做准备。发现内网存活的主机及其详细信息可以帮助确定攻击方向和潜在的漏洞。 一、基于 ICMP 发现存活主机 ICMP(Internet Control Message Protocol,因特网控制消息协议)是 TCP/IP 协议簇的…

React+TS前台项目实战(二十二)-- 全局常用导出组件Export封装

文章目录 前言Export组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天我们来封装一个带导出图标的导出组件。 Export组件 1. 功能分析 通过传入链接地址&#xff0c;规定要跳转的导出页面&#xff0c;或是直接通过链接导出数据 2. 代码详细注释 // /c…

虚拟环境管理

虚拟环境 在使用 Python 时我们一般使用“pip install 第三方包名”来安装第三方包&#xff0c;但是由于pip的特性&#xff0c;系统只能安装每个包的一个版本。而在实际开发中&#xff0c;可能同时开发多个项目&#xff0c;如&#xff1a;上图有三个项目&#xff1b;每个项目需…

django学习入门系列之第三点《BootSrap初了解》

文章目录 初识BootStrap往期回顾 初识BootStrap BootSrap是什么&#xff1f; 是别人帮我们已写好的CSS样式&#xff0c;我们如果想要使用这个BootSrap&#xff1a; 下载BootStrap使用 在页面上引入BootStrap编写HTML时&#xff0c;按照BootStrap的规定来编写 自定制 官网&…

【UE5.1】Chaos物理系统基础——02 场系统的应用

目录 步骤 一、运用临时场&#xff08;外部张力&#xff09;破裂几何体集 二、使用构造场固定几何体集 步骤 在上一篇中&#xff08;【UE5.1】Chaos物理系统基础——01 创建可被破坏的物体&#xff09;我们已经创建了可被破碎的几何体集&#xff0c;在最后我们防止几何体集…

微信小程序简历Demo

微信小程序简历Demo 使用介绍最后获取源码 bilibili视频介绍 使用介绍 使用微信小程序实现的一个简历实现Demo 拖动马里奥&#xff0c;到指定Name下方 向上顶就可以显示对应的简历样式 点击头像可拨打电话 点击信息处可显示当前位置 最后 这是一个简单并且有趣的微信小程…

Renesas MCU使用SCI_I2C驱动OLED

目录 概述 1 软硬件 1.1 软件版本信息 1.2 OLED屏幕 1.2.1 OLED简介 1.2.2 SSD1306介绍 1.2.3 0.9寸OLED模块介绍 2 FSP配置项目 2.1 配置项目参数 2.2 生成项目文件架构 3 代码实现 3.1 I2C的库函数 3.1.1 R_SCI_I2C_Open() 3.1.2 R_SCI_I2C_Read() 3.1.3 R_SCI_…

谷粒商城篇章10 -- P262-P291/P295-P310 -- 订单服务(支付)【分布式高级篇七】

目录 1 页面环境搭建 1.1 静态资源上传到nginx 1.2 SwitchHosts增加配置 1.3 网关配置 1.4 订单模块基础配置 1.4.1 引入 thymeleaf 依赖 1.4.2 application.yml配置 1.4.3 bootstrap.properties配置 1.4.4 开启nacos注册发现和远程调用 1.5 修改各个页面的静态资源路…