Python:用socket模块请求网页数据时,报301,302的解决办法

最近在搞socket,要请求B站的数据,但是代码写出来总是报301

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ("www.bilibili.com", 443)
s.connect(addr)

s.send("GET / HTTP/1.1\r\nHost: www.bilibili.com\r\n\r\n".encode("utf-8"))
while True:
    response = s.recv(8192)
    if not len(response):
        break
    print(response.decode("utf-8"))

运行后信息如下图
在这里插入图片描述
注意图中的重定向指向了一个https!!!
接着就是百度,其中有一篇文章说到httphttps的区别
可能要发送不同的请求,于是我首先进行了如下改进:

import ssl

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client = ssl.wrap_socket(s)

由此可以发送https请求
再试了一下发现依然没有成功,结果如下
在这里插入图片描述
这一次报的是302,并且返回了一个很复杂的子路径
#解决办法:
最终没能从网上找到合适的解决办法
我综合以前学爬虫时遇到的问题,会不会是网站简单的防御机制,要不要再改一下get请求
于是我从Chrome中复制了User-Agent,加到了get中
并且把那个子路径也加上了。。。可能不加也行吧,但是我保险起见就加了
终于成功!
在这里插入图片描述
最终代码的如下

import socket
import ssl

s = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
addr = ("www.bilibili.com", 443)
s.connect(addr)

s.send("GET / HTTP/1.1\r\nHost: www.bilibili.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\r\n\r\n".encode("utf-8"))
while True:
    response = s.recv(8192)
    if not len(response):
        break
    print(response.decode("utf-8"))

发布了28 篇原创文章 · 获赞 74 · 访问量 1675

猜你喜欢

转载自blog.csdn.net/CxsGhost/article/details/103281405