appium 爬取抖音
1.MongoDB.py
- import pymongo
- from pymongo.collection import Collection
- client = pymongo.MongoClient(host='192.168.54.41',port=27017)
- db = client['douyin']
- def send_task():
- with open('douyin_hot_id.txt','r') as f:
- f_read = f.readlines()
- for i in f_read:
- task_info = {}
- task_info['share_id'] = i.replace('\n','')
- task_info['task_type'] = 'share_id'
- print('当前保存的task为%s:'%task_info)
- save_task(task_info)
- def save_task(task): # 保存数据到mongodb中
- task_collections = Collection(db,'douyin_task')
- task_collections.update({'share_id':task['share_id']},task,True)
- def get_task(task_type):
- task_collections = Collection(db,'douyin_task')
- task = task_collections.find_one_and_delete({'task_type':task_type})
- return task
- def delete_task(task):
- pass
- def save_data(item):
- data_collections = Collection(db,'douyin_data')
- data_collections.insert(item)
2.decode.py
- import json
- try:
- from douyin.handle_mongo import save_task
- except:
- from handle_mongo import save_task
- def response(flow):
- if 'aweme/v1/user/follower/list/' in flow.request.url:
- for user in json.loads(flow.response.text)['followers']:
- douyin_info = {}
- douyin_info['share_id'] = user['uid']
- douyin_info['douyin_id'] = user['short_id']
- save_task(douyin_info)
3.douyin.py
- import time
- from selenium.webdriver.support.ui import WebDriverWait
- from appium import webdriver
- desired_caps = {}
- desired_caps['platformName'] = 'Android'
- desired_caps['deviceName'] = 'TGIRPJOBFUZ9IJSW'
- desired_caps['platformVersion'] = '6.0'
- desired_caps['appPackage'] = 'com.ss.android.ugc.aweme'
- desired_caps['appActivity'] = 'com.ss.android.ugc.aweme.splash.SplashActivity'
- desired_caps['noReset'] = True
- desired_caps['unicodeKeyboard'] = True
- desired_caps['resetKeyboard'] = True
- driver = webdriver.Remote('http://192.168.54.56:4723/wd/hub', desired_caps)
- def get_size(driver):
- x = driver.get_window_size()['width']
- y = driver.get_window_size()['height']
- return (x, y)
- def handle_douyin(driver):
- # 处理权限
- try:
- while WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath(
- "//android.widget.TextView[@resource-id='android:id/le_bottomsheet_default_title']")):
- driver.find_element_by_xpath(
- "//android.widget.Button[@resource-id='com.android.packageinstaller:id/permission_allow_button']").click()
- except:
- pass
- try:
- # 点击搜索
- print('点击搜索')
- if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
- "//android.widget.ImageView[@resource-id='com.ss.android.ugc.aweme:id/ab_']")):
- driver.find_element_by_xpath(
- "//android.widget.ImageView[@resource-id='com.ss.android.ugc.aweme:id/ab_']").click()
- except:
- # [26,76][115,165]
- driver.tap([(26, 76), (115, 165)], 500) # 控件所在的位置 不适用xpath 500是表示点击500毫秒
- # 定位搜索框
- if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
- "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']")):
- # 获取douyin_id进行搜索
- driver.find_element_by_xpath(
- "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']").send_keys('lwnx1208')
- while driver.find_element_by_xpath(
- "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']").text != 'lwnx1208':
- driver.find_element_by_xpath(
- "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']").send_keys('lwnx1208')
- time.sleep(0.1)
- # 点击搜索
- driver.find_element_by_xpath("//android.widget.TextView[@resource-id='com.ss.android.ugc.aweme:id/a4r']").click()
- # 点击用户标签
- if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath("//android.widget.TextView[@text='用户']")):
- driver.find_element_by_xpath("//android.widget.TextView[@text='用户']").click()
- # 点击头像
- if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
- "//android.support.v7.widget.RecyclerView[@resource-id='com.ss.android.ugc.aweme:id/kh']/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]")):
- driver.find_element_by_xpath(
- "//android.support.v7.widget.RecyclerView[@resource-id='com.ss.android.ugc.aweme:id/kh']/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]").click()
- # 点击粉丝按钮
- if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
- "//android.widget.TextView[@resource-id='com.ss.android.ugc.aweme:id/a6a']")):
- driver.find_element_by_xpath(
- "//android.widget.TextView[@resource-id='com.ss.android.ugc.aweme:id/a6a']").click()
- l = get_size(driver)
- x1 = int(l[0] * 0.5)
- y1 = int(l[1] * 0.75)
- y2 = int(l[1] * 0.25)
- while True:
- if '没有更多了' in driver.page_source:
- break
- driver.swipe(x1, y1, x1, y2)
- time.sleep(0.5)
- if __name__ == '__main__':
- handle_douyin(driver)
appium 爬取抖音的更多相关文章
- 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
抖音很火,楼主使用python随机爬取抖音视频,并且无水印下载,人家都说天下没有爬不到的数据,so,楼主决定试试水,纯属技术爱好,分享给大家.. 1.楼主首先使用Fiddler4来抓取手机抖音app这 ...
- from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...
- 教你用python爬取抖音app视频
记录一下如何用python爬取app数据,本文以爬取抖音视频app为例. 编程工具:pycharm app抓包工具:mitmproxy app自动化工具:appium 运行环境:windows10 思 ...
- python爬取抖音APP视频教程
本文讲述爬取抖音APP视频数据(本文未完,后面还有很多地方优化总结) 公众号回复:抖音 即可获取源码 1.APP抓包教程,需要用到fiddler fiddler配置和使用查看>>王者荣耀盒 ...
- Python爬虫---爬取抖音短视频
目录 前言 抖音爬虫制作 选定网页 分析网页 提取id构造网址 拼接数据包链接 获取视频地址 下载视频 全部代码 实现结果 待解决的问题 前言 最近一直想要写一个抖音爬虫来批量下载抖音的短视频,但是经 ...
- Python爬取抖音视频
最近在研究Python爬虫,顺便爬了一下抖音上的视频,找到了哥们喜欢的小姐姐居多,咱们给他爬下来吧. 最终爬取结果 好了废话补多说了,上代码! #https://www.iesdouyin.com/a ...
- python+fiddler 抓取抖音数据包并下载抖音视频
这个我们要下载视频,那么肯定首先去找抖音视频的url地址,那么这个地址肯定在json格式的数据包中,所以我们就去专门查看json格式数据包 这个怎么找我就不用了,直接看结果吧 你找json包,可以选大 ...
- 一篇文章教会你用Python抓取抖音app热点数据
今天给大家分享一篇简单的安卓app数据分析及抓取方法.以抖音为例,我们想要抓取抖音的热点榜数据. 要知道,这个数据是没有网页版的,只能从手机端下手. 首先我们要安装charles抓包APP数据,它是一 ...
- python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。
昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...
随机推荐
- USACO Corn Fields
洛谷 P1879 [USACO06NOV]玉米田Corn Fields 洛谷传送门 题目描述 Farmer John has purchased a lush new rectangular past ...
- 小程序setData()使用和注意事项
注意: 直接修改this.data,而不调用this.setData(),是无法改变当前页面的状态的,会导致数据不一致 仅支持可以JSON化的数据 单次设置的数据不能超过1024KB,尽量避免一次设置 ...
- 洛谷P3455 [POI2007]ZAP-Queries
题目大意: 给定\(n,m,k,\) 求 \[\sum\limits_{x=1}^n\sum\limits_{y=1}^m[gcd(x,y)==k]\] 莫比乌斯反演入门题,先进行一步转化,将每个\( ...
- 机器学习之KNN
KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同.KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别.而KNN做回归时,一般是 ...
- QSS QPushButton:hover :pressed ...为状态下变更字体颜色(color)无效,变成字体粗细(font-weight)有效???
//字体颜色变更无效 QPushButton:hover{ font-weight:bold; color:rgba(, , , ); } //字体颜色变更有效 QPushButton#pushBut ...
- golang基础之初识
golang 简介 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的 ...
- CentOS下安装FreeTDS
导读 官方网站:http://www.freetds.org 下载地址:http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable ...
- Logstash:多个配置文件(conf)
Logstash:多个配置文件(conf) 对于多个配置的处理方法,有多个处理方法: 多个pipeline 一个pipleline处理多个配置文件 一个pipeline含有一个逻辑的数据流,它从inp ...
- 如何判断服务器之间的服务是否可用?ping 还是 telnet?
1. 背景 机器A需要调用机器B的服务,为此要保证服务的可用性,我们有时候用ping,有时候用telent来验证机器A和B的连通性,但有时候会出现这种情况,A可以ping通B,但A调用B的服务会一直报 ...
- WPF实现背景透明磨砂,并通过HandyControl组件实现弹出等待框
前言:上一个版本的Winform需要改成WPF来做界面,第一次接触WPF,在转换过程中遇到的需求就是一个背景透明模糊,一个是类似于 加载中…… 这样的等待窗口,等后台执行完毕后再关掉.在Winform ...