【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)

原文地址:https://www.cnblogs.com/wqunlong/p/10048816.html

时间: 2024-08-24 23:40:21

【2】数据采集 - urllib模块的相关文章

学习Python的urllib模块

 urllib 模块作为Python 3 处理 URL 的组件集合,如果你有 Python 2 的知识,那么你就会注意到 Python 2 中有 urllib 和 urllib2 两个版本的模块,这些现在都是 Python 3 的 urllib 包的一部分,具体如何来体现它们之间的关系 Python 3 的 urllib 模块是一堆可以处理 URL 的组件集合.如果你有 Python 2 的知识,那么你就会注意到 Python 2 中有 urllib 和 urllib2 两个版本的模块.这些现在

定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容。提示(可以了解python的urllib模块)

1 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容.提示(可以了解python的urllib模块) 2 import urllib.request 3 4 def get_page(url): 5 response = urllib.request.urlopen(url) 6 html = response.read() 7 return html 8 9 print(get_page(url='https://www.baidu,com'))

urllib模块中的方法

urllib模块中的方法 1.urllib.urlopen(url[,data[,proxies]]) 打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作.本例试着打开google >>> import urllib >>> f = urllib.urlopen('http://www.google.com.hk/') >>> firstLine = f.readline()   #读取html页面的第一行 >>>

Python学习-20.Python的Urllib模块

除了 Http 模块可以模拟 Http 请求外,使用 Urllib 模块也是可以模拟 Http 请求的,只不过功能相对弱一点. 1 import urllib.request 2 3 opener = urllib.request.urlopen("http://www.baidu.com") 4 bytes = opener.read() 5 html = bytes.decode('gbk','ignore') 6 print(html) 7 opener.close() 获取百度

python3.5中urllib模块抓取指定URL内容

python3.5中把python中的urllib和urllib2模块合并为urllib模块啦.urllib模块下有五个类: 抓取指定URL下内容封装成一个类文件对象,其中的很多方法操作和文件操作是一样的.

全局变量 urllib模块 json模块

1.vars()  查看一个.py文件中的全局变量 print(vars()) #重点 __name__': '__main__ '__file__': 'C:/Users/lenovo/PycharmProjects/老男孩/pppppppp.py' {'__spec__': None, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/lenovo/Py

Python内置的urllib模块不支持https协议的解决办法

Django站点使用django_cas接入SSO(单点登录系统),配置完成后登录,抛出“urlopen error unknown url type: https”异常.寻根朔源发现是python内置的urllib模块不支持https协议. >>> import urllib>>> urllib.urlopen('http://www.baidu.com')<addinfourl at 269231456 whose fp = <socket._fileo

[转]Python核心模块——urllib模块

现在Python基本入门了,现在开始要进军如何写爬虫了! 先把最基本的urllib模块弄懂吧. urllib模块中的方法 1.urllib.urlopen(url[,data[,proxies]]) 打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作.本例试着打开google >>> import urllib >>> f = urllib.urlopen('http://www.google.com.hk/') >>> first

python3.x中的urllib模块

来源http://my.oschina.net/u/999436/blog/113317 我尝试着找找python3.3.0的change log.里面并没有找到urllib的修改记录.然而这一修改记录却在python3.0的change log中. 原文是这样写的: a new urllib package was created. It consists of code from urllib, urllib2, urlparse, and robotparser. The old modu