Urllib数据抓取

Urllib简介

Urllib是Python自带的标准库,无须安装,直接引用即可。Url通常用于爬虫开发、API数据获取和测试。
在Python3中,Urllib模块是一堆可以处理URL的组件集合,就是将Urllib和Urllib2合并在一起使用,并且命名为Urllib.

  • urllib.request: 用于打开和读取URL
  • urlib.error: 包含提出的例外urllib.request
  • urlib.parse: 用于解析URL
  • urllib.robotparse: 用于解析robots.txt文件

发送请求

urllib.request.urlopen常用的参数有url、data、和timeout
urllib.request.Request(url, data=None, header={}, method=None)

  • url:完整的url格式
  • data: 请求参数
  • headers: 设置request请求头信息
  • method: 设定请求方式,主要是POST和GET方式
import urllib.request

#url, data: 默认值为None,代表请求方式为GET,timeout: 超时设置
# response = urllib.request.urlopen('https://movie.douban.com/'', None, 2)
#若这样,不设置请求头,将出现反爬虫,出错:HTTP Error 418

#设置请求头                                  
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
          'Referer': 'https://movie.douban.com/',
          'Connection': 'keep-alive'}
req = urllib.request.Request('https://movie.douban.com/', headers=headers)
response = urllib.request.urlopen(req)

html = response.read().decode('utf8')

f = open('html.txt', 'w', encoding='utf8')
f.write(html)
f.close()

代理IP

以本机先访问代理IP,再通过代理IP地址访问互联网,这样网站(服务器)接收到的访问IP就是代理IP地址。

import urllib.request
url = 'http://movie.douban.com/'
#设置代理IP
proxy_handler = urllib.request.ProxyHandler({'http': 'http://114.99.7.122:8752', 'https': 'http://114.99.7.122:8752'})
# 必须使用build_opener()函数来创建带有代理IP功能的opener对象
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url)
html = response.read().decode('utf-8')
f = open('htmlip.txt', 'w', encoding='utf8')
f.write(html)
f.close()

使用Cookies

Cookies主要用于获取用户登录信息,比如,通过提交数据实现用户登录之后,会生成带有登录状态的Cookies,这时可以将Cookies保存在本地文件中,下次程序运行的时候,可以直接读取Cookies文件来实现用户登录。特别对于一些复杂的登录,如验证码、手机短信验证登录这类网站,使用Cookies能简单解决重复登录的问题。
Urllib提供HTTPCookieProcessor()对Cookies操作。但Cookies的读写是由MozillaCookieJar()完成的。

#方法一
import urllib.request
from http import cookiejar
filename = 'cookie2.txt'
#MozillaCookieJar保存cookie
cookie = cookiejar.MozillaCookieJar(filename)
#HTTPCoolieProcessor创建cookie处理器 
handler = urllib.request.HTTPCookieProcessor(cookie)

#创建请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
          'Referer': 'https://movie.douban.com/',
          'Connection': 'keep-alive'}
req = urllib.request.Request('https://movie.douban.com/', headers=headers)

#创建自定义opener
opener = urllib.request.build_opener(handler)
#open方法打开网页
response = opener.open(req)
#保存cookie文件
cookie.save(ignore_discard=True, ignore_expires=True)
#方法二
import urllib.request
from http import cookiejar
filename = 'cookie2.txt'
#MozillaCookieJar保存cookie
cookie = cookiejar.MozillaCookieJar()
#读取cookie内容到变量
cookie.load(filename, ignore_discard=True, ignore_expires=True)
#HTTPCoolieProcessor创建cookie处理器 
handler = urllib.request.HTTPCookieProcessor(cookie)

#创建请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
          'Referer': 'https://movie.douban.com/',
          'Connection': 'keep-alive'}
req = urllib.request.Request('https://movie.douban.com/', headers=headers)

#创建自定义opener
opener = urllib.request.build_opener(handler)
#open方法打开网页
response = opener.open(req)
#输出结果
# print(cookie.extract_cookies)
# dir(cookie)
print(cookie)

<MozillaCookieJar[<Cookie bid=iBQYHURt1FY for .douban.com/>, <Cookie ll="118220" for .douban.com/>]>

证书验证

当遇到一些特殊的网站时,在浏览器上会显示连接不是私密连接而导致无法浏览该网页。
这里补充一个知识点,CA证书也叫SSL证书,是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
SSL证书就是遵守SSL协议,由受信任的数字证书机构颁发CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
SSL证书在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure Socket Layer, SSL),安全协议是由Netscape Communicaton公司设计开发的。该安全协议主要用来提供对用户和服务器的认证,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。
一些特殊的网站会使用自己的证书,如12306首页提示下载安装根证书,这是为了确保网站的数据在传输过程中的安全性。在讲述urllib.request.urlopen的时候,urlopen带有cafile、capath和cadefault参数,可以用于设置用户的CA证书。
遇到这类验证证书的网站,最简单而暴力的方法是直接关闭证书验证,可以在代码中引入SSL模块,设置关闭证书验证即可。

import urllib.request
import ssl
#关闭证书验证
ssl._create_default_https_context = ssl._create_unverified_context
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
respose = urllib.request.urlopen(url)
#输出状态码
print(response.getcode())
#200     成功处理了请求,一般情况下都是返回此状态码; 
200

数据处理

urllib.request.urlopen()方法是不区分请求方式的,识别请求方式主要通过参数data是否为None。如果向服务器发送POST请求,那么参数data需要使用urllib.parse对参数内容进行处理。
Urllib在请求访问服务器的时候,如果发生数据传递,就需要对内容进行编码处理,将包含str或bytes对象的两个元素元祖序列转换为百分比编码的ASCII文本字符串。如果字符串要用作POST,那么它应该被编码为字节,否则会导致TypeError错误。
urllib发送POST请求的方法如下:

import urllib.request
import urllib.parse
url = 'https://movie.douban.com'
data = {'value': 'true',}
#数据处理
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
          'Referer': 'https://movie.douban.com',
          'connection': 'keep-alive'}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req, data=data)
#urlencode()的作用只是对请求参数做数据格式转换处理。
#Urllib还提供quote()和unquote()对URL编码处理。
import urllib.parse
url = '%2523%25E7%25BC%2596%25E7%25A8%258B%2523'
#第一次解码
first = urllib.parse.unquote(url)
print(first)
#第二次解码
second = urllib.parse.unquote(first)
print(second)

#可使用quote()对数据进行编码处理。quote()和unquote()的作用是解决参数中含有中文内容的问题

%23%E7%BC%96%E7%A8%8B%23
#编程#

总结

Urllib通常用于爬虫开发和API(应用程序编程接口)数据获取和测试

  • urllib.request.urlopen: urllib最基本的使用功能,用于访问URL(请求链接)的唯一方法。
  • urllib.request.Request: 声明request对象,该对象可自定义请求头(header)、请求方式等信息。
  • urllib.request.ProxyHandler: 动态设置代理IP池,可加载请求对象。
  • urllib.request.HTTPCookieProcessor: 设置Cookies对象,可加载请求对象。
  • urllib.request.build_opener(): 创建请求对象,用于代理IP和Cookies对象加载。
  • urllib.parse.urlencode(data).encode(‘utf-8’): 请求数据格式转换。
  • urllib.parse.quote(url): URL编码处理,主要对URL上的中文等特殊符号编码处理。
  • urllib.parse.unquote(url): URL解码处理,将URL上的特殊符号还原。
    除了Urllib之外,一些特殊请求需要结合其他模块配合使用,如Cookies读写由HTTP模块完成,关闭证书验证需要SSL模块设置,等等。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值