SELENIUM+CHROME+MITMPROXY修改请求链接

这里要实现的功能是在windows7下用selenium打开chrome浏览器访问某个壁纸网页,这个壁纸只会显示一张壁纸,但每次访问得到的壁纸都不一样,这里用mitmproxy修改浏览器访问这个网页的某个链接,使他每次返回的图片都是同一张。访问网站:

https://wallpaper.wispx.cn/random

1.png

可以看到,里面的图片就是红色圈圈的链接所加载的静态资源,我们要做的就是拦截它的所有请求,并对它的其中一条做出修改:
下图是这个网址的所有请求


clipboard.png

每一次请求这个网站,最后一条链接都会不同,这里我们用mitmproxy修改,使他的请求每一次都是一样的。
环境安装:

python用的是3.7.5

selenium的安装:

pip install selenium

可能会报错,一般是缺少c++运行环境,去搜visualcppbuildtools full.exe下载安装。
chromedriver和chrome浏览器的安装:
chromedriver和chrome的版本要对应,
chromedriver去下面这个网址下载,注意chromedriver只有32位的:

http://chromedriver.storage.googleapis.com/index.html

chrome去这个网址下载:

https://www.chromedownloads.net/chrome32win/

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
static

chromedriver.exe

运行chromeRun.py,会在本机的默认浏览器上打开一个界面,记录访问的链接。


2019-12-11_160923.png

之后可以看到,10次循环,每次访问都是同一种壁纸

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容