python 爬虫请求头伪造

19.3 请求头伪造

  1. 伪造原理
    在阅读本文前,大家要有一个概念,在实现正常的TCP/IP 双方通信情况下,是无法伪造来源 IP 的,也就是说,在 TCP/IP 协议中,可以伪造数据包来源 IP ,但这会让发送出去的数据包有去无回,无法实现正常的通信。这就像我们给对方写信时,如果写出错误的发信人地址,而收信人按信封上的发信人地址回信时,原发信人是无法收到回信的。
    注意:本文伪造来源IP 是带引号的。并非是所有 HTTP 应用程序中存在此漏洞。
  2. 那么如何伪造这项值(X-Forward-For)?
    方法一: 如果你会写程序,并了解HTTP 协议,直接伪造请求 header 即可
    方法二: 使用 Firefox 的Moify Headers 插件即可(推荐)
  3. 如何避免伪造ip
    方法:服务器重新配置X-Forward-For 为正确的值

反爬
反反爬:
1.请求头伪造
2.多次采集数据 Time.sleep(random)
3.ip地址的代理(推荐)

数据头User-Agent反爬虫机制解析:
当我们使用浏览器访问网站的时候,浏览器会发送一小段信息给网站,我们称为Request Headers,在这个头部信息里面包含了本次访问的一些信息,例如编码方式,当前地址,将要访问的地址等等。这些信息一般来说是不必要的,但是现在很多网站会把这些信息利用起来。其中最常被用到的一个信息,叫做“User-Agent”。网站可以通过User-Agent来判断用户是使用什么浏览器访问。不同浏览器的User-Agent是不一样的,但都有遵循一定的规则。

但是如果我们使用 Python 的 Requests 直接访问网站,除了网址不提供其他的信息,那么网站收到的User-Agent是空。这个时候网站就知道我们不是使用浏览器访问的,于是它就可以拒绝我们的访问

import urllib.request 
from urllib import request 
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36" }
url = "https://www.baidu.com" 
response = request.Request(url=url,headers=headers) 
resp = request.urlopen(response) 
data = resp.read()
 print(data) 
 with open("baidu.html","wb") as f: 
 f.write(data)
from urllib import request 
import random 
us = ["Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" ]
headers = { "User-Agent":random.choice(us) }
print(headers) 
url = "https://www.baidu.com" 
response = request.Request(url=url,headers=headers) 
resp = request.urlopen(response) 
data = resp.read() 
print(data) 
# with open("qq.html","wb") as f: 
# f.write(data)
import random from urllib 
import request
 import chardet 
 us = ["Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" ]
 headers = { "User-Agent":random.choice(us) }
 url = "http://www.sina.com.cn" 
 #真正的请求头对象 req = request.Request(url=url,headers=headers) 
 resp = request.urlopen(req) 
 data = resp.read() 
 #返回的是字典对象 
 res = chardet.detect(data) 
 char = res.get("encoding")
 print(char) 
 #print(res) html = data.decode(char) 
 # html = data.decode("gb2312",errors="ignore")
  # #先转为二进制数据 转为字符串
   # print(html) 
   # with open("qq.html","wb") as f: 
   # f.write(data)

你可能感兴趣的:(python,http,https)