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

2024-04-08 10:04

本文主要是介绍Python爬虫基础篇章(面试常问1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

 

这篇关于Python爬虫基础篇章(面试常问1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885272

相关文章

可视化实训复习篇章

前言: 今天,我们来学习seaborn库可视化,当然,这个建立在Matplotlib的基础上,话不多说,进入今天的正题吧!当然,这个是《python数据分析与应用》书中,大家有需求的可以参考这本书。 知识点: Matplotlib中有两套接口分别是pyplot和pyylab,即绘图时候主要导入的是Matplotlib库下的两个子模块(两个py文件)matplotlib.pyplot和matp

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

C++面试八股文:std::deque用过吗?

100编程书屋_孔夫子旧书网 某日二师兄参加XXX科技公司的C++工程师开发岗位第26面: 面试官:deque用过吗? 二师兄:说实话,很少用,基本没用过。 面试官:为什么? 二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用vector,需要随机插入和删除的时候可以使用list。 面试官:那你知道STL中的stack是如何实现的吗? 二师兄:默认情况下,stack使