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


请求网页是爬虫的基础,多种请求网页方法如下:
socket访问
# 用socket发出请求
import socket

# 创建一个套接字客户端
client = socket.socket()

# 连接百度
client.connect(("www.baidu.com",80))

# 构造报文
req = 'GET / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n'

# 发送请求
client.send(req.encode())

# 循环接受消息
data = client.recv(1024)
res = b""
while data:
    res += data
    data = client.recv(1024)

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

req = 'GET / HTTP/1.0\r\nHost:www.baidu.com\r\nUser-Agent:{}\r\n\r\n'.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)

猜你喜欢

转载自www.cnblogs.com/zgzeng/p/11793411.html