科林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、加强数据安全和隐私…

webpack源码解析---addEntry

addEntry EntryPlugin的注册 webpack会从入口开始解析依赖。 WebpackOptionsApply new WebpackOptionsApply().process(compiler, options); class WebpackOptionsApply {constructor () {}process () {// 注册 EntryOptionPlugin new EntryOptionPlugin().apply(compiler);}…

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

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

怎样才能更好地保护个人账号的安全

怎样才能更好地保护个人账号的安全 保护个人账号安全是网络安全的重要组成部分&#xff0c;以下是一些有效的措施来增强账号的安全性&#xff1a; 1. 使用强密码 复杂性&#xff1a;创建包含大小写字母、数字和特殊字符的密码。长度&#xff1a;密码至少应有12个字符长。唯一…

谈谈检测浏览器类型

前几天被问到如何检测浏览器类型&#xff0c;我突然发现我对此并不了解&#xff0c;之前的项目中也没有使用到过&#xff0c;只隐约记得通过一个自带的方法即可获取。所以今天特意来仔细补习一下。 核心&#xff1a;navigator.userAgent 1.正则表达式 2.引用外部库 3.判断浏…

【Android面试八股文】你知道什么是冷启动和热启动吗?你知道应用冷启动的全流程吗?你知道如何解决启动时候的黑白屏问题?

文章目录 一、冷启动、热启动的概念二、冷启动的流程冷启动启动流程:流程细节三、如何解决启动时候的黑白屏问题?一、冷启动、热启动的概念 在Android开发中,冷启动和热启动是两个重要的概念,它们描述了应用程序启动时不同的状态和表现: 冷启动(Cold Start): 冷启动指…

记一次kafka使用不当导致的服务器异常

一、背景 1.运维反馈服务器cpu高&#xff0c;且高达80% 2.经过排查发现kafka出现消息积压情况 3.使用的是springboot kafka框架 dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency…

Linux-网络安全私房菜

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

Android的悬浮时钟(一)

在Android&#xff0c;如果要悬浮在其他应用上方显示时钟或者其他界面的话是需要申请权限的。 首先在manifest中我们就要写自己要申请的权限SYSTEM_ALERT_WINDOW <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" /> 不同于请求照片或…

期末复习---程序填空

注意&#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 的企业级操作系统的…

mysql 主主HA高可用方案详解

1.环境准备&#xff1a; 主机&#xff1a;1921.4,1921.5 操作系统&#xff1a;centos 7.3 mysql数据库版本&#xff1a;mysql 5.7.13 浮动IP:1921.182 2.mysql 下载及解压安装配置 2.1 下载&#xff1a; #wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13-linu…

easyexcel 模板填充Excel数据,实现自定义换行及动态调整行高,并保持列表格式一致

pom依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version> </dependency><dependency><groupId>com.alibaba</groupId><artifa…

数据结构-线性表的应用

目录 前言一、有序表的合并1.1 顺序表实现1.2 单链表实现 二、稀疏多项式的相加和相乘2.1 稀疏多项式的相加2.2 稀疏多项式的相乘 总结 前言 本篇文章介绍线性表的应用&#xff0c;分别使用顺序表和单链表实现有序表的合并&#xff0c;最后介绍如何使用单链表实现两个稀疏多项…

基于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…