pip install requests

进行简单的操作

发送一个get请求

# 发送请求
import requests
response = requests.get('http://httpbin.org/get')
# 获取返回的html信息
print(response.text)

这样就发送了一个get请求,并且还打印了返回的内容,这个不再需要知道网页是哪个编码的,不过有时会出现编码问题,但是你也可以指定编码类型,如:

response.encoding = 'utf-8'

指定完成后就可以正常编码了,前提你得知道网页的编码类型。

出了上面这些,我们还可以获取下面的信息

print(response.headers)#获取头部信息
# 请求状态码
print(response.status_code)
# 获取网页的二进制内容
print(response.content)
print(response.url) # 获取请求的url
print(response.cookies) # 获取cookie

是不是觉得很容易,一行代码就可以了。不再需要几步代码什么的了。

接下来被反爬的话带上个请求头来进行请求

# 还可以添加请求头进行请求
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
response = requests.get('http://httpbin.org/get', headers=headers )
print(response.headers)
print(response.text)

加个请求头也就是加个关键字参数而已

还可以进行带参数的get请求

# 进行带参数的get请求
data = {'name': 'june', 'password': 123456}
response = requests.get('http://httpbin.org/get', params=data)
print(response.text)

那如果需要登陆呢?post请求怎样发?告诉你,照样很简单

# 进行post请求
data = {'name': 'june', 'password': 123456}
response = requests.post('http://httpbin.org/post', data=data, headers=headers)
print(response.text)

是不是很简单,也是加个data关键字参数,把要提交的登陆参数进行post上去。

那除了上面的两个请求,还能进行别的请求吗?我可以非常开心地告诉你,可以的。比如,你要发个put请求,如这样

requests.put()
requests.delete()

这个就是发送put请求和delete请求的,其他的请求也是这样发送,就不一 一说了。

进行复杂点的请求

在登陆的时候我们有时候需要输入验证码,那怎样输呢?爬虫的看不了网页,最简单的做法就是把这个验证码的图片下载下来然后手动输入,那么我们怎样下载呢?我们可以向这个图片的url发送请求,然后把返回内容以二进制方法存入文件里面就可以了。

代码如下:

# 从网上读取二进制数据,比如图片
response = requests.get('https://www.baidu.com/img/bd_logo1.png', headers=headers)
# 这个是直接获取字节码,这个是要保存的文件
print(response.content)
# 这个是获取解码后的返回内容,这个是乱码
print(response.text)
# 用文件来把图片下载下来
with open('baidu.png', 'wb') as f: # 注意写的方式是以二进制方式写入
f.write(response.content)
print('下载完毕')

还是很简单,不得不说,这个库太好用了。

当我们需要上传文件的时候,比如图片,我们还可以用post方法把他发送出去

# 上传文件
files = {'picture': open('baidu.png', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
print(response.text)

获取cookie并简单处理一下

# 获取cookie
response = requests.get('https://www.baidu.com')
for k, v in response.cookies.items():
print(k, '=', v)

当网页返回内容是json格式是,我们不需要用json库来解析,我们可以直接利用requests的方法进行解析,两者的效果是一样的

# 解析json
j = response.json() # 可以用json库来解析,结果一样

在urllib库时保存登陆信息需要把cookie保存下来,但是在requests库里面,我们只需要用requests.session()来保存信息就可以了。

# 用会话来保持登陆信息
session = requests.session()
response = session.get('http://httpbin.org/cookies/set/number/123456')
print(response.text)

这样就可以保存登陆了,不需要为cookie操心了,但是每次获取一个session就可以了,然后用来请求或者其他操作。不需要每次请求或者操作都创建一个sesion出来,这样是保存不了登陆信息的

当一个网站不安全,需要你用证书验证的,比如这个网站

这时要访问里面的网站内容,我们就需要进行验证,代码如下:

# 证书验证
response = requests.get('https://www.12306.cn', verify=False) # 不加这个关键字参数的话会出现验证错误问题,因为这个网站的协议不被信任

这样就可以进行访问了,但是会有一条警告

E:\anaconda\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

觉得不美观的,我们还可以在请求时加个cert关键字参数,值为可信任的证书,为一个元组,写上账号和密码之类的,这里就不演示了

遇到需要认证的网站,我们也可以这样

from requests.auth import HTTPBasicAuth
# 设置认证
# requests.get('需要认证的网址', auth=HTTPBasicAuth('user', 'passwd')) # 由于找不到需要认证的网址,所以先写个主体
# 还可以这样认证
# requests.get('需要认证的网址', auth=('user', 'passwd')) # 这样就简单点

由于我找不到需要认证的网站,所以就不演示了。

requests还可以用代理ip来进行请求网站来防止ip被封以至于自己爬不了的尴尬。使用代理ip也比urllib库简单得多,代码如下:

# 设置代理
proxies = {'http': 'http://122.114.31.177:808',
'https': 'https://119.28.223.103:8088'}
# 在请求时添加上列代理
response = requests.get('http://httpbin.org/get', proxies=proxies)
print(response.text)

上面的字典格式需要一 一对应,然后在请求时加上个关键字参数proxies就可以了。

 请求异常处理

在程序运行时,遇到错误时程序就会被强行停止,如果想要继续运行,就需要进行捕捉异常来让程序继续运行。

在requests库中有个处理异常的库requests.exceptions

这里简单地处理下请求超时的处理情况

import requests
from requests.exceptions import ReadTimeout, ConnectTimeout, HTTPError, ConnectionError, RequestException
# 捕捉异常
try:
response = requests.get('http://httpbin.org/get', timeout=0.1) # 规定时间内未响应就抛出异常
print(response.text)
except ReadTimeout as e:
print('请求超时')
except ConnectionError as e:
print('连接失败')
except RequestException as e:
print('请求失败')

这里捕捉了三个异常,因为ReadTimeout是ConnectionError的子类,所以先捕捉ReadTimeout,再捕捉父类的。而ConnectionError 和 RequestException 同理

更多的异常处理可以查看文档哈

 

爬虫_python3_requests_2的更多相关文章

  1. 设计爬虫Hawk背后的故事

    本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...

  2. Scrapy框架爬虫初探——中关村在线手机参数数据爬取

    关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...

  3. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  4. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  5. scrapy 知乎用户信息爬虫

    zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...

  6. 120项改进:开源超级爬虫Hawk 2.0 重磅发布!

    沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...

  7. Python爬虫小白入门(四)PhatomJS+Selenium第一篇

    一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...

  8. Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  9. QQ空间动态爬虫

    作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...

随机推荐

  1. bat批处理教程

    批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合 1.ping sz.tencent.com > a.txt 把前面信息放到a.txt中 ping sz.tencent.com > ...

  2. Winform禁止程序多开 &&禁止多开且第二次激活第一次窗口

    一.禁止多开问题,运用Mutex锁 在Program.cs中运用Mutex锁 bool createNew;using (System.Threading.Mutex mutex = new Syst ...

  3. python接口自动化(三十七)-封装与调用--读取excel 数据(详解)

    简介 在进行软件接口测试或设计自动化测试框架时,一个不比可避免的过程就是: 参数化,在利用python进行自动化测试开发时,通常会使用excel来做数据管理,利用xlrd.xlwt开源包来读写exce ...

  4. builtin_shaders-5.3.4f1学习-Unlit/Texture

    // Unlit shader. Simplest possible textured shader. // - no lighting // - no lightmap support // - n ...

  5. Withdraw From OI

    Withdraw From OI 已经退役一周了,但还是迟迟没有去写退役记,在这个2017年的最后一天,写下这一篇沉重的“withdraw from OI”. 距离联赛成绩出来已经一个多月了.这一个月 ...

  6. 商务系统的构造思路(无源码!)+如何用jsp实现点击单选框内容显示在另一个jsp页面

    敲码经验总结: 之前犯了一个错误就是,没有从底层开始学起,有啥问题,就直接博客园找源码,去CSDN找源代码,看到代码就复制粘贴,结果从新梳理知识点的时候,貌似除了复制粘贴,印象深刻的知识啥也没学到. ...

  7. 初入Three.js 第一章

    一.什么是WebGL? 1.WebGL是在浏览器中实现三维效果的一套规范. 二.什么是threejs? 1.你将它理解成three + js就可以了.three表示3D的意思,js表示javascri ...

  8. IP服务-3-DHCP

    DHCP代表了动态IP地址分配的下一阶段.DHCP建立在BOOTP协议格式的基础上,专注于动态分配多种信息,以及为未来的扩展提供灵活的消息结构,并且无需预先定义每个客户端的MAC地址.DHCP提供的功 ...

  9. VLAN-4-在路由器上配置Trunk

    VLAN Trunk技术可以用在路由器和主机上,也可以用在交换机上.路由器不支持DTP,所以工程师必须手动配置. 路由器Trunk需要使用子接口(在一个接口中实现多个vlan间的路由和通信),每个子接 ...

  10. web前端与后台数据交互

    1.前端请求数据URL由谁来写? 在开发中,URL主要是由后台来写的,写好了给前端开发者.如果后台在查询数据,需要借助查询条件才能查询到前端需要的数据时,这时后台会要求前端提供相关的查询参数,这里的查 ...