[爬虫小记] 优秀的requests模块

xiaoxiao2021-02-28  31

前言

    除了当初学习爬虫的时候用过urllib、urllib2,后来再没用过了。都是使用的requests,本文将记录一直以来个人使用  requests的经验总结。

正文

    import requests r = requests.get('http://www.baidu.com') print(r.status_code) #200 获取状态码 print(r.text) #常用,获取Unicode形式的response,默认以utf8解码为Unicode print(r.content) #获取字节形式的response,可供编码检测 print(chardet.detect(r.content)) #编码由原网页决定,这里的检测只是一定概率正确 # 如果r.text输出有乱码,说明网站非utf8编码,需修改response编码 r.encoding = 'gbk' # gbk , gb18030 等 myparams = {'name': 'lei', 'age': 222} #这个参数会以明文方式直接填充到url中:http://www.baidu.com/?age=222&name=lei #它是http请求中的QueryString requests.get('http://www.baidu.com',params=myparams) #data参数在post中传递表单,不会填充在url中,是http请求的body requests.post('http://www.baidu.com', data={'name': 'lei', 'age': 222}) #上传文件 with open(r'c:\words_v1.txt')as f: _file = {'file': f} requests.post('http://www.baidu.com', files=_file) #传入cookie (官方的写法较复杂,不必采用) requests.get('http://www.baidu.com',headers={'Cookie':'PSTM=1525659528; BD_UPN=12314753;'}) #取消ssl验证以访问https站点 requests.get('https://www.baidu.com', verify=False) #代理使用 _list = ["http://41.118.132.69:4433", "http://51.228.12.69:4423"] for i in _list: p = {'http': i} r = requests.get('https://www.baidu.com', proxies=p) if r.status_code == 200: # do something break #下载文件 ,iter_count 限制每次下载的字节数,逐块写入 with open(r'xx.png', 'wb')as f: for c in requests.get('http://xxx.com', stream=True).iter_content(1024): f.write(c) #保持会话 ,常用在模拟登录、登录以访问资源等情况 s = requests.session() #Session() 一样 #s 与直接用requests的大部分用法一致,如get post UA = {'User-Agent':'xxx'} s.headers = UA #或 s.headers.update(UA) #传入cookie 方式一 dict_cookie = dict(a='123', b='321') requests.utils.add_dict_to_cookiejar(s.cookies, dict_cookie) # 实际操作时这种方式也复杂,我们想要的是从浏览器中复制整个cookie字符串 # 到python代码中直接使用,而无需修改为字典形式,参见下面的方式 #传入cookie 方式二 s.get('http://www.baidu.com', headers={'Cookie': 'PSTM=1525659528; BD_UPN=12314753;'}) #但这种方式有个严重的问题,那就是在发起post请求的时候,携带的data/body会概率性发生数据丢失, 经尝试,py2和py3都有这个问题,所以最好还是使用第一种方式携带cookie,把从浏览器中复制出来的 cookie长串通过以下方法转成dict即可: def cookie_str_to_dict(s): ret = dict() item_str_lst = s.split(';') for i in item_str_lst: s_i = i.split('=') k,v = s_i[0].lstrip(' '),s_i[1] ret[k]=v return ret #持久化cookie import json with open('cookie.txt', 'wb') as f: cookie = s.cookies.get_dict() json.dump(cookie, f) #从文件加载cookie with open('cookie.txt') as f: cookie = json.load(f) s.cookies.update(cookie)

有高见请留言。

 

声明:本文章为个人对技术的理解与总结,不能保证毫无瑕疵,接收网友的斧正。

转载请注明原文地址: https://www.6miu.com/read-2613256.html

最新回复(0)