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! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...
随机推荐
- linux shell攻略学习笔记一 基础篇
1.#!/bin/bash shebang 可以自定义 比如 #!/bin/bash +x 就会打印出执行日志 linux中 \ 代表null \n2\n3” 会转义其中的\n,生成3行数据 $! 保 ...
- Python实现网络图形化界面多人聊天室 - Windows
Python实现网络图形化界面多人聊天室 - Windows 项目名称:网络多人聊天室图形界面版本 项目思路: server.py 服务端文件,主进程中,创建图形化界面,询问地址(主机名,端口),点击 ...
- 认识一下transition
transition 以前的CSS属性切换时,由于只有开始和截止两个状态,切换时略显生硬 jquery.animate 传说中的jquery在保证兼容性之后,又为开发者提供了简洁的过渡(动画其中之一效 ...
- MySQL实战45讲学习笔记:第三十五讲
一.本节概述 在上一篇文章中,我和你介绍了 join 语句的两种算法,分别是 Index Nested-LoopJoin(NLJ) 和 Block Nested-Loop Join(BNL). 我们发 ...
- [LeetCode] 238. Product of Array Except Self 除本身之外的数组之积
Given an array nums of n integers where n > 1, return an array output such that output[i] is equ ...
- 物联网架构成长之路(39)-Bladex开发框架环境搭建
0.前言 上一篇博客已经介绍了,阶段性小结.目前第一版的物联网平台已经趋于完成.框架基本不变了,剩下就是调整一些UI,还有配合硬件和市场那边,看看怎么推广这个平台.能不能挣点外快.第一版系统虽然简陋, ...
- LeetCode 225:用队列实现栈 Implement Stack using Queues
题目: 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 Implement th ...
- Vue.js 源码分析(十八) 指令篇 v-for 指令详解
我们可以用 v-for 指令基于一个数组or对象来渲染一个列表,有五种使用方法,如下: <!DOCTYPE html> <html lang="en"> & ...
- 分布式应用的未来 — Distributionless
作者丨阿里云高级技术专家 至简(李云) 在技术变革推动社会发展这一时代背景下,大量支撑规模化分布式应用的技术创新.创造与创业应用而生,Could Native.Service Mesh.Serverl ...
- git 创建标签 tag
1. git tag <name>就可以打一个新标签 加上-a参数来创建一个带备注的tag,备注信息由-m指定.如果你未传入-m则创建过程系统会自动为你打开编辑器让你填写备注信息. git ...