关于python爬虫应用urllib库作用分析


Posted in Python onSeptember 04, 2021

一、urllib库是什么?

urllib库用于操作网页 URL,并对网页的内容进行抓取处理

urllib包 包含以下几个模块:

urllib.request - 打开和读取 URL。

urllib.error - 包含 urllib.request 抛出的异常。

urllib.parse - 解析 URL。

urllib.robotparser - 解析 robots.txt 文件

python爬虫主要用到的urllib库中的request和parse模块

二、urllib库的使用

下面我们来详细说明一下这两个常用模块的基本运用

urllib.request模块

urllib.request 定义了一些打开 URL 的函数和类,包含授权验证、重定向、浏览器 cookies等。

语法如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,

capath=None, cadefault=False, context=None)

 url:url 地址。

data:发送到服务器的其他数据对象,默认为 None。

timeout:设置访问超时时间。

cafile capath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。

cadefault:已经被弃用。

context:ssl.SSLContext类型,用来指定 SSL 设置。

# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharm
import urllib.request
#get请求
response = urllib.request.urlopen("http://www.baidu.com")  #返回的是存储网页数据的对象
#print(response)  可以尝试打印一下看一下
print(response.read().decode('utf-8')) #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码

关于python爬虫应用urllib库作用分析

将其打印的内容写到一个html文件中,打开和百度一毛一样

# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharm
import urllib.request
response = urllib.request.urlopen("http://www.baidu.com")  #返回的是存储网页数据的对象
data = response.read().decode('utf-8')  #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
#print(data)
with open("index.html",'w',encoding='utf-8') as wfile: #或者你们也可以常规打开,不过需要最后关闭记得close()
    wfile.write(data)
    print("读取结束")

关于python爬虫应用urllib库作用分析

urllib.parse模块

有时我们爬虫需要模拟浏览器进行用户登录等操作,这个时候我们就需要进行post请求

但是post必须有一个获取请求之后的响应,也就是我们需要有一个服务器。给大家介绍一个免费的服务器网址,就是用来测试用的http://httpbin.org/。主要用来测试http和https的

关于python爬虫应用urllib库作用分析

关于python爬虫应用urllib库作用分析

我们可以尝试执行一下,去获取对应的响应。

关于python爬虫应用urllib库作用分析

关于python爬虫应用urllib库作用分析

可以用Linux命令去发起请求,URL地址为http://httpbin.org/post。得到下方的响应。

关于python爬虫应用urllib库作用分析

我们也可以通过爬虫来实现

# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharm
import urllib.request
import urllib.parse #解析器
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding='utf-8')  #转换为二进制数据包,里面是键值对(有时输入的用户名:密码就是这样的),还有一些编码解码的数值等.这里就是按照utf-8的格式进行解析封装生成二进制数据包
response = urllib.request.urlopen("http://httpbin.org/post",data=data)  #返回的请求
print(response.read().decode('utf-8'))      #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码

两个响应结果对比是不是一样几乎

关于python爬虫应用urllib库作用分析

关于python爬虫应用urllib库作用分析

相当于进行了一次模拟的post请求。这样有些需要登录的网站也是可以爬取的。

利用try-except,进行超时处理

一般进行爬虫时,不可能一直等待响应。有时网络不好或者网页有反爬或者一些其他东西时。无法快速爬出。我们就可以进入下一个网页继续去爬。利用timeout属性就好

# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharm
import urllib.request
try:
    response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)  #返回的是存储网页数据的对象, 直接用这个网址的get请求了.timeout表示超时,超过0.01秒不响应就报错,避免持续等待
    print(response.read().decode('utf-8'))      #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
except urllib.error.URLError as e:
    print("超时了\t\t错误为:",e)

status状态码 && getheaders()

status:

  • 返回200,正确响应可以爬取
  • 报错404,没有找到网页
  • 报错418,老子知道你就是爬虫
  • getheaders():获取Response Headers

关于python爬虫应用urllib库作用分析 

  • 也可以通过gethead(“xx”) 获取xx对应的值,比如:上图 gethead(content-encoding) 为 gzip

突破反爬

首先打开任何一个网页按F12找到Response Headers,拉到最下面找到 User-Agent。将其复制保存下来,为反爬做准备。

关于python爬虫应用urllib库作用分析

关于python爬虫应用urllib库作用分析

下面我们进行尝试,直接爬取豆瓣,直接来个418,知道你是爬虫,我们来伪装一下

关于python爬虫应用urllib库作用分析

为什么418呢,因为如果是直接进行请求访问的话,发过去的User-Agent 是下面的,直接告诉浏览器我们是爬虫。我们需要伪装

关于python爬虫应用urllib库作用分析

 

# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharm
import urllib.request
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
request = urllib.request.Request("http://douban.com", headers=headers) #返回的是请求,将我们伪装成浏览器发送的请求
response = urllib.request.urlopen(request)  #返回的是存储网页数据的对象
data = response.read().decode('utf-8')     #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
with open("index.html",'w',encoding='utf-8') as wfile: #或者你们也可以常规打开,不过需要最后关闭记得close()
    wfile.write(data)

当然反爬不可能如此简单,上面将讲的那个 post请求,也是十分常见的突破反爬的方式,不行就将整个Response Headers全部模仿。下面还有个例子作为参考。和上面的post访问的网址一样

浏览器访问结果

关于python爬虫应用urllib库作用分析

爬虫访问结果

# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/3 0:47
# @FileName : testUrllib.py
# Software : PyCharm

import urllib.request
import urllib.parse
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
url = "http://httpbin.org/post"
data = (bytes)(urllib.parse.urlencode({"账户":"密码"}),encoding = 'utf-8')
request = urllib.request.Request(url, data = data,headers=headers, method='POST') #返回的是请求
response = urllib.request.urlopen(request)  #返回的是存储网页数据的对象
data = response.read().decode('utf-8')     #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
print(data)

关于python爬虫应用urllib库作用分析

 

以上就是关于python爬虫应用urllib库作用分析的详细内容,更多关于python爬虫urllib库分析的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中关键字is与==的区别简述
Jul 31 Python
Python实现股市信息下载的方法
Jun 15 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
Django Form设置文本框为readonly操作
Jul 03 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
pytorch实现手写数字图片识别
May 20 Python
解析目标检测之IoU
Jun 26 Python
Pandas数据类型之category的用法
Jun 28 Python
解决pycharm下载库时出现Failed to install package的问题
关于python类SortedList详解
Sep 04 #Python
Python3.8官网文档之类的基础语法阅读
Sep 04 #Python
python实现Nao机器人的单目测距
Sep 04 #Python
python读取mnist数据集方法案例详解
Sep 04 #Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 #Python
一小时学会TensorFlow2之基本操作2实例代码
You might like
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
详解ES6中的let命令
2020/04/05 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
python实现简单名片管理系统
2018/11/30 Python
python requests post多层字典的方法
2018/12/27 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
python简单实现插入排序实例代码
2020/12/16 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
物流专业大学生的自我鉴定
2013/11/13 职场文书
母亲节演讲稿
2014/05/27 职场文书
2014年租房协议书范本
2014/10/30 职场文书
入伍通知书
2015/04/23 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技