python爬虫之urllib库详解
python爬虫之urllib库详解
- 前言
- 一、urllib库是什么?
- 二、urllib库的使用
- urllib.request模块
- urllib.parse模块
- 利用try-except,进行超时处理
- status状态码 && getheaders()
- 突破反爬
前言
想要进行python爬虫首先我们需要先将网页上面的信息给获取下来,这就是utllib库的作用
一、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 : PyCharmimport urllib.request
#get请求
response = urllib.request.urlopen("http://www.baidu.com") #返回的是存储网页数据的对象
#print(response) 可以尝试打印一下看一下
print(response.read().decode('utf-8')) #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
将其打印的内容写到一个html文件中,打开和百度一毛一样
# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharmimport 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("读取结束")
urllib.parse模块
有时我们爬虫需要模拟浏览器进行用户登录等操作,这个时候我们就需要进行post请求
但是post必须有一个获取请求之后的响应,也就是我们需要有一个服务器。给大家介绍一个免费的服务器网址,就是用来测试用的http://httpbin.org/。主要用来测试http和https的
我们可以尝试执行一下,去获取对应的响应。
可以用Linux命令去发起请求,URL地址为http://httpbin.org/post。得到下方的响应。
我们也可以通过爬虫来实现
# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharmimport 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解码防止有的地方出现乱码
两个响应结果对比是不是一样几乎
相当于进行了一次模拟的post请求。这样有些需要登录的网站也是可以爬取的。
利用try-except,进行超时处理
一般进行爬虫时,不可能一直等待响应。有时网络不好或者网页有反爬或者一些其他东西时。无法快速爬出。我们就可以进入下一个网页继续去爬。利用timeout属性就好
# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharmimport 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
- 也可以通过gethead(“xx”) 获取xx对应的值,比如:上图 gethead(content-encoding) 为 gzip
突破反爬
首先打开任何一个网页按F12找到Response Headers,拉到最下面找到 User-Agent。将其复制保存下来,为反爬做准备。
下面我们进行尝试,直接爬取豆瓣,直接来个418,知道你是爬虫,我们来伪装一下
为什么418呢,因为如果是直接进行请求访问的话,发过去的User-Agent 是下面的,直接告诉浏览器我们是爬虫。我们需要伪装
# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/2 19:24
# @FileName : testUrllib.py
# Software : PyCharmimport urllib.requestheaders = {"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访问的网址一样
- 浏览器访问结果
- 爬虫访问结果
# -*- codeing = utf-8 -*-
# @Author: Y-peak
# @Time : 2021/9/3 0:47
# @FileName : testUrllib.py
# Software : PyCharmimport 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爬虫智能解析库详解
文章很长 请耐心阅读 什么是爬虫 爬虫是做什么的?是帮助我们来快速获取有效信息的.然而做过爬虫的人都知道,解析是个麻烦事.比如一篇新闻吧,链接是这个: https://news.ifeng.com/c ...
- 爬虫入门之urllib库详解(二)
爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...
- Python Urllib库详解
Urllib库详解 什么是Urllib? Python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 u ...
- python爬虫知识点总结(三)urllib库详解
一.什么是Urllib? 官方学习文档:https://docs.python.org/3/library/urllib.html 廖雪峰的网站:https://www.liaoxuefeng.com ...
- Python3爬虫之Selenium库详解
1.Selenium库的介绍: Selenium库是用来自动化测试的工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染的问题.给浏览器发送指令,使得浏览器做出跳转,点击,下拉等动作,模拟 ...
- python urllib.request 爬虫 数据处理-python 爬虫之 urllib库
文章更新于:2020-03-02 注:代码来自老师授课用样例. 一.初识 urllib 库 在 python2.x 版本,urllib 与urllib2 是两个库,在 python3.x 版本,二者合 ...
- Python 爬虫之urllib库的使用
urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urlli ...
- 【实战】Python爬虫之代理使用详解
在Python爬虫中,代理的使用非常常见.代理的主要作用是隐藏客户端的真实IP地址,从而实现更高的网络访问速度和更好的访问隐私保护.下面我们将通过Python爬虫的实例,带你详细了解Python爬虫中 ...
- python系列:socket库详解
python系列-socket库应用详解 文章目录 python系列-socket库应用详解 一. socket库的函数 二.socket库的方法 1.connect(address): 2.acce ...
最新文章
- sort and uniq
- python控制语句第一章_python基础第一章
- 网页怎么向服务器请求数据,网页怎么向服务器请求数据库
- Multiload-ng
- java二分查找算法字符串数组_Java 算法——二分查找数组集合关键元素
- Sync Framework 词汇表
- D3DXIntersectTri 求三角形与射线相交
- 深度学习斯坦福cs231n 课程笔记
- 2019年末逆向复习系列之从猫眼字体反爬分析谈谈字体反爬的前世今生
- 新媒体素材采集工具,帮你采集新媒体素材,提高效率
- android居中代码,android 设置textView水平居中显示?
- bouncycastle
- html图片按钮按钮点击效果
- 并发之Striped64(l累加器)
- 盘古开源顺势转型,开拓芯片市场
- 计算机网络之无线局域网
- 解决Debian7 无线网卡显示为设备未托管问题
- 简单字符驱动笔记(朱有鹏)
- 重建 nextcloud 索引,通过非 nextcloud 客户端(手机、PC、网页端)途径放入 nextcloud 目录的文件
- TL431在电源方面的应用
热门文章
- System.Web.HttpException: The file ~/xxx//Index.cshtml cannot be requested directly because it cal
- php注册登录遍写入 遍验证,在文件指定行中写入内容的php...-自动注册登录验证机制的php代...-php中出现Undefined index报错的修复方法_169IT.COM...
- [Python图像处理] 三十四.数字图像处理基础与几何图形绘制万字详解(推荐)
- iOS之深入解析KVC的底层原理和自定义KVC的实现
- 采用8种相位,每种相位各有两种幅度的QAM调制方法,在1200Baud的信号传输速率下能达到的网数据传输速率为( )
- TensorFlow模型持久化
- Django REST framework 开始
- 深度学习——05、深度学习框架Caffe
- 【Linux】一步一步学Linux——touch命令(33)
- 【Ubuntu】ubuntu更新设置