• socket,urllib,urllib3,request多种方法请求网页首页



    请求网页是爬虫的基础,多种请求网页方法如下:
    socket访问
    # 用socket发出请求
    import socket
    
    # 创建一个套接字客户端
    client = socket.socket()
    
    # 连接百度
    client.connect(("www.baidu.com",80))
    
    # 构造报文
    req = 'GET / HTTP/1.0
    Host:www.baidu.com
    
    '
    
    # 发送请求
    client.send(req.encode())
    
    # 循环接受消息
    data = client.recv(1024)
    res = b""
    while data:
        res += data
        data = client.recv(1024)

     如果socket套接字中添加请求头的,直接在请求报文中添加

    req = 'GET / HTTP/1.0
    Host:www.baidu.com
    User-Agent:{}
    
    '.format(ua)

    urllib方法:

    import urllib.request
    
    # 通过urlopen方法向百度发送网络请求
    req = urllib.request.urlopen("http://www.baidu.com")
    # 通过read()方法接受百度响应
    res = req.read().decode()
    print(res)

    当服务器返回响应的状态码403,比如访问https://www.jianshu.com,这个时候我们需要添加请求头部,伪装成浏览器访问,我们可以发现urlopen方法中的参数有url,data和timeout,并没有可以添加请求头的参数,那么就需要用到urllib.request中的另一个类对象Request

    import urllib.request
    
    
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
    }
    
    # 用Request方法添加请求头部
    req = urllib.request.Request("https://www.jianshu.com",headers=headers)
    # 通过urlopen发送请求并读取响应
    res = urllib.request.urlopen(req).read().decode()
    print(res)

    通过urllib库,也可以构造cookie处理器,创建一个opener对象进行访问,注urlopen是一个特殊的opener对象

    import urllib.request
    from http import cookiejar
    
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
    }
    
    # 创建cookies对象
    cookies = cookiejar.CookieJar()
    # 创建一个cookie处理器
    cookie = urllib.request.HTTPCookieProcessor(cookies)
    # 创建一个opener对象
    opener = urllib.request.build_opener(cookie)
    # 用创建的opener对象对简书发出请求
    req = urllib.request.Request("https://www.jianshu.com",headers=headers)
    res = opener.open(req).read().decode()
    print(res)

     urllib3方法访问:

    urllib3中的参数中能够直接传参headers,请求比前几种方法更为方便

    import urllib3
    # 实例一个PoolManager对象构造请求
    http = urllib3.PoolManager()
    # request方法发送请求
    req = http.request("GET","https://www.jianshu.com",headers=headers)
    # data读取响应数据
    res = req.data.decode()
    print(res)

    requests方法访问:

    import requests
    # 发送请求
    req = requests.get("https://www.jianshu.com",headers=headers)
    # 读取响应
    # 方法1:text读取
    req.encoding = "utf-8"
    print(req.text)
    
    # 方法2:content读取
    print(req.content)
  • 相关阅读:
    pxe基于虚拟机的自启动
    time & datetime
    python文件读写操作
    lambda与常用内置函数
    python基础
    python day2:python 初识(二)
    mysql select
    python day1:初识Python(一)
    linux命令总结
    lvs/dr配置
  • 原文地址:https://www.cnblogs.com/zgzeng/p/11793411.html
Copyright © 2020-2023  润新知