[Python][spider]基础知识


根据 spider技术验证过程中的一些技术文档整理,便于理解。

1、request和post

requests.get() 和 requests.post() 是 Python requests 库中用于发送 HTTP GET 和 POST 请求的函数。这两种请求类型在 HTTP 协议中有着不同的用途和行为,主要区别如下:

    1. 用途

GET 请求:
通常用于请求数据。
URL 中可以包含查询参数。
不应有副作用,即不应改变服务器上的资源状态。
通常用于获取、搜索或读取数据。

POST 请求:
通常用于提交数据到服务器,例如提交表单或上传文件。
请求体中可以包含要提交的数据。
可能有副作用,例如创建、更新或删除资源。

    1. 数据传输

GET 请求:
数据通过 URL 的查询字符串(query string)进行传输。
由于 URL 的长度有限制,所以 GET 请求通常不适合传输大量数据。

POST 请求:
数据通过请求体(request body)进行传输。
没有数据长度的限制(虽然服务器可能会有自己的限制),所以 POST 请求更适合传输大量数据。

    1. 缓存和安全

GET 请求:
可以被缓存。
通常不会包含敏感信息,因为它会显示在浏览器的地址栏或服务器的日志中。

POST 请求:
不会被缓存(除非特别指定)。
适合传输敏感信息,如密码或私密数据,因为数据不会显示在 URL 中。

    1. 幂等性

GET 请求:
是幂等的,即多次执行相同的 GET 请求,效果是一样的。

POST 请求:
通常不是幂等的,多次执行相同的 POST 请求可能会导致不同的结果(例如,多次提交表单)。

    1. 退化行为

GET 请求:
用户可以在浏览器地址栏中直接输入 URL 来执行 GET 请求。
浏览器通常会保留 GET 请求的历史记录。

POST 请求:
通常不能通过直接在浏览器地址栏中输入 URL 来执行。
浏览器不会保留 POST 请求的历史记录。

2、selenium和webdriver

browser = webdriver.Chrome(options=options)
self.browser = browser
self.browser_wait = WebDriverWait(self.browser, 10)
login_method_switch = self.browser_wait.until(expected_conditions.presence_of_element_located((By.CLASS_NAME, 'password-login-tab-item')))
login_method_switch.click()
username_input = self.browser_wait.until(expected_conditions.presence_of_element_located((By.ID, 'fm-login-id')))
username_input.send_keys(self.username)

browser 是一个 webdriver 实例,它代表了一个浏览器窗口或者一个浏览器标签页。在这个上下文中,browser 是通过 webdriver.Chrome(options=options) 创建的,意味着它是一个 Chrome 浏览器的实例。通过这个 browser 对象,您可以控制浏览器执行各种操作,比如打开网页、填写表单、点击按钮等。

例如,您可以使用 browser.get(‘https://www.example.com’) 来打开指定的网页,或者使用 browser.find_element_by_id(‘some-id’) 来查找页面上的某个元素。

browser_wait 是一个 WebDriverWait 对象。它的作用是设置一个显式的等待时间,以便 selenium 在执行某些操作之前等待页面上的元素出现或变为可交互状态。这对于自动化测试尤其重要,因为网页加载速度和元素出现的时间可能会受到网络条件、服务器性能、JavaScript 执行时间等多种因素的影响。

通过 browser_wait,您可以设置一个等待条件,比如等待某个元素出现,然后再执行下一步操作。这样,即使页面加载稍微慢一些,您的脚本也不会立即失败,而是会等待直到条件满足。

在您的代码中,您使用了 browser_wait.until() 方法来等待特定的条件发生。例如,expected_conditions.presence_of_element_located(…) 是一个条件,它告诉 selenium 等待直到页面上的某个元素出现。一旦这个条件满足,until() 方法就会返回该元素,然后您可以对该元素执行操作,比如点击或填写文本。

总结一下,browser 是您控制浏览器执行操作的接口,而 browser_wait 则帮助您等待页面上的特定条件满足,以确保您的自动化脚本能够稳定地执行。

3、xpath

xpath是一个xml解释语言,可以通过相关方法解析xml文件,html脚本就是xml类型的文件。
先安装lxml依赖,通过etree方法将html内容解析成tree类型,再通过xpath获取,获取的信息是list存储形式,可以通过list方式for循环打印。
简单介绍下xpath的语法:

方法解释
nodename节点名字
/当前节点位置
//所有子节点
.当前节点位置
..当前节点父节点
parrent:: *当前节点父节点
ancestor:: *当前节点所有父节点,祖先节点
child:: *当前节点所有孩子节点
@选择属性
position()获取节点位置
text()获取text文本

举例
在这里插入图片描述
一些常用xpath小实验

4、BeautifulSoup

这个方法可以帮助我们获取到某个元素的element,例如

html = ""
with open("demo.html", "r", encoding="utf-8") as f:
    html = f.read()

soup = BeautifulSoup(html, "lxml")
elements_by_data_spm = soup.find_all(attrs={'data-spm': 'filterbar'})

首先把html文件解析成一个变量,通过这个变量,应用BeautifulSoup方法解析。
此时的elements_by_data_spm变量是定位到属性是{‘data-spm’: ‘filterbar’}的元素
elements_by_data_spm所包含的是标签以及其子节点中的所有内容,这样可以根据一个属性标定到某个元素,可以再对其内部进行获取

elements_in_data_spm_class = elements_by_data_spm[0].find_all(
    attrs={'class': 'Filter--filterContentWrap--c6vc5yz'})

通过find_all获取到的是一个list,所以需要添加index[0],再对其内部的元素内容进行获取

而且可以使用get函数获取标定element的属性,和 ‘.’ 的方式区别

print(elements_in_data_spm_class.div)      #获取element其下的第一个div节点
print(elements_in_data_spm_class.get('class'))      #获取element所在标签的class属性

例如

<div data-spm="filterbar" class="Card--doubleCard--wznk5U4">
	<div>这是第一个div</div>
	<p>这是第一个p</p>
	<div>这是第二个div</div>
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝冰露

感谢老板打赏~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值