在爬虫开发中,request 模块或类扮演着至关重要的角色。以下是它主要的作用:
发起网络请求:这是 request 最基本的功能,通过它向目标网站发送 HTTP 请求,获取网页内容。可以指定请求方式(GET、POST 等),并能携带参数、数据、头部信息等。
处理响应结果:当服务器返回响应后,request 可以帮助解析响应内容,如文本、JSON 数据等,还可以检查状态码来判断请求是否成功。
管理会话(Session):有些网站需要登录或者保持会话状态,request 提供了会话管理功能,可以在多个请求之间共享 cookies 和其他上下文信息。
设置代理和超时:为了防止被封 IP 或者避免长时间等待无响应的请求,可以使用 request 设置代理服务器以及请求超时时间。
异常处理:在网络环境中,可能会遇到各种各样的问题,比如连接失败、DNS 解析错误等,request 支持捕获这些异常并进行相应的处理。
接下来来介绍一下简单的request使用和相关流程,让你秒入门。
编码流程
- 指定目标url
- 发起请求
- 获取响应数据
- 持久化存储
post和get
GET:将参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
POST:通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户无法直接看到这个过程。
get请求:
代码示例(简单的get为例):
import request
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
get直接将添加的参数都会反应在url中,用户可以直接看见。
print(r.url)
#http://httpbin.org/get?key2=value2&key1=value1
post请求:
想要发送一些编码为表单形式的数据,非常像HTML表单,只需传递一个字典给data参数。
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
反爬机制:
1. UA伪装
user-agent是请求的载体身份标识,有两种类型的标识:
- 浏览器请求
- 爬虫请求(会被防爬程序识别)
将爬虫请求伪装成浏览器请求,只要添加 HTTP 头部,传递一个 dict
给 headers
参数。
url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}#修改发起请求的UA
r = requests.get(url, headers=headers)
2. ajax动态数据
在通过request发起请求访问网页时,没有办法直接做到所见即所得,这是因为有些数据是通过非url请求得到的数据,即动态加载的数据。
要查询这些动态数据,则基于抓包工具捕获到地址栏的url所对应的数据包。
2.1. 检测动态数据
查询流程:
点击F12,打开检查
如果被全局查询成功了,那么就代表该数据为动态数据,也能找得到这个数据所对应的数据包。
2.2. 捕获动态数据
要获取动态数据,要对动态数据所在的包进行处理。
同样调用抓包工具(F12),对标头进行观察,可以得到url和其他重要参数。
将得到的信息进行requests请求,得到对应数据,流程如下:
- 首先请求url中包含参数,我们为了规范存储,保留主url,将参数封装得到参数字典中。
- 获取参数字典。
- 通过Request Method判断该采取的request请求方式。
- 避免反爬,顺便进行UA伪装。
对获取到的字符串要继续继续处理,因为这个字符串中含有大量格式以及非需要元素,我们要进行原始数据处理,获取真正所需数据。
利用json格式,将原字符串转换成列表存储的形式,利用列表遍历的方法,读取我们想要的部分。
通过观察数据格式进行选择:
import requests
#完整的url为https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0
url='https://movie.douban.com/j/search_subjects'
params={
'type':'movie',
'tag':'热门',
'page_limit':'50',
'page_start':'0'
}
headers={
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response=requests.get(url=url,params=params,headers=headers)
#字符串处理
response=response.json()
for movie in response['subjects']:
print(movie['title'],movie['rate'])
2.3. 密文数据
有些数据在全局搜索中搜索不到,但页面中的确含这个数据,那么这个数据为密文数据。即后台数据库中的数据并非直接显示为页面中的数据,而是后端数据经过js处理成页面中显示的数据。
如果有问题请批评指正,谢谢大家的阅读。下一个爬虫篇飞快更新中!!
标签:请求,get,url,movie,request,爬虫,Requests,数据,入门 From: https://blog.csdn.net/m0_73809878/article/details/145181646