当前位置: 首页 > news >正文

网络爬虫(上)

网络请求:百度时一般输入网址https://www.baidu.com,将其称之为url:统一资源定位符。请求过程:客户端(web浏览器)向服务端发送请求,请求分为四部分:请求网址request url、请求方法request methods、请求头(伪装成正常用户)request header、请求体request body

爬虫的作用:数据采集、软件测试、抢票、网络安全、web漏洞扫描

网络爬虫的基本流程:url ->对url发送网络请求,获取网络请求的响应 ->解析响应,提取数据 ->保存数据

robots协议:通过一个名为 robots.txt 的文本文件,告诉网络爬虫哪些页面或文件可以被抓取,哪些不可以。并不是一个规范,是约定俗称的

超文本(不局限于文本,包括图片、音频、视频等)传输协议(HyperText Transfer Protocol,HTTP),并没有做传输的事情,数据的传输是交由TCP协议进行的。一种无状态的(不会存储用户的信息,即本次请求响应和下一次的请求响应是没有关系的,不会发生数据传递),以请求\应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。默认端口号是80

HTTPS协议:http+ssl(安全套接字层),ssl是对传输的内容进行加密,默认端口号是443。比http更安全,但是性能更低。

  • HTTP报文格式:
    • 起始行:描述请求或响应的基本信息
      • 请求行报文格式
        • 请求方法GET(向服务器要资源)、HEAD、PUT、POST(向服务器提交资源,表示对资源的操作) 空格 请求目标(通常是一个URI,标记了请求方法要操作的资源) 空格 版本号(表示报文使用的HTTP协议版本) 换行
      • 响应行报文格式
        • 版本号(表示报文使用的HTTP协议版本) 空格 状态码(一个三位数,用代码的形式表示处理的结果,比如200是成功,500是服务器错误) 空格 原因(作为数字状态码的补充,是更详细的解释文字,帮助人理解原因) 换行
    • 头部字段集合:使用Key-value形式更详细地说明报文,key 和value 之间用冒号分隔
    • 空行
    • 消息正文:实际传输的数据,不一定是纯文本,可以是图片、视频等二进制数据

  • HTTP请求的完整过程:当用户在浏览器输入网址回车后,网络协议做了哪些工作?第一、解析IP 地址。浏览器会从用户输入的网址中提取出域名,然后查询当前的域名对应的IP地址。如果之前浏览过并且没有过期,会直接返回缓存的地址;否则本机域名解析文件,如果之前没有配置过,可发起DNS(ip地址标注服务器)获取IP,可以向更上一级的DNS发起请求。第二、网络请求。首先建立TCP的三次握手,然后浏览器向应用服务器发起HTTP请求应用服务器收到请求后,开始处理用户请求,是想拿到一个资源还是进行修改呢,再以http 报文的形式返回浏览器,浏览器解析响应报文,渲染页面。没有其他响应后,进行TCP的四次挥手。
  • 百度首页实际上是由很多部分组成起来,html文本、css样式控制文字大小颜色、js行为包括鼠标点击、jpg图片
  • 网络通信的实际原理:一个请求只能对应一个数据包(文件),之后抓包可能会有很多个数据包,共同组成了这个页面。
  • 200成功;302跳转,新的url在响应的Location头中给出;303浏览器对于Post的响应进行重定向至新的url;307浏览器对于get的响应重定向至新的url;403资源不可用,服务器理解客户的请求,但拒绝处理它(没有权限);404找不到该页面;500服务器内部错误;503服务器由于维护或者负载过重未能应答,在响应中可能会携带Retry-After响应头,有可能是因为爬虫频繁访问url,使服务器忽视爬虫的请求,最终返回503响应状态码
  • user-agent:模拟正常用户    cookie:登录保持    referer:当前这一次请求是由哪个请求过来的   抓包得到的响应内容才是判断依据,elements中的源码是渲染之后的,不能作为判断标准。  
  • 一些基本的使用
    import requests
    #目标url
    url='https://www.baidu.com'#向目标url发送get请求
    response=requests.get(url)
    print(response) #<Response [200]>#打印响应内容
    #print(response.text)    #用text是因为这是一个网页,响应内容有乱码,requests模块会自动寻求一种解码方式去解码
    #如果就是想用text,那么可以将其编码设置为utf-8,response.encoding='utf-8'
    print(response.content.decode())    #会解码,不会乱码(默认utf-8解码)
    #使用requests库保存图片
    import requests
    #目标url,只获取某张图片需要右键在新标签页中打开图片,然后再右键检查
    url='https://ss2.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1659552792,3869332496&fm=253&gp=0.jpg'#向目标url发送请求,并获取响应
    res=requests.get(url)
    print(res.content)  #图片是二进制类型,所以使用content#保存响应
    with open('1.jpg','wb') as f:   #如果爬取文本、html等,可以将wb改为w,jpg也要改,如果是html就改成html,如果是文本就改为txt,如果是json就改为jsonf.write(res.content)
    import requests
    #目标url
    url='https://www.baidu.com'#向目标url发送get请求
    response=requests.get(url)#保存响应
    with open('baidu.html','w',encoding='utf-8') as f:f.write(response.content.decode())

    response.text和response.content的区别:text是返回str类型,content是返回bytes类型,可以通过decode()解码

  • import requests
    #目标url
    url='https://ss2.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1659552792,3869332496&fm=253&gp=0.jpg'
    res=requests.get(url)
    #response.url响应的url,有时候响应的url和请求的url并不一致
    print(res.url)
    #response.status_code响应状态码
    print(res.status_code)
    #response.request.headers响应对象的请求头
    print(res.request.headers)
    #response.headers响应头
    print(res.headers)
    #response.request._cookies 响应对应请求的cookie;返回cookieJar类型
    print(res.request._cookies )
    #response.cookies响应的cookie(经过了set—cookie动作,返回cookieJar类型
    print(res.cookies)
    #response.apparent_encoding响应对象的编码格式
    
  • 在前面爬取'https://www.baidu.com'百度首页代码这个例子里,我们发现爬取的数据并不全,这是因为:请求头中有很多字段,其中user-agent字段是必不可少的,表示客户端的操作系统以及浏览器的信息

  • TCP协议(Transmission control protocol)面向连接的,可靠的,基于字节流的传输层通信协议
    • 特点
      • 基于连接的,数据传输之前要建立连接
      • 双向传输
      • 字节流,不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
      • 流量缓冲,解决双方处理能力的不匹配
      • 可靠的传输服务,保证可达,丢包时通过重发机制实现可靠性
      • 拥塞控制,防止网络出现恶性拥堵
  • 确立连接:TCP三次握手

    • 同步通信双方初始序列号
    • 协商TCP通信参数
  • TCP四次挥手

http://www.dtcms.com/a/409937.html

相关文章:

  • 论文精读(六):微服务系统服务依赖发现技术综述
  • 农业推广网站建设企业商城网站建设价格
  • 教师做班级网站手机网站打开微信号
  • 司法审计师:在数字与法律之间行走的“侦探”
  • google drive 怎么断点续传下载?
  • 基于STM32单片机的温湿度臭氧二氧化碳检测OneNET物联网云平台设计
  • LeetCode 面试经典 150_哈希表_快乐数(45_202_C++_简单)(哈希表;快慢指针)
  • K8S部署的ELK分片问题解决,报错:unexpected error while indexing monitoring document
  • Atlas Mapper 教程系列 (7/10):单元测试与集成测试
  • 众智FlagOS 1.5发布:统一开源大模型系统软件栈,更全面、AI赋能更高效
  • 理解 mvcc
  • 【网络编程】TCP 粘包处理:手动序列化反序列化与报头封装的完整方案
  • 数据库MVCC
  • 如何用AI工具开发一个轻量化CRM系统(七):AI生成pytest测试脚本
  • qData:一站式开源数据中台
  • 国外中文网站排行在线图片编辑网站源码
  • [数据结构]优先级队列
  • ARM内部寄存器
  • Laravel + UniApp AES加密/解密
  • 5G开户时切片配置参数详解
  • 面向新质生产力,职业院校“人工智能”课程教学解决方案
  • wap网站如何做福建外贸网站
  • ElasticSearch-提高篇
  • 第6篇、Flask 表单处理与用户认证完全指南:从零到实战
  • Visual Studio 2013 Update 4 中文版安装步骤(带TFS支持)附安装包​
  • 珠海 网站建设注册安全工程师题库
  • 上手 cpp-httplib:轻量级 C++ HTTP 库的安装与实战指南
  • 突破文档型数据库迁移困境:金仓多模方案破解电子证照系统国产化难题
  • 网站手机客户端开发wordpress制造商单页
  • Net 》》C# 》》try finally 执行顺序