5.8 KiB
Raw Blame History

本节介绍如果访问网页。

✔️ d 模式

d 模式下使用get()方法访问网页。

📍 get()方法

该方法用于跳转到一个网址。
当连接失败时,程序默认重试 3 次,每次间隔 2 秒,可以通过参数设置重试次数和间隔。
d 模式下根据浏览器的状态,还可以通过重写check_page()方法实现自定义检查方式。

参数:

  • url目标 url
  • show_errmsg是否显示和抛出异常。默认不抛出连接错误会返回None
  • retry重试次数与页面对象的设置一致默认 3 次
  • interval重试间隔与页面对象的设置一致默认 2 秒
  • timeout连接超时时间

返回:bool类型,表示是否连接成功

from DrissionPage import WebPage

page = WebPage()
page.get('https://www.baidu.com')

📍 设置超时时间和重试参数

网络不稳定的时候访问页面不一定成功,get()方法内置了超时和重试功能。通过retryintervaltimeout三个参数进行设置。
其中,如不指定timeout参数,该参数会使用WebPagetimeouts属性的page_load参数中的值。

from DrissionPage import WebPage

page = WebPage()
page.get('https://www.163.com', retry=1, interval=1, timeout=1.5)

📍 设置加载策略

通过设置WebPage对象的page_load_strategy属性,可设置页面停止加载的时机。页面加载时,在到达超时时间,或达到设定的状态,就会停止,可有效节省采集时间。有以下三种模式:

  • 'normal':常规模式,会等待页面加载完毕。

  • 'eager':加载完 DOM 即停止加载。

  • 'none':完成连接即停止加载。

默认设置为'normal'

from DrissionPage import WebPage

page = WebPage()
page.set_page_load_strategy.set_eager()

✔️ s 模式

s 模式基于 requests因此可使用 requests 内置的所有请求方式,包括get()post()head()options()put()patch()delete() 。不过本库目前只对get()post()做了封装和优化,其余方式可通过调用WebPage内置的Session对象使用。

📍 get()方法

get()方法使用语法与 requests 的get()方法一致,在此基础上增加了重试设置参数。

参数:

  • url目标 url
  • show_errmsg是否显示和抛出异常默认不抛出连接错误会返回 None
  • retry重试次数与页面对象的设置一致默认 3 次
  • interval重试间隔与页面对象的设置一致默认 2 秒
  • timeout连接超时时间
  • **kwargs连接参数具体见 requests用法

返回:bool类型,表示是否连接成功,根据Response对象的status_code参数决定

s 模式的**kwargs参数与 requests 中该参数使用方法一致,但有一个特点,如果该参数中设置了某一项(如headers),该项中的每个项会覆盖从配置中读取的同名项,而不会整个覆盖。
就是说,如果想继续使用配置中的headers信息,而只想修改其中一项,只需要传入该项的值即可。这样可以简化代码逻辑。
与 requests 不一样,get()方法不返回Response对象以获取结果,处理返回结果的方式详见后面章节。

实用功能:

  • 程序会根据要访问的网址自动在headers中加入HostReferer
  • 程序会自动从返回内容中确定编码,一般情况无须手动设置
from DrissionPage import WebPage

page = WebPage('s')

url = 'https://www.baidu.com'
headers = {'referer': 'gitee.com'}
cookies = {'name': 'value'}
proxies = {'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
page.get(url, headers=headers, cookies=cookies, proxies=proxies)

📍 post()方法

此方法是用 post 方式请求页面。用法与get()一致。调用时,WebPage对象会自动切换到 s 模式。

参数:

  • url目标 url
  • data提交的数据可以是dictstr类型
  • json提交的数据可以是dictstr类型
  • show_errmsg是否显示和抛出异常默认不抛出连接错误会返回 None
  • retry重试次数与页面对象的设置一致默认 3 次
  • interval重试间隔与页面对象的设置一致默认 2 秒
  • **kwargs连接参数s 模式专用
from DrissionPage import WebPage

page = WebPage('s')
data = {'username': 'xxxxx', 'pwd': 'xxxxx'}

page.post('http://example.com', data=data)
# 或
page.post('http://example.com', json=data)

data参数和json参数都可接收strdict格式数据,即有以下 4 种传递数据的方式:

# 向 data 参数传入字符串
page.post(url, data='abc=123')

# 向 data 参数传入字典
page.post(url, data={'abc': '123'})

# 向 json 参数传入字符串
page.post(url, json='abc=123')

# 向 json 参数传入字典
page.post(url, json={'abc': '123'})

具体使用哪种,按服务器要求而定。

📍 其它请求方式

本库只针对常用的 get 和 post 方式作了优化,但也可以通过提取页面对象内的Session对象以原生 requests 代码方式执行其它请求方式。当然,它们工作在 s 模式。

from DrissionPage import WebPage

page = WebPage('s')
# 获取内置的 Session 对象
session = page.session
# 以 head 方式发送请求
response = session.head('https://www.baidu.com')
print(response.headers)

输出:

{'Accept-Ranges': 'bytes', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Length': '277', 'Content-Type': 'text/html', 'Date': 'Tue, 04 Jan 2022 06:49:18 GMT', 'Etag': '"575e1f72-115"', 'Last-Modified': 'Mon, 13 Jun 2016 02:50:26 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18'}