【2】数据采集 - urllib模块
python2环境下关于urllib2的使用可以学习这篇文章。本文主要针对python3环境下使用urllib模块实现简单程序爬虫。
链接:https://www.jianshu.com/p/31833117b34b
urllib模块的使用
1.数据编码处理
- 我们通过爬虫程序可以得到网站返回的数据,但是返回的数据在展示过程中,出现了乱码的问题,是因为网站本身有自己的字符编码(通常情况下是 UTF-8),我们程序在采集完成之后在控制台进行展示的过程中是使用本地默认编码(windows 一般是 gbk、unix 中一般是 utf-8),如果两部分编码不一致,就会出现乱码的问题。
- 网页结构中的编码,一般会定义在标签中,所以爬虫采集网页数据时可以分成两个步骤进行操作,先采集批量网页中的一个网页查看编码格式,然后在代码中根据指定的编码格式进行解码,得到正确数据之后,再进行批量网页数据的采集;这样的操作方式是手工指定编码方式。
# 引入依赖模块
from urllib import request
# 向服务器发送请求,获取响应对象
response = request.urlopen("https://www.baidu.com")
# 获取包含在响应中的数据
html = response.read()
# 解码
html = html.decode('utf-8')
# 打印结果
print(html)
结果为:
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
Process finished with exit code 0
- 但是手工指定编码方式的操作,存在很大的局限性,批量网页处理过程中一旦出现不同编码格式的网页,很容易造成程序异常导致数据遗漏,所以我们可以通过 python 第三方模块进行目标数据的分析判断,得到一个具体的编码格式,然后通过该检测的编码格式进行数据的解码工作
- remark:通过chardet 模块可以直接检测目标数据的编码格式,但是编码格式只是一个检测的概率值,所以在编码解码错误的情况下,需要人工介入进行解码操作。
# 引入依赖模块
from urllib import request
import chardet
# 向服务器发送请求,获取响应对象
response = request.urlopen("https://www.80s.tw/")
# 获取包含在响应中的数据
html = response.read()
# 验证编码
encoding = chardet.detect(html).get('encoding')
# 解码:
html = html.decode(encoding)
# 打印结果
print(html)
##2.请求对象包装
- 前面的代码中,目标网站的 url 地址就是一个普通的字符串,通过该字符串可以发起一个具体的请求,但是在网站操作过程中,客户端发送的一个请求可能会包含较多的格式数据如请求 url、请求头、请求体、参数、 cookie 等等数据;
- 爬虫操作就是在模拟真实用户的操作,请求的操作也可以通过请求对象的方式进行模拟,在python3 中的 urllib 模块下的 Request 类型,就是一个模拟发送的请求对象。
- 具体的操作代码如下:
```
# 引入依赖的模块
from urllib import request
import chardet
# 将请求包装成请求对象
req = request.Request('https://www.80s.tw/')
# 通过 urlopen 发送请求对象给服务器,得到服务器响应数据
response = request.urlopen(req)
# 得到响应数据
html = response.read()
# 编码检测并解码
html = html.decode(chardet.detect(html).get('encoding'))
print(html)
```
##3.请求头设置
- 一个完整的请求,对于请求信息的描述,主要包含在请求头(request header)中,请求头中对于请求的数据格式、请求的数据类型、请求的语言环境、请求是否保持和服务器的连接、请求的 cookie、客户端身份信息等都进行了描述性的定义,可以通过网络抓包工具可以明确的查看到请求中包含的各项具体信息。
- web 发展之初的请求也不是这么复杂,主要是在不同浏览器软件兴起之后,由于浏览器软件之间的差异,导致浏览器从服务器获取的数据展示风格出现了迥异的误差,所以对于客户端的浏览器信息需要传递给服务器进行区别处理,于是正常的请求中包含了大量的用于描述客户端信息的组成部分,该部分就是请求头;请求头是一个 like dict 的对象,一个正常的请求头包含的内容一般如下:
--- Accept 接受响应数据的格式
--- Accept-Encoding 接受响应数据的编码
--- Accept-languate 接受响应数据的语言环境
--- Connection 是否保持连接
--- Cookie 会话跟踪数据
--- Upgrade-insecure-Requests 是否安全请求
--- Referer 反外链限制
--- User-agent 浏览器代理
--- more..
- 在 web 发展的一段时间中,由于基于 TCP 协议建立连接的 BUG,出现了大量的针对网站的DDOS 攻击手段,通过代码程序频繁给服务器发送不建立连接的请求导致服务器大量负载被空置占用,导致的结果就是有效用户不能正常请求服务器的数据,就是传说中的拒绝服务攻击手段,所以现在主流网站一般都会针对客户端发送的请求进行甄别,最主要的一个信息就是 User-agent 浏览器代理,该代理数据中描述的就是发送请求的客户端使用的系统 OS的信息、浏览器软件信息及版本信息。
- 对于服务器设置的通过验证 User-agent 来标识是否正常请求的方式,在爬虫程序中可以通过设置请求头来完成模拟真实请求的方式.
from urllib import request
import chardet
import random
# 定义多个 user-agent
my_headers = [
{'User-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60'},
{'User-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2
(KHTML, like Gecko) Version/5.1.7 Safari/534.57.2'},
{'User-agent': 'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10)
Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10'},
{'User-agent': 'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1)
Gecko/20061208 Firefox/2.0.0 Opera 9.50'},
]
# 包装请求# 爬虫请求头手工添加:添加方式 1
req = request.Request('https://www.80s.tw/',
headers=random.choice(my_headers))
# 请求数据
response = request.urlopen(req)
# 获取并验证编码
html = response.read()
encoding = chardet.detect(html).get('encoding')
html = html.decode(encoding)
# 打印结果
print(html)
【2】数据采集 - urllib模块的更多相关文章
- Python核心模块——urllib模块
现在Python基本入门了,现在开始要进军如何写爬虫了! 先把最基本的urllib模块弄懂吧. urllib模块中的方法 1.urllib.urlopen(url[,data[,proxies]]) ...
- 【py网页】urllib模块,urlopen
Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 下面是在 Python Shell 里的 urllib 的使用情况: 01 Pyth ...
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- python urllib模块的urlopen()的使用方法及实例
Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 一.urllib模块urlopen()函数: urlopen(url, data=N ...
- 全局变量 urllib模块 json模块
1.vars() 查看一个.py文件中的全局变量 print(vars()) #重点 __name__': '__main__ '__file__': 'C:/Users/lenovo/Pychar ...
- python爬虫-urllib模块
urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如:HTTP.FTP.Gophe ...
- [转]Python核心模块——urllib模块
现在Python基本入门了,现在开始要进军如何写爬虫了! 先把最基本的urllib模块弄懂吧. urllib模块中的方法 1.urllib.urlopen(url[,data[,proxies]]) ...
- Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。
Python urllib模块urlopen()与urlretrieve()的使用方法详解 1.urlopen()方法urllib.urlopen(url[, data[, proxies]]) ...
- urllib模块
python爬虫-urllib模块 urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web ...
随机推荐
- 开源 java CMS - FreeCMS2.3 职位管理
项目地址:http://www.freeteam.cn/ 职位管理 管理职位.实现招聘功能. 1. 职位管理 从左側管理菜单点击职位管理进入. 2. 加入职位 在职位列表下方点击"加入&qu ...
- Google Code Jam在线測试题目--Alien Language
Problem After years of study, scientists at Google Labs have discovered an alien language transmitte ...
- 超简洁代码实现CircleImageView
效果图: 页面代码: public class CircleView extends ImageView { private Paint mPaint = new Paint(); public Ci ...
- 浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程【转】
本文转载自:http://www.cnblogs.com/qingchen1984/p/7007631.html 本篇文章主要介绍了"浅析 Linux 中的时间编程和实现原理一—— Linu ...
- TensorFlow Lite demo——就是为嵌入式设备而存在的,底层调用NDK神经网络API,注意其使用的tf model需要转换下,同时提供java和C++ API,无法使用tflite的见后
Introduction to TensorFlow Lite TensorFlow Lite is TensorFlow’s lightweight solution for mobile and ...
- Java8新特性之Optional
空指针异常一直是困扰Java程序员的问题,也是我们必须要考虑的.当业务代码中充满了if else判断null 的时候程序变得不再优雅,在Java8中提供了Optional类为我们解决NullPoint ...
- Python 35 线程(2)线程特性、守护线程、线程互斥锁
一:线程特性介绍 from threading import Thread import time n=100 def task(): global n n=0 if __name__ == '__m ...
- Netty引导流程解读
Channel的生命周期状态[状态转换将变为相应的事件,转发给ChannelPipeline中的ChannelHandler进行处理] ChannelUnregistered:Channel已经被创建 ...
- BZOJ 2969 期望
思路: 我们可以分开算每个格子自己的期望啊... 期望可以累加的 那就把这个大格子 分成 9个部分 分别算好了... //By SiriusRen #include <cmath> #in ...
- C#三种创建对象方法所需时间比较。。。。。
C#创建对象的三种方法 new().Activator.Assembly,接下来通过代码直接来看看运行的速度.... 首先,先看看三种创建对象实例的方法: //new(); public stati ...