这里要实现的功能是在windows7下用selenium打开chrome浏览器访问某个壁纸网页,这个壁纸只会显示一张壁纸,但每次访问得到的壁纸都不一样,这里用mitmproxy修改浏览器访问这个网页的某个链接,使他每次返回的图片都是同一张。访问网站:
https://wallpaper.wispx.cn/random
可以看到,里面的图片就是红色圈圈的链接所加载的静态资源,我们要做的就是拦截它的所有请求,并对它的其中一条做出修改:
下图是这个网址的所有请求
每一次请求这个网站,最后一条链接都会不同,这里我们用mitmproxy修改,使他的请求每一次都是一样的。
环境安装:
python用的是3.7.5
selenium的安装:
pip install selenium
可能会报错,一般是缺少c++运行环境,去搜visualcppbuildtools full.exe下载安装。
chromedriver和chrome浏览器的安装:
chromedriver和chrome的版本要对应,
chromedriver去下面这个网址下载,注意chromedriver只有32位的:
chrome去这个网址下载:
mitmproxy的安装:
pip3 install mitmproxy
完成后,系统将拥有 mitmproxy、mitmdump、mitmweb 三个命令,由于 mitmproxy 命令不支持在 windows 系统中运行(这没关系,不用担心),我们可以拿 mitmdump 测试一下安装是否成功,执行:
mitmdump --version
成功后显示:
Mitmproxy: 4.0.1
Python: 3.6.5
OpenSSL: OpenSSL 1.1.0h 27 Mar 2018
Platform: Windows-10-10.0.16299-SP0
这里我们用mitmweb启动代理
上代码:
新建一个counts.py文件
import mitmproxy.http
from mitmproxy import ctx
class Counter:
def __init__(self):
self.num = 0
def request(self, flow: mitmproxy.http.HTTPFlow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
新建addons.py文件
import counter
import joker
addons = [
counter.Counter(),
joker.Joker(),
]
新建joker.py文件
import mitmproxy.http
from mitmproxy import ctx, http
class Joker:
def request(self, flow: mitmproxy.http.HTTPFlow):
if flow.request.url.find("jpg") != -1 or flow.request.url.find("png") != -1:
flow.request.url = "https://cdn.wispx.cn/wallpaper/2018/07/12/5bd04aee7591ab17cf517af60480384f.jpg"
这里判断请求中是否有jpg或png关键字,用的话就对它的链接进行替换
新建一个chromeRun.py,控制chrome行为
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random
import threading
class myThread(threading.Thread):
def run(self):
try:
os.system('mitmweb -s addons.py')
except Exception as e:
print(e)
#启动代理,这里要单独开个线程,防止阻塞
myThread().start()
time.sleep(10)
for i in range(10):
useAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
url = "https://wallpaper.wispx.cn/random"
options = Options()
options.add_argument('--no-sanbox')
#无头模式,是否显示浏览器界面
#options.add_argument("--headless")
#禁止使用插件
options.add_argument('disable-plugins')
options.add_argument('accept-language="zh-CN,en-US;q=0.8"')
options.add_argument("--dns-prefetch-disable")
options.add_argument("--disable-features=RendererCodeIntegrity")
options.add_argument('user-agent="' + useAgent + '"')
options.add_argument('--disable-gpu')
options.add_argument('accept-encoding="gzip,deflate"')
#设置代理,让访问的链接通过mitmproxy的代理端口
options.add_argument('--proxy-server=http://localhost:8080')
#忽略证书错误
options.add_argument('--test-type=--ignore-certificate-errors')
prefs = {
'profile.default_content_settings.popups': 0,
"profile.managed_default_content_settings.images": 1
}
options.add_experimental_option("prefs", prefs)
options.add_experimental_option('excludeSwitches', ['enable-automation']) # 专业模式
browser = webdriver.Chrome("static/chromedriver.exe", options=options)
browser.set_page_load_timeout(random.randint(30,55))
try:
browser.get(url)
except Exception as e:
print(e)
time.sleep(10)
browser.delete_all_cookies()
browser.quit()
文件目录结构如下:
counts.py
joker.py
addons.py
chromeRun.py
staticchromedriver.exe
运行chromeRun.py,会在本机的默认浏览器上打开一个界面,记录访问的链接。
之后可以看到,10次循环,每次访问都是同一种壁纸