python3网络爬虫学习——基本库的使用(2)

2.request

首先上实例

import urllib.request
request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

与之前一样生成了python官网的内容,但这次我们构造的是一个Request类,我们可以将请求独立成一个对象,也可以配置参数

class.urllib.request.Request(url , data = None , headers = {} , origin_req_host = None , unverifiable = False , method = None)

  • 第一个参数为必传参数,其他都为可选参数。
  • 第二个data如果要传,必须以字节流(bytes)的类型传,如果为字典,可以先用urllib.parse模块里的urlencode()编码
  • 第三个headers参数为一个字典,就是请求头,可用add_header()添加,可通过修改User-Agent来伪装成浏览器,比如要伪装成火狐浏览器,可以

             Mozilla/5.0 (X11;U;Linux i686) Gecko/20071127  Firefox/2.0.0.11

  • 第四个是请求方的host名称或者IP地址
  • 第五个表示这个请求是无法验证的,默认为False,比如我们要抓取某文档的图片,但没有自动获取的权限,这是该参数为TRUE
  • 第六个为一个字符串,用来只是请求使用的方法,比如GET,POST,PUT等
import urllib
from urllib import parse,request
url = 'http://httpbin.org/post'
headers = {
    'User-agent':'Mozilla/4.0(compatible;MSIE 5.5 ;Windows NT)'
    'host = httpbin.org'
    }
dict = {'name':'Germey'}
data = bytes(parse.urlencode(dict),encoding='utf-8')
req = urllib.request.Request(url=url , data = data , headers = headers , method = 'POST')
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))

===================== RESTART: F:\Python\exercise\ok.py =====================
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "Germey"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Connection": "close", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/4.0(compatible;MSIE 5.5 ;Windows NT)host = httpbin.org"
  }, 
  "json": null, 
  "origin": "182.110.15.26", 
  "url": "http://httpbin.org/post"
}

>>> 
bytes()函数的API为:
class bytes([source[, encoding[, errors]]])
  • 如果 source 为整数,则返回一个长度为 source 的初始化数组;
  • 如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
  • 如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;
  • 如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
  • 如果没有输入任何参数,默认就是初始化数组为0个元素。
 而parse下的urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回的是a=1&b=2这样的字符串
Request类也可以通过add_header('User-agent':'Mozilla/4.0(compatible;MSIE 5.5 ;Windows NT)
下面介绍一些更高级的用法,我们的工具Handle上场了
首先需要了解一下所有Handler的父类Basehandler类,他有很多子类:
  • HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误会抛出HTTPError异常
  • HTTPRedirectHandler:用于处理定向
  • HTTPCookieProcessor:用于处理Cookies
  • ProxyHandler:用于设置代理,默认代理为空
  • HTTPPasswordMgr:用于管理密码,维护了用户名和密码的表
  • HTTPBasicAuthHandler:用于管理认证,链接打开时需要认证,可用他来解决认证问题

还有OpenerDirector类,之前使用的urlopen其实就是打开了opener类,前面的urlopen就相当于封装好了请求方法,现在这个相当于更深一步配置请求功能,用到了opener类

其可以使用open方法,虽然返回的类型与urlopen()的一致

  • 验证

 

HTTPBasicAuthHandler处理器(Web客户端授权验证)

 

有些网站打开时会进行身份验证,提示输入用户名和密码

 

扫描二维码关注公众号,回复: 2855447 查看本文章
import urllib.request
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError

username = 'username'
password = 'password'
url = 'http://localhost:4000/'

#构建一个密码管理对象,用来保存需要处理的用户名和密码
p = urllib.request.HTTPPasswordMgrWithDefaultRealm()

#添加账户信息,第一个参数realm是与远程服务器相关的域信息,一般没人管都是None,后面三个参数分别是Web服务器,用户名,密码
p.add_password(None, url, username, password)

#构建一个HTTP基础用户名/密码验证的HTTPBasicAuthHandler处理器对象,参数是创建的密码管理对象
auth_handler=HTTPBasicAuthHandler(p)

#通过 build_opener()方法使用这些代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler
opener = build_opener(auth_handler)

#然后直接在Opener发送请求时就相当于已经验证成功了
try:
    urllib.request.install_opener(opener)
    result = opener.open(url)
    html = result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)

===================== RESTART: F:\Python\exercise\ok.py =====================
[WinError 10061] 由于目标计算机积极拒绝,无法连接。



 

  • 代理

 ProxyBasicAuthHandler(代理授权验证)

使用了ProxyHandler函数处理,直接上代码

import urllib.request
 
# 私密代理授权的账户
user = "mr_mao_hacker"
# 私密代理授权的密码
passwd = "sffqry9r"
# 私密代理 IP
proxyserver = "61.158.163.130:16816"
 
# 1. 构建一个密码管理对象,用来保存需要处理的用户名和密码
passwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
 
# 2. 添加账户信息,第一个参数realm是与远程服务器相关的域信息,一般没人管它都是写None,后面三个参数分别是 代理服务器、用户名、密码
passwdmgr.add_password(None, proxyserver, user, passwd)
 
# 3. 构建一个代理基础用户名/密码验证的ProxyBasicAuthHandler处理器对象,参数是创建的密码管理对象
#   注意,这里不再使用普通ProxyHandler类了
proxyauth_handler = urllib.request.ProxyBasicAuthHandler(passwdmgr)
 
# 4. 通过 build_opener()方法使用这些代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler 和 proxyauth_handler
opener = urllib.request.build_opener(proxyauth_handler)
 
# 5. 构造Request 请求
#这里构造的Request类相当于一个自定义的请求,但自定义只定义了他的URL,与只输入URL没有区别
request = urllib.request.Request("http://www.baidu.com/") # 6. 使用自定义opener发送请求 response = opener.open(request) # 7. 打印响应内容 print (response.read().decode('uft-8'))

关于代理的还可以参考这篇文章:https://blog.csdn.net/qq_32252917/article/details/79074219

首先,啥是Cookies呢,Cookies就是服务器暂存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookies 会帮你在网站上所打的文字或是一些选择都记录下来。当下次你再访问同一个网站,Web服务器会先看看有没有它上次留下的Cookies资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。

先上一个实例如何将网站的Cookies弄下来:

import http.cookiejar,urllib.request
#首先必须声明一个CookieJar对象
cookie = http.cookiejar.CookieJar() handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) response = opener.open('http://www.baidu.com') for item in cookie: print (item.name+"="+item.value) ====================== RESTART: F:\Python\exercise\1.py ====================== BAIDUID=76B5F4D5A2EF8ADD2571BABCBAA63F79:FG=1 BIDUPSID=76B5F4D5A2EF8ADD2571BABCBAA63F79 H_PS_PSSID=1993_1454_21093_26350_26922_22158 PSTM=1534469599 BDSVRTM=0 BD_HOME=0 delPer=0

 

然后根据网上一个博主的博客,进行其他一些学习https://blog.csdn.net/c406495762/article/details/69817490

接着我保存cookie的信息

import http.cookiejar,urllib.request
filename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.build_opener(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard = True , ignore_expires = True)

发现程序显示为

这个坑先留到这里,如果哪位大神知道我哪里错了,还请能帮忙指出

猜你喜欢

转载自www.cnblogs.com/gausstu/p/9500919.html