python爬虫 day02

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] 由于目标计算机积极拒绝,无法连接。>
'''

猜你喜欢

转载自www.cnblogs.com/Ningxuan/p/12433478.html