1.get传参
汉字报错:解释器ASCII没有汉字 url汉字转码:urllib.parse.quote safe='string.printtable'
字典传参:urllib.parse.urlencode()
2.post传参:
urllib.request.openurl(url,data='服务器接收的数据')
handler:处理器的自定义:
User-Agent:
(1)模拟真实的浏览器发送请求:百度批量搜索、检察元素(百度搜索useragent大全)
(2)request.add_header(动态添加head数据)
(3)响应头 response.header
(4)创建requset:urllib.requset.Request(url)
import urllib.request def load_baidu(): url = 'http://www.baidu.com' # 创建请求对象 request = urllib.request.Request(url) # 请求网数据 response = urllib.request.urlopen(request) print(response) data = response.read().decode('utf-8') # 响应头 # print(response.headers) # 获取请求头信息 request_header = request.headers print(request_header) with open('02headers.html','w',encoding='utf-8') as f: f.write(data) load_baidu()
import urllib.request def load_baidu(): url = 'http://www.baidu.com' header = { # 浏览器的版本 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36' } # 创建请求对象 request = urllib.request.Request(url,headers=header) # 请求网数据(不在此处增加请求头信息,是因为此方法系统没有提供) response = urllib.request.urlopen(request) print(response) data = response.read().decode('utf-8') # 响应头 # print(response.headers) # 获取请求头信息 request_header = request.headers print(request_header) with open('02headers.html','w',encoding='utf-8') as f: f.write(data) load_baidu()
# 用不一样的电脑和浏览器去请求网站 import urllib.request import random def load_baidu(): url = 'http://baidu.com' user_agent_list = [ 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0', 'User-Agent,Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50', ] # 每次请求的浏览器都是不一样的 random_user_agent = random.choice(user_agent_list) request_name = urllib.request.Request(url) # 增加对应的响应头信息(user-agent) request_name.add_header('User-Agent',random_user_agent) # 请求数据 response = urllib.request.urlopen(request_name) # 请求头信息 print(request_name.get_header('User-agent')) load_baidu()
3.IP 代理:
免费的IP:时效性差,错误率高
付费的IP:需要花钱,也有失效不能用的
IP分类:
透明:对方知道我们不是真实的IP
匿名:对方不知道我们真实的IP,知道我们用了代理IP
高匿:对方不知道我们真实的IP,也不知道我们使用了代理IP
handler:系统的 urlopen()不支持代理的添加
创建对应的处理器(handler)
拿着ProxyHandler创建opener.bulid_opener()‘’
opener.open(url)可以请求数据
# 爬网站 import urllib.request def handler_openner(): # 系统的urlopen 并没有添加代理的功能,需要我们自定义这个功能 # 安全 套接层ssl第三方的CA数字证书 # http 08端口 https 443端口 # urlopen 为什么可以请求数据 handler处理器 # 自己的opener请求数据 url = 'https://zhidao.baidu.com/question/1697126599476953348.html' # 创建自己的处理器 handler = urllib.request.HTTPHandler() # 创建自己的opener opener = urllib.request.build_opener(handler) # 用自己创建的opener调用open方法请求数据 response = opener.open(url) data = response.read() print(response) print(data) handler_openner()
# 用代理IP爬取网站 import urllib.request def proxy_handler_1(): url = 'https://zhidao.baidu.com/question/1697126599476953348.html' # 添加代理 proxy = { 'http':'61.153.251.150:22222' } # 代理处理器 proxy_handler = urllib.request.ProxyHandler(proxy) # 创建自己的opener opener = urllib.request.build_opener(proxy_handler) # 用代理IP向网站发送请求 data = opener.open(url).read() print(data) proxy_handler_1()
# 使用多个ip地址访问网站 import urllib.request def proxy_user(): proxy_name = [ {'http':'111.76.221.190:8118'}, {'http':'111.160.169.54:42626'}, {'http':'14.115.104.123:9797'}, {'http':'119.123.76.117:8118'}, {'http':'222.85.28.130:40505'} ] for proxy in proxy_name: print(proxy) # 利用遍历出来的ip创建处理器 proxy_handler = urllib.request.ProxyHandler(proxy) # 创建opener opener = urllib.request.build_opener(proxy_handler) # 验证代理ip是否好用 try: opener.open('http://www.baidu.com') print(opener) except Exception as e: print(e) proxy_user() ''' 程序运行结果如下 {'http': '111.76.221.190:8118'} Remote end closed connection without response {'http': '111.160.169.54:42626'} <urlopen error [WinError 10061] 由于目标计算机积极拒绝,无法连接。> {'http': '14.115.104.123:9797'} <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。> {'http': '119.123.76.117:8118'} <urllib.request.OpenerDirector object at 0x0000014E67C79448> {'http': '222.85.28.130:40505'} <urlopen error [WinError 10061] 由于目标计算机积极拒绝,无法连接。> '''