网上搜索爬取微信圈内容,信息量少得可怜,几乎都是第三方库整个微信朋友数量或者微信朋友信息,整个结霸 弄个数据分析。
那么朋友圈内容到底可以爬取吗?
因为工作需要所以摸索了些门道出来。
使用fiddler或者是使用小尿壶(Charles)来进行抓包 几乎是没有什么需要得信息得。或者是使用mitmproxy进行拦截 也是无用得。微信对外得接口少之又少,但有一点是微信公众号可以使用这些获取到需要得内容,具体得有时间在写一篇获取公众号文章得博客,公众号文章抓取有几个渠道可以参考:搜狗微信、python有个第三方库获取得内容和搜狗微信得一个样,微信公众平台有接口可以获取到公众号内容。
言归正传接着朋友圈内容
采用得方法就是 python + appium + selenium
也可以使用 模拟器自带得操作录制,进行记录你得自动化操作 可以省去 appium得配置 直接自动化吧,这是个简便得土方法太low
apium得安装与使用 在这就不描述了,网上一大堆。
在这里主要就是说一下思路:
import os , re
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# from pymongo import MongoClient
from time import sleep
from processor import Processor
from config import *
class Moments():
def __init__(self):
self.desired_caps = {
'platformName': PLATFORM,
'deviceName': DEVICE_NAME,
'appPackage': APP_PACKAGE,
'appActivity': APP_ACTIVITY,
'noReset': True
}
self.driver = webdriver.Remote(DRIVER_SERVER, self.desired_caps)
self.wait = WebDriverWait(self.driver, 300)
def login(self):
print('正在登陆中——————')
sleep(5)
login = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/drq')))
login.click()
print('*****')
sleep(2)
# 输入手机号
phone = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/ji')))
phone_num = input('请输入手机号')
sleep(2)
phone.send_keys(phone_num)
print('点击下一步中')
sleep(2)
button = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/ast')))
button.click()
sleep(2)
pass_w = input('请输入密码:')
sleep(2)
password = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/ji')))
password.send_keys(pass_w)
sleep(2)
login = self.driver.find_element_by_id('com.tencent.mm:id/ast')
login.click()
# 提示 是否导入通讯录
tip = self.wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/au9')))
tip.click()
def enter(self):
"""
进入朋友圈
:return:
"""
sleep(10)
print('等待10秒')
# 搜索
print('点击搜索')
moments = self.wait.until(EC.presence_of_element_located((By.XPATH, '//android.widget.TextView[@content-desc="搜索"]')))
moments.click()
#搜索框
print('搜索内容')
sousuo = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/ji')))
sleep(2)
sou = input('请输入对方账户:')
sousuo.send_keys(sou)
sleep(2)
print('点击固定用户 ')
cli = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/oj')))
cli.click()
sleep(2)
print('点击右上角三个点')
cli3 = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/j1')))
cli3.click()
sleep(4)
print('点击个人头像 "')
cli4 = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/dnn')))
cli4.click()
sleep(3)
print('点击个人相册进入朋友全')
cli5 = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/cww')))
cli5.click()
sleep(2)
def crawl(self):
"""
爬取
:return:
"""
# 上滑
sleep(15)
print('开始爬..')
no_list = []
n = 0
while True:
# 当前页面显示的所有数据
# items = self.wait.until(EC.presence_of_all_elements_located((By.ID, 'com.tencent.mm:id/e2s')))
items = self.driver.find_elements(By.ID, 'com.tencent.mm:id/kl')
sleep(3)
# 遍历每条状态
for item in items:
try:
# 昵称
# nickname = item.find_element_by_id('com.tencent.mm:id/aig').get_attribute('text')
imgs = item.find_element_by_id('com.tencent.mm:id/e4y').get_attribute('img')
print(imgs)
exit()
# 正文
content = item.find_element_by_id('com.tencent.mm:id/mi').get_attribute('text')
p3 = re.findall(r'^禅之路.*', content)
print('1')
if p3 != []:
texts = p3[0]
#判断文章不在列表内则写入
if texts not in no_list:
no_list.append(texts)
# print(texts)
with open("abc.txt", 'a', encoding='utf-8') as f:
f.write(str(texts) + '\n')
print('写入成功', texts)
except NoSuchElementException:
pass
#下滑700
self.driver.swipe(FLICK_START_X, FLICK_START_Y + FLICK_DISTANCE, FLICK_START_X, FLICK_START_Y)
n += 1
if n == 10 :
print(len(no_list))
def main(self):
# self.login()
# self.enter()
self.crawl()
M = Moments()
M.main()
login 和 enter 得内容主要是登陆进入搜索页面 输入搜索内容然后进入朋友圈这些步骤。 这个步骤可以根据模拟器操作助手来进行简化
crawl 就是简单得循环操作一直向下面滑动,然后获取文本对应内容。
加一些sleep 有些网速会比较慢加载跟不上。
流程就是这么个流程 没有用到什么技术,就是进行简简单单的循环下拉然后获取文本。