爬虫学习之Urllib库

?

爬虫学习之Urllib数据抓取

?

Urlib是一个收集几个模块来使用URL的软件包,大致具备以下功能:

  • urllib,request:用于打开和读取URL

  • urllib.error:包含提出的例外urllib.request

  • urllib.parse:用于解析URL

  • urllib.rebotparser:用于解析robots.txt文件


样例一:先给出基本代码:

# 导入urllib
import urllib.request
# 打开URL
response = urllib.request.urlopen(‘https://movie.douban.com/‘, None, 2)#设置的访问时间为两秒
# 读取返回的内容
html = response.read().decode(‘utf8‘)
# 写入txt
f = open(‘code1.txt‘, ‘w‘, encoding=‘utf8‘)
f.write(html)
f.close()

其中urlopen对象提供获取网站相应内容的方法函数,介绍如下

  • read()、readline()、readlines()、fileno()和close():对HTTPResponse类型数据操作

  • info():返回HTTPMessage对象,表示远程服务器返回的头信息

  • getcode():返回HTTP状态码

  • geturl:返回请求的url


样例二:较为复杂的请求

运用到一下两个函数功能
urllib.request.urlopen(url,data=,[timeout],cafile=,capath=,cadefault=,context=)
  • url:要访问的url,必须是完整的

  • data:默认为None,在get请求中一般为None,在Post请求一般为字典形式,且需要转换为字节类型才能完成Post请求

  • timeout:超时设置,指定阻塞操作(请求时间)的超时

  • cafile、capath、cadefault:使用参数指定一组HTTP请求可信的CA证书,cafile指向单个文件,capath指向路径,cadefault使用默认值即可

  • context:描述各种SSL选项的实例

urllib.request.Request(url,data=,header={},method=)
  • url:完整的url格式,与urllib.request.urlopen的参数url一致

  • data:请求参数,与urllib.request.urlopen的参数data一直

  • headers:设置request请求头信息

  • method:设定请求方式,主要是post和get方式

# 导入urllib
import urllib.request
url = ‘https://movie.douban.com/‘
# 自定义请求头
headers = {
   ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)‘
   ‘Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3‘,
   ‘Referer‘: ‘https://movie.douban.com/‘,
   ‘Connection‘: ‘keep-alive‘}
# 设置request的请求头
req = urllib.request.Request(url, headers=headers)
# 使用urlopen打开req
html = urllib.request.urlopen(req).read().decode(‘utf-8‘)
# 写入文件
f = open(‘code2.txt‘, ‘w‘, encoding=‘utf8‘)
f.write(html)
f.close()
?

样例三:使用代理IP

Urllib提供了urllib.request.Proxyhandler()方法可以动态设置代理IP池,主要以字典格式写入方法。完成代理IP设置后,将设置好的代理IP写入urllib.request.build_opener()方法,生成对象opener,然后通过opener的open()方法向网站(服务器)发送请求。

参照上一个样例:

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

使用代理ip容易出现超时,所以同时给出以下Urllib的差错处理机制

?
ConnectionResetError 远程主机强迫关闭了一个现有的连接
urllib.error.URLError 结束没有响应的远程连接
urllib.error.URLError urllib.error.URLError:urlopen error远程主机强迫关闭了一个现有的连接
TimeoutError 超时的时候,判定连接失败
urllib.error.URLError 由于目标计算机拒绝被访问,因此无法连接。
?

样例四:使用Cookies

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

import urllib.request
from http import cookiejar
filename = ‘cookie.txt‘
# MozillaCookieJar保存cookie
cookie = cookiejar.MozillaCookieJar(filename)
# HTTPCookieProcessor创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
# 创建自定义opener
opener = urllib.request.build_opener(handler)
# open方法打开网页
response = opener.open(‘https://movie.douban.com/‘)
# 保存cookie文件
cookie.save()

代码中的cookiejar是自动处理HTTP Cookie的类,MozillaCookieJar()用于将Cookie内容写入文件。程序运行时先创建MoillaCookieJar()对象,然后将对象直接传入函数HTTPCookieProcessor,生成opener对象;最后使用opener对象访问URL,访问过程所生成的Cookies就直接写入一创建的文本文档中。

接着再来看看如何读取Cookies,代码如下

import urllib.request
from http import cookiejar
filename = ‘cookie.txt‘
# 创建MozillaCookieJar对象
cookie = cookiejar.MozillaCookieJar()
# 读取cookie内容到变量
cookie.load(filename)
# HTTPCookieProcessor创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
# 创建opener
opener = urllib.request.build_opener(handler)
# opener打开网页
response = opener.open(‘https://movie.douban.com/‘)
# 输出结果
print(cookie)

读取和写入方法很相似,主要区别在于:两者对于MozillaCookieJar()对象的操作不同,导致实现功能不同。 正常开发时,为了安全性考虑,再保存读取Cookies时设置参数,使Cookies信息隐藏在文件中,方法如下:

cookie.save(ignore_expires=True,ignore_discard=True)
cookie.load(filename,ignore_discard=True,ignore_expires=True)

样例五:使用POST请求

因为Urllib.request.urlopen()是不区分的POST和GET请求的。,识别请求方式主要是通过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‘)
req = urllib.request.urlopen(url, data=data)

代码中urllib.parse.urlencode(data)讲数据转换成字节的数据类型,而encode(’utf-8‘)设置字节的编码格式,这里需要注意的是,编码格式主要根据网站编码格式决定外,urlencode的作用只是对请求参数做数据格式转换处理。

除此之外Urllib还提供quote()和unquote()对URL编码处理,使用方法如下:

import urllib.parse
url = ‘%2523%25E7%25BC%2596%25E7%25A8%258B%2523‘
# 第一次解码
first = urllib.parse.unquote(url)
print(first)
# 输出:‘%23%E7%BC%96%E7%A8%8B%23‘
# 第二次解码
second = urllib.parse.unquote(first)
print(second)
# 输出:‘#编程#‘
?

小结与后记

常用语法汇总
  • Urllib.request.urlopen():urllib最基本的使用功能,用于访问URL的唯一方法

  • urllib.request.Request():声明request对象,该对象可自定义请求头(header)、请求方式等信息。

  • urllib.request.ProxyHandler:动态设置代理IP池,可加载请求对象。

  • urllib.request.HTTPCookieProcesser:设置Cookie对象,可加载请求对象

  • urllib.request.build_opener:创建请求对象,可加载请求对象

  • urllib.request.parse.urlencode(data).encode(‘utf-8‘):请求输局格式转换

  • urllib.parse.quote(url):URL编码处理,主要对URL上的中文等特殊符号编码处理

  • urllib.parse.unquote():URL解码处理,将URL上的特殊符号还原。

关闭证书验证方法,SSL就是遵守SSL协议,由受信任的数字证书机构颁发CA,在验证服务器身份后班发,具有服务器身份验证和数据传输加密功能。遇到证书验证的网站,最简单暴力的方法就是关闭证书验证,在代码中引入SSL模块,设置关闭证书验证即可,代码如下:(以12306为例)

import urllib.request
import ssl
# 关闭证书验证
ssl._create_default_https_context = ssl._create_unverified_context
url = ‘https://kyfw.12306.cn/otn/leftTicket/init‘
response = urllib.request.urlopen(url)
# 输出状态码
print(response.getcode())

 

 

 

爬虫学习之Urllib库

上一篇:Nodejs开发之一 npm init 初始化, 生成pakeage.json文件


下一篇:PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC........