5秒盾实例
偶尔有用的解决方式:
curl_cffi可以实现一些简单的反5秒盾。
pip install curl_cffi
from curl_cffi import requests as cffi_requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
}
url = ""
res = cffi_requests.get(url, impersonate='chrome110', timeout=10)
print(res.status_code, res.cookies)
无效的网站会返回 403 <Cookies[]>。
DrissionPage反反爬
这里采用DrissionPage自动化来反反爬。
pip install DrissionPage
安装后,编写代码:
from DrissionPage import ChromiumPage
from DrissionPage import ChromiumOptions
co = ChromiumOptions()
page = ChromiumPage(co)
url = ""
page.get(url)
page.wait(5)
print(page.user_agent)
page.get_screenshot(path=r"./test_browser_page.png", full_page=True)
page.quit()
没有开启无头模式时,通过保存截图可以确认正常绕开了5秒盾。如果只需要本地运行,到这里就够了。
但是本任务需要部署到没有GUI的linux服务器,也就意味着浏览器必须是无头模式。尝试修改代码:
from DrissionPage import ChromiumPage
from DrissionPage import ChromiumOptions
co = ChromiumOptions()
co.set_argument('--headless', True) # 无头模式
page = ChromiumPage(co)
url = ""
page.get(url)
page.wait(5)
print(page.user_agent)
page.get_screenshot(path=r"./test_browser_page.png", full_page=True)
page.quit()
结果一看截图,发现又被CloudFlare给拦截了。原来问题出在UA上:
print(page.user_agent)
打印结果是:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/128.0.0.0 Safari/537.36
可以发现里面有`HeadlessChrome`这一串,导致被CloudFlare给拦截了。因此只需要设置一下UA就好了!部署到服务器上后,中间一直有如下的报错:
DrissionPage.errors.BrowserConnectError:
127.0.0.1:18364浏览器无法链接。
请确认:
1、该端口为浏览器
2、已添加'--remote-debugging-port=18364'启动项
3、用户文件夹没有和已打开的浏览器冲突
4、如为无界面系统,请添加'--headless=new'参数
5、如果是Linux系统,可能还要添加'--no-sandbox'启动参数
可使用ChromiumOptions设置端口和用户文件夹路径。
修改后代码如下:
from DrissionPage import ChromiumPage
from DrissionPage import ChromiumOptions
# 创建页面对象
co = ChromiumOptions().auto_port() # 指定程序每次使用空闲的端口和临时用户文件夹创建浏览器
co.headless(True) # 无头模式
co.set_argument('--no-sandbox') # 无沙盒模式
co.set_argument('--headless=new') # 无界面系统添加
co.set_paths(browser_path="/opt/google/chrome/google-chrome") # 设置浏览器路径
co.set_argument('--disable-gpu') # 禁用gpu,提高加载速度
co.set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36")
page = ChromiumPage(co)
url = ""
page.get(url)
page.wait(5)
print(page.user_agent)
page.get_screenshot(path=r"./test_browser_page.png", full_page=True)
with open(r"./test_browser.html", "w", encoding="utf-8") as f:
f.write(page.html)
page.quit()
设置UA后从截图来看,真的做到了绕开这个5秒盾。其中set_paths用来在服务器上指明chrome路径,本地部署可忽略(?)。
参考:爬虫自动化之drissionpage在linux无头模式下过五秒盾Cloudflare
小插曲:
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
中间设置成这个UA也不行,CloudFlare好像也不接受过老版本的浏览器(这里是91.0所以失败了)。