Python爬虫基础篇章(面试常问1)

news2024/11/28 22:33:52
如今信息技术的发展已经进入“数据”驱动的时代,通过对海量数据的处理,能够产生极大的科研和商业价值。网络爬虫的出现,将网络上的各种数据进行自动汇总,定制化产生需要的数据,是当今时代数据获取的重要来源。网络爬虫又称网页蜘蛛、网络机器人,是一种按照一定规则、自动请求万维网网站并获取数据的程序或脚本。
本系列会通过讲解网页的基本结构,然后介绍网页获取和网页解析的方法,最后通过两个综合案例,了解爬虫具体的实施过程。

Python爬虫的核心步骤大致是以下几步:发送请求、获取响应、解析内容以及保存数据。

  1. 发送请求
    爬虫首先需要向目标网站发送请求。这个请求通常是一个HTTP请求,它包含了请求的方法(如GET、POST等)、请求的URL、请求头(包含了一些关于请求的基本信息,如浏览器类型、用户代理等)以及请求体(如果是POST请求,这里会包含需要提交的数据)。在Python中,我们可以使用requests库来发送HTTP请求。
  2. 获取响应
    当目标网站接收到请求后,它会返回一个响应。这个响应包含了状态码(表示请求是否成功)、响应头(包含了一些关于响应的基本信息,如内容类型、内容长度等)以及响应体(即网站返回的数据,通常是HTML、JSON等格式)。在Python中,requests库会自动将响应内容保存在请求的响应对象中,我们可以通过该对象来获取响应的各种信息。
  3. 解析内容
    获取到响应体后,我们需要对其进行解析以提取出我们感兴趣的数据。解析的方法取决于响应体的格式。如果响应体是HTML格式,我们可以使用像BeautifulSouplxml这样的库来解析HTML并提取数据。如果响应体是JSON格式,我们可以直接使用Python的json库来解析。
  4. 保存数据
    提取出数据后,我们可能需要将其保存到本地或数据库中以便后续使用。在Python中,我们可以使用文件操作来将数据保存到本地文件,也可以使用像sqlite3pymysql这样的库将数据保存到数据库中。

本章的重点也就是发送请求这个过程,请求的方法(如GET、POST等)、请求的URL等,以及对输入url后的流程需要有一定的了解。

当输入URL后浏览器的简化历程:

  1. 解析URL:浏览器首先解析输入的URL,确定要访问的协议(如http或https、端口号、域名以及相应的路径信息等。
  2. DNS查询:浏览器会查询DNS(域名系统)服务器,将域名转换为与之相关联的IP地址。
  3. 建立TCP连接:浏览器使用解析得到的IP地址和端口号与目标服务器建立TCP(传输控制协议)连接。这通常包括一个“三次握手”过程,以确保双方都已准备好传输数据。
  4. 发送HTTP请求:一旦TCP连接建立,浏览器会构造一个HTTP请求报文,并通过TCP连接发送给服务器。这个请求报文中包含了请求方法(GET、POST等)、请求的URL、HTTP协议版本、请求头(可能包含浏览器类型、语言偏好、Cookie等信息)以及可能的请求体(对于POST请求)。
  5. 服务器处理请求:服务器接收到HTTP请求后,会根据请求的内容进行处理。这可能包括检索请求的资源(如HTML文件、图片、视频等)、运行服务器端的脚本(如PHP、Python等),以及生成动态内容。
  6. 返回HTTP响应:服务器处理完请求后,会构造一个HTTP响应报文并通过TCP连接发送回浏览器。响应报文中包含了HTTP状态码(如200 OK表示请求成功)、响应头(可能包含内容类型、缓存指令等信息)以及响应体(即请求的资源内容)。
  7. 浏览器解析和渲染:浏览器接收到HTTP响应后,会解析响应报文中的内容。如果响应体是HTML,浏览器会使用其内置的HTML解析器和CSS解析器来解析HTML文档和关联的CSS样式表,并构建DOM(文档对象模型)树和CSSOM(CSS对象模型)树。然后,浏览器会将DOM树和CSSOM树合并成一个渲染树,并根据渲染树来绘制网页内容。
  8. 执行JavaScript:如果网页中包含了JavaScript代码,浏览器会解析并执行这些代码。JavaScript可以修改DOM树和CSSOM树,从而改变网页的内容和样式。浏览器通常使用JavaScript引擎(如V8或SpiderMonkey)来执行JavaScript代码。
  9. 关闭TCP连接:当浏览器完成网页的渲染和执行JavaScript代码后,它会关闭与服务器的TCP连接(对于持久连接如Keep-Alive,连接可能会保持一段时间以便重用)。至此,输入URL后的整个流程就完成了。

这时需要注意这一过程中有一些常考的问题,例如,上述过程中涉及哪些通信协议呢?

  1. DNS 协议:当用户输入一个网址(如 www.baidu.com)时,浏览器首先需 要通过 DNS(域名系统)协议将域名解析为对应的 IP 地址。这个过程涉及到向 DNS 服务器发送查询请求,并由 DNS 服务器返回相应的 IP 地址。
  2. ARP 协议:在获取到服务器的 IP 地址后,浏览器需要与服务器建立 TCP 连 接。在此之前,浏览器需要知道服务器的 MAC 地址(物理地址)。这时,ARP (地址解析协议)就会被用来将服务器的 IP 地址解析为 MAC 地址。ARP 协议 通过广播的方式在本地网络中查询对应 IP 地址的 MAC 地址,如果找到了匹配 的 MAC 地址,就会将其缓存起来,并用于后续的通信。
  3. TCP/IP 协议:TCP(传输控制协议)和 IP(互联网协议)是互联网通信的基 础。在建立 TCP 连接时,会涉及到 TCP 协议的三次握手过程。一旦连接建立成 功,浏览器和服务器就可以通过 TCP 协议进行数据传输。IP 协议则负责将数据 包从源地址发送到目标地址。
  4. HTTP 协议:在浏览器和服务器建立连接后,浏览器会通过 HTTP(超文本 传输协议)协议向服务器发送请求,并接收服务器的响应。HTTP 协议定义了浏 览器和服务器之间的通信规则和格式。

讲完了关于网络URL请求的过程,接下来需要了解python发送请求的方法GET、POST,在python中可以使用request库来轻松发送GET和POST请求,并处理它们的响应

 getpost
数据传递方式请求的数据(如查询字符串)会附加在URL后面,并且可以被浏览器缓存和保存在历史记录中。因为数据是URL的一部分,所以它受到URL长度的限制。请求的数据是在HTTP请求的主体(body)中发送的,而不是URL中。这意味着POST请求可以用来发送大量数据,并且这些数据不会出现在URL中。
数据安全性由于数据是通过URL传递的,所以它容易被查看和记录。这使得GET方法不适合发送敏感信息(如密码)。由于数据是放在HTTP消息体中发送的,相对来说更加安全,虽然仍然需要加密(如使用HTTPS)来保护数据的传输。
幂等性和副作用是一个幂等操作,意味着多次执行相同的GET请求应该返回相同的结果,并且不应该引起服务器端状态的改变。不是幂等的,意味着多次发送相同的POST请求可能会导致不同的结果(比如重复创建资源)。通常,POST请求被用于提交表单、上传文件等可能改变服务器状态的操作。
缓存请求的结果通常会被浏览器和其他网络元素缓存,以便将来的请求可以快速获取到相同的结果。请求的结果通常不会被缓存,因为POST请求往往用于提交数据,而提交的数据可能会有所不同。
书签和浏览器历史请求的URL可以被加入书签,也可以在浏览器的历史记录中回看。请求的URL虽然可以出现在地址栏中,但由于其具有副作用(可能会改变数据),因此不适合被加入书签。
请求体限制没有请求体,数据必须放在URL的查询参数中。可以使用请求体,允许发送更多类型和格式的数据(例如JSON、XML等)。

发送get请求(样例):

import requests
url='https://movie.douban.com/j/new_search_subjects'
header={
    'User-Agent': 'Mozilla/6.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'

}
Param={
    'sort': 'U',
    'range': '0,10',
    'tags':'',
    'start': 0
}
resp=requests.get(url,params=Param,headers=header)
print(resp.text)

9ed0f43d45664358b79a7c86cc50c732.png

发送post请求(样例):

import requests
url= "https://movie.douban.com/j/new_search_subjects"
paylod={
    'i': '中国',
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'test',
    'salt': 'AUTO',
    'sign': 'AUTO',
    'lts': 'AUTO',
    'bv': 'AUTO',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'test',
    'action': 'test'
}
header={
    'User-Agent': 'Mozilla/6.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
resp=requests.post(url=url,data=paylod,headers=header)
print(resp.text)

ac454f8492ac4063aafb959681522357.png

发现结果中有乱码,增加charset=utf-8即可

import requests
url= "https://movie.douban.com/j/new_search_subjects"
paylod={
    'i': '中国',
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'test',
    'salt': 'AUTO',
    'sign': 'AUTO',
    'lts': 'AUTO',
    'bv': 'AUTO',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'test',
    'action': 'test'
}
header={
    'User-Agent': 'Mozilla/6.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
}
resp=requests.post(url=url,data=paylod,headers=header)
print(resp.text)

f6d45c85e7b14ca4b4335e971fad290b.png

成功完成get与post的测试

be8c2d6177f54f2db3257e7a2fbc55a6.jpeg

 

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

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

相关文章

《Market Insight:中国流程挖掘市场发展洞察(2023)》报告将于4月11日发布

流程挖掘市场虽然项目数量有所增加,但目前的中国市场依旧处于早期阶段。而伴随着生成式AI技术的发展,流程挖掘市场又将迎来的新的变革和机遇,RPA中国在调研中发现,诸多技术供应商在努力地拥抱生成式AI,以便于提升自身产…

3D渲染器原理及Python朴素实现

最近,我发现自己需要为即将进行的项目提供一些来自不同角度的低多边形 3D 模型的低分辨率精灵。 像这样的东西: 获得它们的可能方法包括: 学习一点 Blender在 WebGL 中制作编写我自己的渲染器 我对 Blender 的短暂经历已经让我受到了创伤&…

24 个Intellij IDEA好用插件

24 个Intellij IDEA好用插件 一. 安装插件 Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句,这也太智能了,还显示了每条语句使用频率。 原因是它学习了我的项目代码,总结出了我的代码偏好。 Key Promoter X 快捷键提示插件 …

CCIE-10-IPv6-TS

目录 实验条件网络拓朴 环境配置开始Troubleshooting问题1. R25和R22邻居关系没有建立问题2. 去往R25网络的下一跳地址不存在、不可用问题3. 去往目标网络的下一跳地址不存在、不可用 实验条件 网络拓朴 环境配置 在我的资源里可以下载(就在这篇文章的开头也可以下…

深入MyBatis的动态SQL:概念、特性与实例解析

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO,即普通的 Java 对象为数据库中的记…

【数据结构与算法】:快速排序和冒泡排序

一,快速排序 快速排序是一种比较复杂的排序算法,它总共有4种实现方式,分别是挖坑法,左右"指针"法,前后"指针"法,以及非递归的快速排序,并且这些算法中也会涉及多种优化措施…

IntelliJ IDEA 2024.1 更新亮点汇总:全面提升开发体验

IntelliJ IDEA 2024.1 更新亮点汇总:全面提升开发体验 文章目录 IntelliJ IDEA 2024.1 更新亮点汇总:全面提升开发体验摘要引言 IntelliJ IDEA 2024.1 的新增功能主要亮点全行代码完成 最终的支持 Java 22 功能新航站楼 贝塔编辑器中的粘滞线 人工智能助…

Ubuntu 20.04.06 PCL C++学习记录(十八)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.10.0,CMake版本为3.16 学习内容 PCL中实现欧式聚类提取。在点云处理中,聚类是一种常见的任务,它将点云数据划分为多…

Microbiome|北京林业大学生物多样性研究团队揭示土壤原核生物群落在推动亚热带森林植物多样性与生产力关系中的重要作用

生物多样性与生态系统功能(BEF)之间的关系是生态研究的重要课题之一。土壤微生物群落的变化可能是调节这种关系的关键因素之一。关于森林中真菌群落对树木多样性-生产力关系的影响,已有大量研究。然而,对于细菌和古细菌&#xff0…

第四届计算机、物联网与控制工程国际学术会议(CITCE 2024)

先投稿,先送审,先录用!快至投稿后三天录用! 第四届计算机、物联网与控制工程国际学术会议(CITCE 2024) The 4th International Conference on Computer, Internet of Things and Control Engineering(CITCE…

exe签名证书

我们需要明白什么是exe签名证书?exe签名证书是一种数字证书,用于对可执行文件(即.exe文件)进行数字签名。这种签名可以确保软件的完整性和来源,防止软件被恶意篡改。同时,它也提供了一种机制,使…

THREE.JS 数据纹理简明教程

我一直在研究从 Three.js 中的数据创建纹理。 这非常简单,但有一些注意事项,有些部分可能会令人困惑。 很多年前我曾陷入过一些陷阱,最近又再次陷入其中,所以我决定写下来! NSDT工具推荐: Three.js AI纹理开…

通过自动化部署消除人为操作:不断提高提交部署比率

三十年后,我仍然热爱成为一名软件工程师。事实上,我最近读了威尔拉森(Will Larson)的《员工工程师:超越管理轨道的领导力》,这进一步点燃了我以编程方式解决复杂问题的热情。知道雇主继续照顾员工、原则和杰…

222,完全二叉树的节点数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最…

2024/4/2—力扣—二叉树的最近公共祖先

代码实现: 思路: 递归判断左子树和右子树,查找p或者q是否在当前节点的子树上 1,在同一子树上,同一左子树,返回第一个找到的相同值,同一右子树上,返回第一个找到的相同值 2&#xff0…

ES学习日记(十一)-------Java操作ES之基本操作

前言 此篇博客还是一些基础操作,没什么可写的,需要的同学直接抄作业进行测试就可以 上一节写了连接和测试新增操作,这一节写java操作ES的基本操作,也就是增删改查,在这里补充一点知识,我们之前用了指定的索引进行指定添加 有一个情况是,如果我们指定了…

git提交代码时报错,提不了

问题 今天在换了新电脑,提交代码时报错 ✖ eslint --fix found some errors. Please fix them and try committing again. ✖ 21 problems (20 errors, 1 warning) husky > pre-commit hook failed (add --no-verify to bypass) 解决 通过 --no-verify 解决&…

✌2024/4/3—力扣—最长回文子串

代码实现: 解法一:动态规划——回文子串 char* longestPalindrome(char *s) {int n strlen(s);if (s NULL || n 0 || n 1) {return s;}int dp[n][n];memset(dp, 0, sizeof(dp));for (int i n - 1; i > 0; i--) { // 从下到上for (int j i; j &l…

C语言面试题之判定字符是否唯一

判定字符是否唯一 实例要求 实现一个算法,确定一个字符串 s 的所有字符是否全都不同 实例分析 1、使用一个大小为 256 的bool数组 charSet 来记录字符是否出现过;2、遍历字符串时,如果字符已经在数组中标记过,则返回 false&a…

SpringCloud Alibaba Sentinel 创建流控规则

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十四篇,即介绍 SpringCloud Alibaba Sentinel 创建流控规则。 二、基本介绍 我们在 senti…