zoukankan      html  css  js  c++  java
  • 微信公众号上的一次爬虫

    前段时间,需要在微信上的一个公众号进行登陆、并进行公众号内的操作。这篇文章主要记录通过两种方式进行模拟登陆并操作该公众号,分别为selenium以及requests两种方式。


    前期准备工作

    1. 利用fiddler进行手机代理的设置

    由于手机查看请求不方便,因此利用fiddler进行手机代理的设置,从而在电脑端的fiddler获取到手机所有对外发起的请求,具体设置步骤如下:
    1>设置fiddler允许远程计算机连接:设置允许远程计算机连接.png
    2>下载fiddler证书:下载证书.png
    3>在手机端导入证书,步骤为:代理、导入、手动导入,然后设置IP、端口。此时即完成fiddler手机代理的设置。

    2. burpsite手机代理的设置

    由于fiddler只能截取到请求,但是不能对参数进行修改,因此使用burpsite进行请求的截取以及修改。其中burpsite手机代理的设置只需要设置允许远程计算机连接,并在手机端进行代理的相应IP、端口设置即可。

    此时前期工作完成,以上两部是两种方式都需要进行设置的,其中两种代理各种好处,fiddler是为了更清楚地看清公众号操作的每一个请求,从而更好地进行模拟操作;burpsite是为了修改请求的参数,从而发现请求参数中,哪些参数是重要的,并且发现那些参数修改后就可修改了登陆公众号的用户信息(也就是新用户)。

    selenium进行模拟登陆操作

    1. chrome进行模拟手机网页的设置
    chrome是可以设置为手机网页样式的,也就是模拟手机查看网页,具体设置只需要设置两处:
    chrome手机端的设置.png
    其中上面是设置模拟手机的型号,设置后,也就不用进行user-agent的设置了。
    在selenium内设置为:

    mobile_emulation = {"deviceName": "Pixel 2 XL",
                    }
    options = Options()
    options.add_experimental_option("mobileEmulation", mobile_emulation)
    # options.add_argument("--proxy-server=http://139.224.233.9:80")
    driver = webdriver.Chrome(chrome_options=options)
    

    2. chrome修改cookie插件的设置
    chrome修改cookie的插件,我使用的是EditThisCookie,进行下载安装后,可直接对cookie进行修改。
    Editthicookie.png
    3. 进行cookie的设置
    此次进行登陆公众号并进行操作,最重要的也就是cookie,通过burpsite发现,只需要修改请求内的一个参数也就可以成功切换用户,从而进行多次操作,其实也就是cookie的改变
    需要注意的是,cookie同名不同域也需要分别进行设置,slenium设置不同域的cookie的方为:

    cookie1 = {'name': '.ASPXAUTH', 'domain': 'xxx','value': 'xxx',
           'httpOnly': False, 'secure': False, 'path': '/'}
    cookie2 = {'name': 'JSESSIONID', 'value': 'xxx', 'domain': 'xxx',
           'httpOnly': False, 'secure': False, 'path': '/'}
    driver.add_cookie(cookie1)
    driver.add_cookie(cookie2)
    

    此时逐步获取模拟点击的元素进行点击、填写的操作即可,同时循环修改cookie的关键参数,就完成了用户地切换,代码实例如下:

    # wait = WebDriverWait(driver, 1)
    in_activity = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "#enrollBtn > p"))
    )
    print('print(in_activity.text)' + in_activity.text)
    in_activity.click()
    unselect_activity = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR,
            "#content > div.even-wrapper > li:nth-child(3) > div > div.img-holder > img")))
    unselect_activity.click()
    

    requests进行操作

    相对于selenium,此种方法更快,但是编写代码需要更仔细,认真分析fiddler地每一次请求,最好每一次请求都进行模拟,避免缺漏某次请求的cookie设置或返还参数缺漏,导致程序的失败。
    通过分析一次完成的操作,在fiddler内进行每一次get、post请求的,在编写代码时,将每次请求都使用requests进行请求,同时循环的将关键参数进行修改,从而完成对用户地切换。在分析地过程中,需要对一些参数进行分析,比如该用户是否已经进行了操作等。

    在分析地过程中,关键是需要逐步进行,确认返回的参数是正确的、是成功切换了用户的。

    由于需要修改cookie,因此使用到requests的session,此时就需要进行header的设置了(可能每次请求需要的header都不一样)。

    程序完善

    1. 保存可用用户
    为了更快的进行操作,对可用用户、已进行操作的用户进行记录,利用mysql数据库进行记录,同时抽取未操作的用户也是在mysql内抽取。
    2. 多线程进行操作
    每个程序若单线程进行,就算开了多个程序也比较慢,同时占用内存。进行单程序的多线程设置,需要注意的是如何能避免不会同时抽取到统一用户,实现代码如下:
    from multiprocessing.pool import Pool
    # 获取所有可用的用户
    list = get_id_all(0)[0:max_number]
    pool = Pool()
    # 将函数、可变的参数参入
    pool.map(main,list)
    3. 代理的设置
    此次操作未进行设置,若公众号对IP访问有限制,可使用代理池进行代理的设置。

    个人博客:Loak 正 - 关注人工智能及互联网的个人博客
    文章地址:微信公众号上的一次爬虫

  • 相关阅读:
    c#声明数组
    【游戏物理】欧拉、龙格、韦尔莱
    当const放在function声明后
    【物理】AABB物理碰撞检测
    100 Path Sum
    Loop Unrolling 循环展开
    Unity Shader and Effects Cookbook问题记录
    【ShaderToy】画一个球体
    pymysql
    mysql表间的关系和查询
  • 原文地址:https://www.cnblogs.com/l0zh/p/13739745.html
Copyright © 2011-2022 走看看