Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。

警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。

一、介绍

基于如下5点的requests模块

什么是requests模块?

  • requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。

为什么要使用requests模块?

  • 因为在使用urllib模块的时候,会有诸多不便之处,总结如下:

    1. 手动处理url编码
    2. 手动处理post请求参数
    3. 处理cookie和代理操作繁琐
  • 使用requests模块:
    1. 自动处理url编码
    2. 自动处理post请求参数
    3. 简化cookie和代理操作
    4. 本质就是封装了urllib3
  • 如何使用requests模块

    • 安装:pip install requests
    • 使用流程
      1. 指定url
      2. 基于requests模块发起请求
      3. 获取响应对象中的数据值
      4. 持久化存储
    # 各种请求方式:常用的就是requests.get()和requests.post()
    >>> import requests
    >>> r = requests.get('https://api.github.com/events')
    >>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
    >>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
    >>> r = requests.delete('http://httpbin.org/delete')
    >>> r = requests.head('http://httpbin.org/get')
    >>> r = requests.options('http://httpbin.org/get')

二、基于GET请求

  1. 基本请求

    import requests
    response=requests.get('http://dig.chouti.com/')
    print(response.text)
  2. 带参数的GET请求->params

    # 自己拼接GET参数# 在请求头内将自己伪装成浏览器,否则百度不会正常返回页面内容
    import requests
    response=requests.get('https://www.baidu.com/s?wd=python&pn=1',headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
    print(response.text)# 如果查询关键词是中文或者有其他特殊符号,则不得不进行url编码
    from urllib.parse import urlencode
    wd='egon老师'
    encode_res=urlencode({'k':wd},encoding='utf-8')
    keyword=encode_res.split('=')[1]
    print(keyword)
    # 然后拼接成url
    url='https://www.baidu.com/s?wd=%s&pn=1' %keywordresponse=requests.get(url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
    res1=response.text
    # params参数的使用# 上述操作可以用requests模块的一个params参数搞定,本质还是调用urlencode
    from urllib.parse import urlencode
    wd='egon老师'
    pn=1response=requests.get('https://www.baidu.com/s',params={'wd':wd,'pn':pn},headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
    res2=response.text#验证结果,打开a.html与b.html页面内容一样
    with open('a.html','w',encoding='utf-8') as f:f.write(res1)
    with open('b.html', 'w', encoding='utf-8') as f:f.write(res2)
  3. 带参数的GET请求->headers

    # 通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下
    Host
    Referer # 大型网站通常都会根据该参数判断请求的来源
    User-Agent # 客户端
    Cookie # Cookie信息虽然包含在请求头里,但requests模块有单独的参数来处理他headers={}内就不要放它了
    # 添加headers(浏览器会识别请求头,不加可能会被拒绝访问,比如访问https://www.zhihu.com/explore)
    import requests
    response=requests.get('https://www.zhihu.com/explore')
    response.status_code #500# 自己定制headers
    headers={'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36',}
    respone=requests.get('https://www.zhihu.com/explore',headers=headers)
    print(respone.status_code) #200
  4. 带参数的GET请求->cookies

    # 登录github,然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,无需输入用户名密码
    # 用户名:egonlin 邮箱767124330@qq.com 密码jiumo@123import requestsCookies={   'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc',
    }response=requests.get('https://github.com/settings/emails',cookies=Cookies) # github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制print('378533872@qq.com' in response.text) #True

三、基于POST请求

  1. 介绍

    # GET请求
    HTTP默认的请求方法就是GET* 没有请求体* 数据必须在1K之内!* GET请求数据会暴露在浏览器的地址栏中GET请求常用的操作:1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求2. 点击页面上的超链接也一定是GET请求3. 提交表单时,表单默认使用GET请求,但可以设置为POST# POST请求
    (1). 数据不会出现在地址栏中
    (2). 数据的大小没有上限
    (3). 有请求体
    (4). 请求体中如果存在中文,会使用URL编码!#!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据
  2. 发送post请求,模拟浏览器的登录行为

    # 对于登录来说,应该输错用户名或密码然后分析抓包流程,用脑子想一想,输对了浏览器就跳转了,还分析个毛线,累死你也找不到包
    # 自动登录github(自己处理cookie信息)
    '''
    一 目标站点分析浏览器输入https://github.com/login然后输入错误的账号密码,抓包发现登录行为是post提交到:https://github.com/session而且请求头包含cookie而且请求体包含:commit:Sign inutf8:✓authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==login:egonlinpassword:123二 流程分析先GET:https://github.com/login拿到初始cookie与authenticity_token返回POST:https://github.com/session, 带上初始cookie,带上请求体(authenticity_token,用户名,密码等)最后拿到登录cookieps:如果密码时密文形式,则可以先输错账号,输对密码,然后到浏览器中拿到加密后的密码,github的密码是明文
    '''import requests
    import re#第一次请求
    r1=requests.get('https://github.com/login')
    r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
    authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
    data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'317828332@qq.com','password':'alex3714'
    }
    r2=requests.post('https://github.com/session',data=data,cookies=r1_cookie)login_cookie=r2.cookies.get_dict()#第三次请求:以后的登录,拿着login_cookie就可以,比如访问一些个人配置
    r3=requests.get('https://github.com/settings/emails',cookies=login_cookie)print('317828332@qq.com' in r3.text) #True
    # requests.session()自动帮我们保存cookie信息import requests
    import resession=requests.session()
    #第一次请求
    r1=session.get('https://github.com/login')
    authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求
    data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'767124330@qq.com','password':'jiumo123'
    }
    r2=session.post('https://github.com/session',data=data,)#第三次请求
    r3=session.get('https://github.com/settings/emails')print('317828332@qq.com' in r3.text) #True
  3. 补充

    requests.post(url='xxxxxxxx',data={'xxx':'yyy'}) #没有指定请求头,#默认的请求头:application/x-www-form-urlencoed#如果我们自定义请求头是application/json,并且用data传值, 则服务端取不到值
    requests.post(url='',data={'':1,},headers={'content-type':'application/json'})requests.post(url='',json={'':1,},) #默认的请求头:application/jso

四、响应Response

  1. response属性

    import requests
    respone=requests.get('http://www.jianshu.com')
    # respone属性
    print(respone.text)
    print(respone.content)print(respone.status_code)
    print(respone.headers)
    print(respone.cookies)
    print(respone.cookies.get_dict())
    print(respone.cookies.items())print(respone.url)
    print(respone.history)print(respone.encoding)#关闭:response.close()
    from contextlib import closing
    with closing(requests.get('xxx',stream=True)) as response:for line in response.iter_content():pass
  2. 编码问题

    # 编码问题
    import requests
    response=requests.get('http://www.autohome.com/news')
    # response.encoding='gbk' #汽车之家网站返回的页面内容为gb2312编码的,而requests的默认编码为ISO-8859-1,如果不设置成gbk则中文乱码
    print(response.text)
  3. 获取二进制数据

    import requestsresponse=requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509868306530&di=712e4ef3ab258b36e9f4b48e85a81c9d&imgtype=0&src=http%3A%2F%2Fc.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F11385343fbf2b211e1fb58a1c08065380dd78e0c.jpg')with open('a.jpg','wb') as f:f.write(response.content)
    #stream参数:一点一点的取,比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的import requestsresponse=requests.get('https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo-transcode/1767502_56ec685f9c7ec542eeaf6eac93a65dc7_6fe25cd1347c_3.mp4',stream=True)with open('b.mp4','wb') as f:for line in response.iter_content():f.write(line)
  4. 解析json

    #解析json
    import requests
    response=requests.get('http://httpbin.org/get')import json
    res1=json.loads(response.text) #太麻烦res2=response.json() #直接获取json数据print(res1 == res2) #True

五、代码实践

1、爬取搜狗指定词条搜索后的页面数据

import requests
import os
#指定搜索关键字
word = input('enter a word you want to search:')
#自定义请求头信息
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',}
#指定url
url = 'https://www.sogou.com/web'
#封装get请求参数
prams = {'query':word,'ie':'utf-8'
}
#发起请求
response = requests.get(url=url,params=param)#获取响应数据
page_text = response.textwith open('./sougou.html','w',encoding='utf-8') as fp:fp.write(page_text)
  • 请求载体身份标识的伪装:

    1. User-Agent:请求载体身份标识,通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。可以通过判断该值来获知该请求的载体究竟是基于哪款浏览器还是基于爬虫程序。
    2. 反爬机制:某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。
    3. 反反爬策略:将爬虫程序的UA伪装成某一款浏览器的身份标识。

2、登录豆瓣电影,爬取登录成功后的页面数据

import requests
import os
url = 'https://accounts.douban.com/login'
#封装请求参数
data = {"source": "movie","redir": "https://movie.douban.com/","form_email": "15027900535","form_password": "bobo@15027900535","login": "登录",
}
#自定义请求头信息
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',}
response = requests.post(url=url,data=data)
page_text = response.textwith open('./douban111.html','w',encoding='utf-8') as fp:fp.write(page_text)

3、爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据

# -*- coding:utf-8 -*-import requests
import urllib.request
if __name__ == "__main__":#指定ajax-get请求的url(通过抓包进行获取)url = 'https://movie.douban.com/j/chart/top_list?'#定制请求头信息,相关的头信息必须封装在字典结构中headers = {#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',}#定制get请求携带的参数(从抓包工具中获取)param = {'type':'5','interval_id':'100:90','action':'','start':'0','limit':'20'}#发起get请求,获取响应对象response = requests.get(url=url,headers=headers,params=param)#获取响应内容:响应内容为json串print(response.text)

3、爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据

# -*- coding:utf-8 -*-import requests
import urllib.request
if __name__ == "__main__":#指定ajax-post请求的url(通过抓包进行获取)url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'#定制请求头信息,相关的头信息必须封装在字典结构中headers = {#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',}#定制post请求携带的参数(从抓包工具中获取)data = {'cname':'','pid':'','keyword':'北京','pageIndex': '1','pageSize': '10'}#发起post请求,获取响应对象response = requests.get(url=url,headers=headers,data=data)#获取响应内容:响应内容为json串print(response.text)

3、爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据

import requests
from fake_useragent import UserAgentua = UserAgent(use_cache_server=False,verify_ssl=False).random
headers = {'User-Agent':ua
}url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
pageNum = 3
for page in range(3,5):data = {'on': 'true','page': str(page),'pageSize': '15','productName':'','conditionType': '1','applyname':'','applysn':''}json_text = requests.post(url=url,data=data,headers=headers).json()all_id_list = []for dict in json_text['list']:id = dict['ID']#用于二级页面数据获取#下列详情信息可以在二级页面中获取# name = dict['EPS_NAME']# product = dict['PRODUCT_SN']# man_name = dict['QF_MANAGER_NAME']# d1 = dict['XC_DATE']# d2 = dict['XK_DATE']all_id_list.append(id)#该url是一个ajax的post请求post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'for id in  all_id_list:post_data = {'id':id}response = requests.post(url=post_url,data=post_data,headers=headers)#该请求响应回来的数据有两个,一个是基于text,一个是基于json的,所以可以根据content-type,来获取指定的响应数据if response.headers['Content-Type'] == 'application/json;charset=UTF-8':#print(response.json())#进行json解析json_text = response.json()print(json_text['businessPerson'])

转载于:https://www.cnblogs.com/jiumo/p/10457682.html

Python爬虫 — requests模块(1)相关推荐

  1. Python爬虫---requests模块的基本使用

    Python爬虫-requests模块的基本使用 基础 什么是爬虫? 就是通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程. 爬虫的分类 通用爬虫 抓取互联网中的一整张页面数据 聚焦爬虫 ...

  2. python爬虫requests模块

    读书使人充实,讨论使人机智,笔记使人准确-.凡有所学,皆成性格. ---- (英国)培根 文章目录 简单的代码实现 requests.text与requests.content的区别 通过对 resp ...

  3. Python爬虫requests模块在线生成请求头

    写爬虫的时候,请求头几乎是必写的,但是写起来有点繁琐,虽然不难,但是麻烦,所以这时候,一个自动生成请求头的方法就显得很重要了 在线生成请求头 https://curlconverter.com/ 使用 ...

  4. python 爬虫 requests模块 中的Cookies 验证 通过验证cookies模拟登陆豆瓣登陆

    在爬取某些数据时,需要进行网页的登陆,才可以进行数据的抓取工作.Cookies登陆就像很多网页中的自动登陆功能一样,可以让用户第二次登陆时不在需要验证账号和密码的情况下进行登陆.在requests模块 ...

  5. python怎么爬取Linux作业,Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗...

    介绍 本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容. 为了知道POST方法所需要传递的HT ...

  6. Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗

    介绍   本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容.   为了知道POST方法所需要传 ...

  7. 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案

    数据采集习题参考答案,会持续更新,点个关注防丢失.为了方便查找,已按照头歌重新排版,朋友们按照头歌所属门类查找实训哦,该篇为Python爬虫常用模块. 创作不易,一键三连给博主一个支持呗. 文章目录 ...

  8. python爬虫—Requests

    python爬虫-Requests 目录 python爬虫-Requests 一.Requests简介 1.requests简介 2.安装方式 二.GET请求 1.通用爬虫(全页面进行保存) text ...

  9. 【python】python爬虫requests库详解

    1.安装:pip install requests 简介:Requests是一个优雅而简单的Python HTTP库,与之前的urllibPython的标准库相比,Requests的使用方式非常的简单 ...

最新文章

  1. 今天看论坛,有这样一句话,深有同感,还是家里好
  2. 解决 VSCode 编写 C++11 代码报红问题
  3. 通过互联网启动Linux
  4. python程序设计知识点汇总_Python入门知识点汇总
  5. 掌握 Linux 调试技术
  6. BufferedImage操作图片笔记
  7. Qt_MsgBox 非常简单 自定义实现类似QMessageBox的弹窗 静态调用
  8. 设计模式——工厂模式 1
  9. steam (游戏平台)
  10. python 单例模式基本原则、使用场景、应用示例
  11. memcacheQueue队列
  12. 编程思想-编程范式-编程思想是一组世界观和方法论-(初识范式——程序王国中的世界观与方法论)...
  13. git: Cannot communicate securely with peer: no common encryption algorithm(s)
  14. win10无限蓝屏_Win10升级系统后蓝屏或无限重启解决办法
  15. Natural number
  16. Vue - 前段框架
  17. 莫队算法二(树上莫队cot2,Haruna’s Breakfast)
  18. 矩阵范数,向量范数,奇异值有什么用?
  19. 安超云荣获“国民云计算品牌”值得关注奖
  20. 技术选型系列 -- Redis VS Memcached

热门文章

  1. MacOs系统如何为应用程序(LOL、风暴英雄、Steam、企业微信等)添加麦克风权限(或其他权限)
  2. 盛派SDK开发公众号获取用户输入上下文
  3. 经典电影里的数学应用
  4. springboot家族之 DevTools 热部署(一)
  5. 安卓测试工程师必须了解
  6. 计算机职称论文算分,计算机职称论文写作技巧有哪些
  7. cocos掼蛋源码_打包Cocos2d-xproject为PC项目
  8. 引入Activiti配置文件activiti.cfg.xml
  9. 随笔-我的富二代同事们
  10. 人物志 | 360唐青昊:虚拟世界的越狱者