微信公众号上的一次爬虫

前段时间,需要在微信上的一个公众号进行登陆、并进行公众号内的操作。这篇文章主要记录通过两种方式进行模拟登陆并操作该公众号,分别为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 正 - 关注人工智能及互联网的个人博客
文章地址:微信公众号上的一次爬虫

原文地址:https://www.cnblogs.com/l0zh/p/13739745.html