模拟浏览器发送请求的库,Python自带
urllib模块 | 调用的方法 | 说明 |
---|---|---|
urllib.request | urlopen(url) | 请求url,并返回请求url所有的内容 |
urlretrieve(url,path) | 请求url,并将url反馈的内容保存到path路径下 | |
urllib.parse | quote | url编码函数,将中文进行转化为%xxx |
unquote | url解码函数,将%xxx转化为指定字符 | |
urlencode | 给一个字典,将字典拼接为query_string,并且实现了编码的功能 |
urllib.request请求后反馈的response
response | 调用的方法 | 说明 |
---|---|---|
response | read() | 读取相应的内容,内容是字节类型 |
geturl() | 获取请求的url | |
getheaders() | 获取头部信息,列表里面有元素 | |
getcode() | 获取状态码 | |
readline() | 按行读取,放回列表,都是字节类型 |
get方式
- 构建请求头部信息(这是反爬第一步)
- 伪装自己的UA,让服务器认为你是浏览器在访问
- 构建请求对象:url = urllib.request.Request(url=url,headers=header)
其中header= {“User-Agent”: “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36”} - 请求链接:urllib.request.urlopen(request_url)
post方式
from urllib import request,parse
url = "https://fanyi.baidu.com/sug"
word = input(">>>:")
from_data={
"kw": word
}
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"}
# 伪装请求头
request_url = request.Request(url=url,headers=header)
# 表单数据处理
from_data = parse.urlencode(from_data).encode()
response = request.urlopen(request_url,data=from_data)
ret = response.read().decode()
print(ret)
发送请求的两种方式
- urlopen
urllib.request.urlopen() - opener
动态设置代理IP#创建一个handler handler = urllib.request.HTTPHandler() #通过handler创建一个opener opener = urllib.request.build_opener(handler) #构建请求对象 request = urllibb.request.Request(url = url,headers = headers) #发送请求 response = opener.open(request) # open 与 URLopen用法是一样的,只不过open用法更高级
from urllib import request url = "https://www.baidu.com/s?ie=UTF-8&wd=ip" #创建handler handler = request.ProxyHandler({"http":"需要配置的代理ip:代理ip的端口号"}) opener = request.build_opener(handler) headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"} request_url = request.Request(url,headers=headers) response = opener.open(request_url) with open("ip.html","wb") as f: f.write(response)
模拟cookie登陆
- 手动登陆后,通过fidder抓包工具获取登陆请求的链接以及登陆的请求数据
- 真实的模拟浏览器,当发送完post请求的时候,将cookie保存到代码中
from urllib import request from http import cookiejar # 真实的模拟浏览器,当发送完post请求的时候,将cookie保存到代码中 保存在opener中 # 创建一个cookiejar对象 cj = cookiejar.CookieJar() # 通过cookiejar创建一个handler handler = request.HTTPCookieProcessor(cj) # 根据handler创建一个opener opener = request.build_opener(handler) # 登陆请求的ajax的地址 post_url = "http://www.renren.com/" # 登陆需要的参数 formdata = {} # 请求头信息 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"} request_url = request.Request(post_url,headers=headers) response = opener.open(request_url) # 下面就可以爬取登陆之后的页面数据了
- 如果可以进行模拟登陆的话,cookie就从登陆中直接获取,若是模拟登陆不了的话,那么就在headers中加入登陆后的cookie值进行抓去登陆后的页面
requests
requests是urllib的一个封装
使用requests对对数据进行访问
安装:pip install requests
用来做什么:和urllib是同一个位置
headers = {}
data = {}
get请求
定制头部
requests.get(url,headers=headers,params=data)
post请求
定制头部
requests.get(url,headers=headers,data=data)
响应对象
r.text 字符串形式查看响应
r.content 字节类型查看响应
e.encoding 查看或者设置编码类型
r.status_code 查看状态码
r.headres查看响应头部
r.url 查看所请求的url
r.json() 查看json格式数据
import requests
#如果碰到会话相关的话题,首先要先创建一个会话
#往下所有的操作都是通过创建会话后的对象去访问
s = requests.Session()
post_url = ""
headers = {}
formdata = {}
res = s.post(url=post_url,headers=headers,data=format())