关于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模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
python通过openpyxl生成Excel文件的方法
May 12 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python Flask基础教程示例代码
Feb 07 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
python实现批量文件重命名
Oct 31 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
基于python爬取梨视频实现过程解析
Nov 09 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
解析php中call_user_func_array的作用
2013/06/07 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
html下载本地
2006/06/19 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
Python中的面向对象编程详解(下)
2015/04/13 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
Python制作exe文件简单流程
2019/01/24 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
哪些是python中web开发框架
2020/06/17 Python
学生实习介绍信
2014/01/15 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
白血病捐款倡议书
2014/05/14 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
mysql 获取相邻数据项
2022/05/11 MySQL