请求网页是爬虫的基础,多种请求网页方法如下:
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)