Python爬虫之request模块

28
五月
2021

安装

在命令行窗口进行下载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YEBbt9qN-1622163185268)(C:\Users\26976\AppData\Roaming\Typora\typora-user-images\image-20210526165339211.png)]

GET请求

  • 最基本的get请求可以直接用get方法
response = request.get("http://www.baidu.com/")


response = requests.request("get", "http://www.baidu.com/")
  • 添加头部headers和参数
    • 如果想添加headers,可以传入headers参数来增加请求头中的headers信息
    • 如果要将参数放在url中传递,可以利用 params 参数

访问百度并传参到搜索框

#访问百度网站并将参数传进去,相当于在百度搜索咸鱼
import requests


url = "http://www.baidu.com/s?"
kw = {"wd": "咸鱼"}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

response = requests.get(url, params=kw, headers=headers)

# 查看响应内容,即网站源码。返回的是Unicode格式
print(response.text)

#查看响应内容,返回的是字节类型格式
print(response.content)

#查看完整url地址
print(response.url)

#查看响应头部字节编码
print(response.encoding)

#查看响应状态码
print(response.status_code)

--------------------------------------------------------------------------
......
 
......
 
'http://www.baidu.com/s?wd=%E9%95%BF%E5%9F%8E'
 
'utf-8'
 
200
  • ps
使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。

使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件

POST请求

  • post:将要处理的数据发送给服务器
response = requests.post("http://www.baidu.com/", data = data)

访问有道翻译

  • 访问有道翻译并且翻译
  • 当我们翻译时,查看源码的network字段,查看表单数据,可以发现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUcgflli-1622163185275)(C:\Users\26976\AppData\Roaming\Typora\typora-user-images\image-20210526195216696.png)]

import requests

form_data = {
    "i": "i love you",
    "from": "AUTO",
    "to": "AUTO",
    "smartresult": "dict",
    "doctype": "json",
    "keyfrom":"fanyi.web",
    "ue": "UTF-8",
    "typoResult": "true",
    "action": "FY_BY_REALTIME"
}

url = "https://fanyi.youdao.com/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

response = requests.post(url, data=form_data, headers=headers)
content = response.text
print(response.text)

代理

  • 如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求:
import requests
 
# 根据协议类型,选择不同的代理
proxies = {
  "http": "http://12.34.56.79:9527",
  "https": "http://12.34.56.79:9527",
}
 
response = requests.get("http://www.baidu.com", proxies = proxies)
print response.text
  • 也可以通过本地环境变量 HTTP_PROXYHTTPS_PROXY 来配置代理:
export HTTP_PROXY="http://12.34.56.79:9527"
export HTTPS_PROXY="https://12.34.56.79:9527"

私密代理验证

 
import requests
 
# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
proxy = { "http": "mr_mao_hacker:sffqry9r@61.158.163.130:16816" }
 
response = requests.get("http://www.baidu.com", proxies = proxy)
 
print response.text

用户访问机制

  • Web客户端验证,需要添加 auth = (账户名, 密码)
import requests auth=('test', '123456') response = requests.get('http://192.168.199.107', auth = auth) print response.text

Cookies 和 Session

Cookies

  • 如果一个响应中包含了cookie,那么我们可以利用 cookies参数拿到:
 import requests response = requests.get("http://www.baidu.com/") # 返回CookieJar对象:cookiejar = response.cookies # 将CookieJar转为字典:cookiedict = requests.utils.dict_from_cookiejar(cookiejar) print cookiejar print cookiedict
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> {'BDORZ': '27315'}

Session

  • 在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。

  • 会话能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。

  • 实现人人网登陆

import requests# 创建一个session对象,保存cookie值session = requests.session()headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# 用户名和密码data = {"email": "mr_mao_hacker@163.com", "password": "alarmchime"}# 发送用户名和密码的请求,并获取登录后的cookie值,保存在seesion里session.post("http://www.renren.com/PLogin.do", data=data)# session包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面response = session.get("http://www.renren.com/410043129/profile")print(response.text)

处理HTTPS请求 SSL证书验证

  • Requests也可以为HTTPS请求验证SSL证书:
#要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写)import requestsresponse = requests.get("https://www.baidu.com/", verify=True) # 也可以省略不写response = requests.get("https://www.baidu.com/")print response.text
  • 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError,据说 12306 证书是自己做的
import requestsresponse = requests.get("https://www.12306.cn/mormhweb/")print response.text

结果:

SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)
  • 改成这样就行了
response = requests.get("https://www.12306.cn/mormhweb/", verify = False)
TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员