返回顶部

2-request模块深入解析

那些地方会用到post请求;

  1 登陆,注册

  2 需要传输大文本的时候

http://www.cnblogs.com/wupeiqi/articles/6283017.html

  

 最基本post方法:

response = requests.post("http://www.baidu.com/", data = data)

 

传入data数据对于 POST 请求来说,我们一般需要为它增加一些参数。那么最基本的传参方法可以利用 data 这个参数。

百度翻译案例

需要传送的data

 

data = {
            'from': 'zh',
            'to': 'en',
            'query': self.query_string,
            'transtype': 'enter',
            'simple_means_flag': '3'
 }
import requests
import json

# 发送请求
# 提取数据

class fanyi(object):
    def __init__(self, query_sting):
        self.url = 'http://fanyi.baidu.com/v2transapi'
        self.query_string = query_sting
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
        }
        self.post_data = {
            'from': 'zh',
            'to': 'en',
            'query': self.query_string,
            'transtype': 'enter',
            'simple_means_flag': '3'
                }

    # 发送请求
    def send_request(self):
        response = requests.post(self.url,headers=self.headers,data=self.post_data)
        result = response.content.decode()
        return result

    # 提取数据

    def get_result(self,respoonse):
        dir_response = json.loads(respoonse)
        ret = dir_response["trans_result"]["data"][0]["dst"]
        print('{}中文的翻译的结果是:{}'.format(self.query_string,ret))
        return ret

    def run(self):
        response = self.send_request()
        result=self.get_result(response)


fan = fanyi('人生苦短,我用python')
fan.run()
View Code

 

代理(proxies参数)

如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求:

# 根据协议类型,选择不同的代理
proxies = {
  "http": "http://12.34.56.79:9527",
  "https": "http://12.34.56.79:9527",
}

 

简单的实例

import requests

url = 'http://www.baidu.com'
# 代理的格式
proxies = {
    'http': 'http://221.204.67.11:80'
}

r = requests.get(url=url, proxies=proxies)

print(r.status_code)

cookie和session区别:

  1 cookie数据存放在客户的浏览器上,session数据放在服务器上。
  2 cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
  3 session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
  4 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

带上cookie、session的好处:

  能够请求到登录之后的页面

带上cookie、session的弊端:

  一套cookie和session往往和一个用户对应
  请求太快,请求次数太多,容易被服务器识别为爬虫

  不需要cookie的时候尽量不去使用cookie

  但是为了获取登录之后的页面,我们必须发送带有cookies的请求

处理cookies 、session请求

  requests 提供了一个叫做session类,来实现客户端和服务端的会话保持。

使用方法:
  实例化一个session对象
  让session发送get或者post请求

  session = requests.session()
  response = session.get(url,headers)
  动手尝试使用session来登录人人网:
  http://www.renren.com/PLogin.do

案例1 创建一个session类,来保存cookie的值

第二次是登陆个人主页的时候自动保存了,上次登陆的cookie值,在这里通过提取主页的关键字,确定访问成功

import requests
import re

url = "http://www.renren.com/PLogin.do"

post_data = {"email":"18001225173", "password":"zhangbiao"}

session=requests.session()
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}

session.post(url,data=post_data,headers=headers)


r=session.get("http://www.renren.com/327550029/profile",headers=headers)
print(re.findall('张彪',r.content.decode()))
View Code

 

案例2 在请求的headers携带cookie取访问登陆后的页面

import requests

import re
url = 'http://www.renren.com/327550029/profile'
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
    "Cookie":'anonymid=j8k2lo0cxzvxt2; _r01_=1; springskin=set; depovince=BJ; ap=327550029; jebecookies=9ba25af9-0706-4623-9ea0-83d064f51d45|||||; JSESSIONID=abcWUIp_Z9JIM4_7ZqT9v; ick_login=dd642771-67fe-4c8d-8723-feba9f943b44; _de=4C18B740AFB5CCB88B0E53151F00BFFB; p=dc5a8371b38db2e3b0e8bea58df8a48b1; first_login_flag=1; ln_uact=18001225173; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=00c94770db65dae5760421d21b56b2361; societyguester=00c94770db65dae5760421d21b56b2361; id=960734501; xnsid=92bc34e3; loginfrom=syshome; jebe_key=2ff56a05-2652-4c54-8909-d01e81823bdf%7C82e55f2a2ce39101d6374a335abf18de%7C1509366690724%7C1%7C1509366686405; wp_fold=0',
}
response=requests.get(url=url,headers=headers)
print(re.findall('张彪',response.content.decode()))

 

案例 3 把cookies当做一个参数去访问登陆的页面

import requests

import re
url = 'http://www.renren.com/327550029/profile'
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
    }
cookies = 'anonymid=j8k2lo0cxzvxt2; _r01_=1; springskin=set; depovince=BJ; ap=327550029; jebecookies=9ba25af9-0706-4623-9ea0-83d064f51d45|||||; JSESSIONID=abcWUIp_Z9JIM4_7ZqT9v; ick_login=dd642771-67fe-4c8d-8723-feba9f943b44; _de=4C18B740AFB5CCB88B0E53151F00BFFB; p=dc5a8371b38db2e3b0e8bea58df8a48b1; first_login_flag=1; ln_uact=18001225173; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=00c94770db65dae5760421d21b56b2361; societyguester=00c94770db65dae5760421d21b56b2361; id=960734501; xnsid=92bc34e3; loginfrom=syshome; jebe_key=2ff56a05-2652-4c54-8909-d01e81823bdf%7C82e55f2a2ce39101d6374a335abf18de%7C1509366690724%7C1%7C1509366686405; wp_fold=0'
cookies = { i.split('=')[0]:i.split('=')[-1] for i in cookies.split('; ')}
response=requests.get(url=url,headers=headers,cookies=cookies)
print(re.findall('张彪',response.content.decode()))

 

  Requests也可以为HTTPS请求验证SSL证书:要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写)

import requests
response = requests.get("https://www.baidu.com/", verify=True)

# 也可以省略不写
# response = requests.get("https://www.baidu.com/")
print r.text

 

 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError,据说 12306 证书是自己做的:

 来测试一下:

import requests
r=requests.get("https://www.12306.cn/mormhweb/ ")
print(r.content.decode())

  

 如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。

import requests
r=requests.get("https://www.12306.cn/mormhweb/ ", verify=False)
# r=requests.get("https://www.12306.cn/mormhweb/ ")
print(r.content.decode())

 设置超时配合状态码判断是否请求成功

response = requests.get(url,timeout=10)
assert response.status_code == 200
# coding=utf-8
import requests
from retrying import retry

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"}

@retry(stop_max_attempt_number=3)
def _parse_url(url):
    print("*"*10)
    r = requests.get(url,headers=headers,timeout=5)
    assert r.status_code == 200
    return r.content.decode()

def parse_url(url):
    try:
        html = _parse_url(url)
    except:
        html = None
    return html

if __name__ == '__main__':
    # url = "https://www.baidu.com"
    url = "www.baidu.com"

    ret = parse_url(url)
    if ret is not None:
        print(ret[:100])
    else:
        print("error")
View Code

 json的使用

import json

# 把字典转换成json的格式
json.loads()

# 把json的数据转换成字典
json.dumps()

 爬取豆瓣的电影

找到豆瓣的返回的json数据

1 切换到手机的模式

2 获取json的数据地址

https://m.douban.com/rexxar/api/v2/subject_collection/movie_showing/items?os=ios&for_mobile=1&callback=jsonp1&start=0&count=18

 

 

import requests
import json


url = "https://m.douban.com/rexxar/api/v2/subject_collection/movie_showing/items?start=0&count=18"

response = requests.get(url)

# 这是一个字符串
r = response.content.decode()
# print(type(r))

# 把字符串转换成字典
dic_o = json.loads(r)
# print(type(dic_o))

with open('move.html','w') as f:
    f.write(json.dumps(dic_o,ensure_ascii=False,indent=2))

with open('move.html','r') as f:
    # 这里可以直接的print(f.read())打印的是字符串
    t = json.loads(f.read())
    print(type(t))
    print(t)
View Code

 

posted @ 2017-10-31 00:23  Crazymagic  阅读(322)  评论(0编辑  收藏  举报