浅谈urllib和requests
urllib和requests的学习
urllib
urllib是python的基本库之一,内置四大模块,即request,error,parse,robotparser,常用的request,error,一个用于发送HTTP请求,一个用于处理请求的错误。parse用于对URL的处理,拆分,全并等。
基本用法
# 导入 urllib 中的 request
from urllib import request
# 使用 urlopen,打开一个网址
urllib_response = request.urlopen("http://www.baidu.com")
# read() 方法用于读取响应, decode() 处理,默认 read() 是字节流
print(urllib_response.read().decode("utf-8"))
print(type(urllib_response.read())) # <class 'bytes'>
问题1:如果在发送请求时断网会怎样
我是在断网的情况下实时的,urllib会提示urllib.error.URLError,即urlopen error [Errno -3] Temporary failure in name resolution,无法解析域名。
from urllib import request, error
# 解决方法是导入 error 模块
# 使用 try except 方法捕获该错误,避免错误影响程序后续运行,也可以将该错误放入日志
try:
urllib_response = request.urlopen("http://www.baidu.com")
print(urllib_response.read().decode('utf-8'))
except error.URLError as e:
print(e)
问题2:如何添加请求头信息
有添加请求头信息的需求,就当然有为什么要添加请求头信息的问题了。
要搞明这个问题,就要先了解原生请求头是什么,于是我写一个简单的web server,以下简称server
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind(('127.0.0.1', 5000))
server.listen(5)
while True:
conn, ip = server.accept()
req = b''
while True:
temp = conn.recv(1024)
req += temp
if len(temp) < 1024:
break
print(req.decode('utf-8'))
conn.sendall(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')
conn.close()
此时再使用urlopen直接打开127.0.0.1:5000,server显示如下信息
GET / HTTP/1.1
Accept-Encoding: identity
Host: 127.0.0.1:5000
User-Agent: Python-urllib/3.7
Connection: close
通过User-Agent可以看出,当前是python-urllib/3.7。即非合法的客户端,如浏览器,目标网站可以通过识别该字段来判断此次访问是否合法,以决定是否禁止其访问。当然,设置了合法的请求头也并非这个爬虫可以安然无恙,目标网站仍然可以通过其他算法也判断这个访问是否合法访问。不过,我们能做的就是把能做的做了
urllib设置请求头
from urllib import request
"""
设置 headers 信息,其为字典格式
使用 request.Request 构造请求
使用 request.urlopen 打开请求
"""
headers = {
'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/68.0.3440.106 Safari/537.36')
}
req = request.Request(url='http://127.0.0.1:5000', headers=headers)
response = request.urlopen(req)
print(response.read().decode("utf-8"))
server显示如下,User-Agent已被成功修改
GET / HTTP/1.1
Accept-Encoding: identity
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Connection: close
requests
requests是python的第三方库,通过pip install requests即可安装
基本用法
import requests
response = requests.get("http://www.baidu.com")
# 请求百度会出现乱码,因为百度默认解析编码为 utf-8
# requests 的 response 默认为 ISO-8859-1
# 通过 response.encoding 直接设置此次响应解析编码
response.encoding = 'utf-8'
# 通过 response.text 即可查看响应的文本 body
print(response.text)

如果要设置请求头,requests可以直接添加headers参数以设置请求头,而不用像urllib的reqeust需要构造一个请求,再进行请求。因为请求头是在其内部已经构建了。
import requests
headers = {
'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/68.0.3440.106 Safari/537.36')
}
response = requests.get("http://127.0.0.1:5000", headers=headers)
print(response.text)
server的访问请求头信息的前后对比。
GET / HTTP/1.1
Host: 127.0.0.1:5000
User-Agent: python-requests/2.20.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
GET / HTTP/1.1
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
参考资料
- 崔庆才的《Python3网络爬虫开发实战》
- urllib官方文档
- requests官方文档
浅谈urllib和requests的更多相关文章
- 浅谈 Requests包
浅谈 Requests包 一:Requests包是做什么的? 简单地说,是用python处理HTTP的一个包. 它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表se ...
- 浅谈requests库
本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 安装 pip install requests # 是requests而不是request(有s的) re ...
- 浅谈RESTful
浅谈RESTful 什么是RESTful? REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 浅谈C语言中断处理机制
一.中断机制 1.实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急.更重要的工作,则在执行完当前指令后响应这一中断请求.CPU中断响应过程如下:首先, ...
- 浅谈爬虫 《一》 ===python
浅谈爬虫 <一> ===python ‘’正文之前先啰嗦一下,准确来说,在下还只是一个刚入门IT世界的菜鸟,工作近两年了,之前做前端的时候就想写博客来着,现在都转做python了,如果还 ...
随机推荐
- POJ 1155
很久以前做的树形DP题,今天再遇到时,竟然不会了,所以写写.. 设数组: prf[MAX][MAX],cost[MAX],sum[MAX].分别表示,在第i个结点为根的子树内的情况下,若有j个用户申请 ...
- 2015年北京大学软件project学科优秀大学生夏令营上机考试---C:单词翻转面试题
题目描写叙述:翻转句子中单词的顺序.但单词内字符的顺序不变.句子中单词以空格符隔开. 为简单起见,标点符号和普通字母一样处理.如:"I am a student."翻转成" ...
- asp.net控件的异步刷新
需求:我们知道,asp.net控件中的button控件,默认是开启了自己主动回发的,而有时候.我们不想刷新整个界面.而仅仅想局部刷新,可页面中又偏偏用到了.net button控件. 尽管我非常讨厌. ...
- C++中sort()及qsort() (不完整介绍)
在平时刷算法题和oj的时候,排序算法是最经常用到的算法之一:且在各类算法书的目录中 也通常是将各种排序算法放在最前面来讲,可见排序算法的重要性.可能许多人都在算法书中有学过冒泡.快速排序的方法,也都大 ...
- 怎样预置Android 手机 APK
预制APK有下面4种情况: 1, 怎样将带源代码的 APK 预置进系统? 2, 怎样将无源代码的APK预置进系统? 3, 怎样预置APK使得用户能够卸载,恢复出厂设置时不能恢复? 4, 怎样预置APK ...
- rar x 解压rar文件,提示permission denied
问题: 解压rar文件,提示
- 关于ShapeDrawable应用的一些介绍(中)之Gradient
版权声明:本文为博主原创文章,未经博主允许不得转载. Gradient,渐变,是在界面设计中最经常用到的一种技巧,只要涉及到颜色的处理,浓妆淡抹总相宜,说的就是它. 在Android中,当然也提供了这 ...
- php 判断字符串包含中文(转)
$str = "测试中文"; echo $str; echo "<hr>"; //if (preg_match("/^[".ch ...
- 一个 passive 引发的bug
不是什么很难的东西,权且做个记录. 首先说下背景,目前的项目中,需要同时绑定 wheel 和 scroll 事件. 绑定 wheel,目的是开发 ctrl + wheel 缩放页面功能,此功能与浏览器 ...
- MyBatis输出执行的SQL到控制台
src\main\resources\application.properties 或者src\main\resources\application.yml 在你的application.proper ...