最近在搞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!!!
接着就是百度,其中有一篇文章说到http和https的区别
可能要发送不同的请求,于是我首先进行了如下改进:
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"))