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

相关文章

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal