HTTP的请求与响应
HTTP是超文本传输协议
- Hyper Text Transfer Protocol, 超文本传输协议
– 超文本:超出普通文本,如网页就属于一种超文本
– 协议:互联网中通信时,计算机之间必须共同遵守的规定或规则
– 作用:用于网络服务器传输超文本到本地浏览器的传送协议 - HTTP协议是客户端发起请求,服务器回送响应
– HTTP请求中常用的是Get 和 Post 请求参数
HTTP协议的请求与响应
![](https://img.haomeiwen.com/i27313279/e4b748f2f4fb44b6.png)
HTTP协议的请求报文
-
一个HTTP请求由请求行(request line)、请求头部(request header)、空行和请求体4部分组成
• Accept:客户端可识别的响应内容类型列表
• Accept-Language:客户端可接受的自然语言
• User-Agent:产生请求的浏览器类型
• Host:请求的主机名
• Content-Type: 发送端发送的数据类型
HTTP中的Get与Post请求
- Get请求:从指定的资源请求数据(从服务器上获取数据)
– 不带参数的Get请求:http://www.baidu.com
– 带参数的Get请求:https://www.baidu.com/s?wd=python(参数(key=value格式)多个参数之间使用‘&’连接) -
Post请求:向指定的资源提交要被处理的数据(向服务器上传递数据)
参数不再写入URL,而是放入请求报文中进行传输
HTTP协议的响应报文
- 一个HTTP响应由状态行(response line)、响应头部(request header)、响应正文3部分组
-
状态码(status-code)是响应报文状态行中包含的一个3位数字,表明特定的请求是否被满足,如果未满足,原因是什么
使用Requests库获取网页源代码
Requests是一个简答优雅的python HTTP库
-
Requests 库是一个简洁且简单的处理HTTP请求的第三方库
– 安装Anaconda即可直接使用
– 导入Requests: import requests
Requests中的Get与Post请求
Get请求(不带参数) :requests.get('http://www.xxx.com')
Get请求(带参数):requests.get('http://www.xxx.com’, params={‘key1': 'value1'})
Post请求:
![](https://img.haomeiwen.com/i27313279/736d26d701389510.png)
- Get请求中使用params接收参数,Post请求中使用data接受参数
- Get请求或者Post请求都是可以携带参数, 参数通常写成字典的形式
Requests中的响应
![](https://img.haomeiwen.com/i27313279/789034e1ec102942.png)
判断状态码是否为200 response.raise_for_status()
避免乱码 response.encoding = response.apparent_encoding
使用Selenium模拟浏览器操作
Selenium 是一个浏览器自动化测试组件
Requests适合爬取网页的HTML文档信息,但无法解析CSS、JavaScript代码
• Selenium通过驱动浏览器,完全模拟浏览器操作
• 支持跨不同浏览器,平台和编程语言的自动化
• 由于selenium解析执行了CSS、JavaScript所以相对requests的爬虫效率要低
Selenium环境搭建
安装selenium:pip install selenium
安装浏览器驱动程序:查看浏览器的版本,根据浏览器与版本号下载
Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox:https://github.com/mozilla/geckodriver/releases
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
• 将解压得到的文件放到指定的文件夹中
– Windows系统: Anaconda安装目录下的Scripts文件夹
默认安装时:C:\ProgramData\Anaconda3\Scripts
– Mac系统:/usr/local/bin/
Selenium的用法
Selenium导入:from selenium import webdriver
![](https://img.haomeiwen.com/i27313279/6e053fb390612736.png)
打开目标网址:browser.get('https://dxy.cn/')
Selenium元素定位
• Selenium提供了8种定位的方式
• find_element():查找单个元素
• find_elements(): 查找多个元素,返回一个list
![](https://img.haomeiwen.com/i27313279/640c98b9221a0e43.png)
等待页面加载
• 当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载
• waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作
– 使用前导入:from selenium.webdriver.support.ui import WebDriverWait
– 创建browser时,设置全局元素等待超时的事件(隐式等待)
browser = webdriver.Chrome()
browser.implicitly_wait(10) # 表示查找元素时超时时间是10秒
element = browser.find_element(By.ID, 'kw')
模拟鼠标操作
• 使用webDriver提供的ActionChains类模拟鼠标事件
导入ActionChains类: from selenium.webdriver import ActionChains
调用ActionChains()类,将浏览器驱动browser传入:chains = ActionChains(browser)
• ActionChains提供的常用鼠标操作方法:
– 左击:chains.click(elem)
– 右击:chains.context_click(elem)
– 双击:chains.double_click(elem)
– 鼠标悬停:chains. move_to_element(elem)
模拟键盘操作
• 借助keys模块:
– 使用前先导入:from selenium.webdriver.common.keys import Keys
• 常用的键盘操作:
– elem.sendkeys("Python")
– elem.sendkeys(Keys.Back_SPACE)
– elem.sendkeys(Keys.CONTROL, 'c’)
elem.clear(): 清空内容
![](https://img.haomeiwen.com/i27313279/942ecb0a2303c821.png)
截图操作
- 整个窗口截图并保存:browser.get_screenshot_as_file(“./XXX.png")
- 指定元素截图并保存:
# 找到目标元素
elem = browser.find_element(By.ID, "kw")
# 截取搜索框元素
elem.screenshot(“./kw.png")
关闭浏览器
• 关闭当前窗口:browser.close()
– 常用于用例执行多窗口任务时,关闭某个窗口
• 关闭所有窗口: browser.quit()
– 用于所有操作完成时
– 同时会退出相关的驱动程序
网友评论