urllibrequests的学习


urllib

urllibpython的基本库之一,内置四大模块,即requesterrorparserobotparser,常用的requesterror,一个用于发送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:5000server显示如下信息

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

requestspython的第三方库,通过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参数以设置请求头,而不用像urllibreqeust需要构造一个请求,再进行请求。因为请求头是在其内部已经构建了。

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

参考资料

浅谈urllib和requests的更多相关文章

  1. 浅谈 Requests包

    浅谈 Requests包 一:Requests包是做什么的? 简单地说,是用python处理HTTP的一个包. 它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表se ...

  2. 浅谈requests库

    本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 安装 pip install requests # 是requests而不是request(有s的) re ...

  3. 浅谈RESTful

    浅谈RESTful 什么是RESTful? REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

  4. 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  5. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  6. 浅谈HTTP中GET、POST用法以及它们的区别

    浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...

  7. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  8. 浅谈C语言中断处理机制

    一.中断机制 1.实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急.更重要的工作,则在执行完当前指令后响应这一中断请求.CPU中断响应过程如下:首先, ...

  9. 浅谈爬虫 《一》 ===python

    浅谈爬虫 <一> ===python  ‘’正文之前先啰嗦一下,准确来说,在下还只是一个刚入门IT世界的菜鸟,工作近两年了,之前做前端的时候就想写博客来着,现在都转做python了,如果还 ...

随机推荐

  1. 使用URL在线语音合成

    近期一直在做手机的项目,用到了语音合成与识别的功能.就找了几个网址做了分析,这里只实现了内容的合成.并不包括语音识别. 首先看一下谷歌的语音合成地址: http://translate.google. ...

  2. selenium实例学习地址

    一个完整的maven配置selenium webdriver工程实例   http://www.spasvo.com/ceshi/open/kygncsgj/Selenium/201312209580 ...

  3. 【转】selenium自动化测试环境搭建

    转:http://blog.csdn.net/mao1059568684/article/details/17347853 第一步 安装JDK JDk1.7. 下载地址:http://www.orac ...

  4. IOS算法(二)之选择排序

    选择排序: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后.直到所有待排序的数据元素排完. 选择排序是不稳定的排序方法. 一. 算法描写叙述 选择排序:比方在一 ...

  5. [Linux]非常方便的上传下载文件工具rz和sz

     linux上非常方便的上传下载文件工具rz和sz (本文适合linux入门的朋友) [一般用于SecureCRT ssh中使用] █ 法一:直接用yum安装lrzsz(推荐) yum insta ...

  6. LeetCode OJ 之 Delete Node in a Linked List (删除链表中的结点)

    题目: Write a function to delete a node (except the tail) in a singly linked list, given only access t ...

  7. poj1028--动态规划--Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  8. yii依赖注入

    为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Service Locator) ...

  9. 由于管理员设置的策略,该磁盘处于脱机状态"解决办法

    .运行:cmd .输入:DISKPART.exe .DISKPART> san .DISKPART> san policy=onlineall .DISKPART>list disk ...

  10. Hadoop MapReduce编程 API入门系列之MapReduce多种输入格式(十七)

    不多说,直接上代码. 代码 package zhouls.bigdata.myMapReduce.ScoreCount; import java.io.DataInput; import java.i ...