1.MongoDB.py

  1. import pymongo
  2. from pymongo.collection import Collection
  3.  
  4. client = pymongo.MongoClient(host='192.168.54.41',port=27017)
  5. db = client['douyin']
  6.  
  7. def send_task():
  8. with open('douyin_hot_id.txt','r') as f:
  9. f_read = f.readlines()
  10. for i in f_read:
  11. task_info = {}
  12. task_info['share_id'] = i.replace('\n','')
  13. task_info['task_type'] = 'share_id'
  14. print('当前保存的task为%s:'%task_info)
  15. save_task(task_info)
  16.  
  17. def save_task(task): # 保存数据到mongodb中
  18. task_collections = Collection(db,'douyin_task')
  19. task_collections.update({'share_id':task['share_id']},task,True)
  20.  
  21. def get_task(task_type):
  22. task_collections = Collection(db,'douyin_task')
  23. task = task_collections.find_one_and_delete({'task_type':task_type})
  24. return task
  25.  
  26. def delete_task(task):
  27. pass
  28.  
  29. def save_data(item):
  30. data_collections = Collection(db,'douyin_data')
  31. data_collections.insert(item)

2.decode.py

  1. import json
  2. try:
  3. from douyin.handle_mongo import save_task
  4. except:
  5. from handle_mongo import save_task
  6.  
  7. def response(flow):
  8. if 'aweme/v1/user/follower/list/' in flow.request.url:
  9. for user in json.loads(flow.response.text)['followers']:
  10. douyin_info = {}
  11. douyin_info['share_id'] = user['uid']
  12. douyin_info['douyin_id'] = user['short_id']
  13. save_task(douyin_info)

3.douyin.py

  1. import time
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from appium import webdriver
  4.  
  5. desired_caps = {}
  6. desired_caps['platformName'] = 'Android'
  7. desired_caps['deviceName'] = 'TGIRPJOBFUZ9IJSW'
  8. desired_caps['platformVersion'] = '6.0'
  9. desired_caps['appPackage'] = 'com.ss.android.ugc.aweme'
  10. desired_caps['appActivity'] = 'com.ss.android.ugc.aweme.splash.SplashActivity'
  11. desired_caps['noReset'] = True
  12. desired_caps['unicodeKeyboard'] = True
  13. desired_caps['resetKeyboard'] = True
  14.  
  15. driver = webdriver.Remote('http://192.168.54.56:4723/wd/hub', desired_caps)
  16.  
  17. def get_size(driver):
  18. x = driver.get_window_size()['width']
  19. y = driver.get_window_size()['height']
  20. return (x, y)
  21.  
  22. def handle_douyin(driver):
  23. # 处理权限
  24. try:
  25. while WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath(
  26. "//android.widget.TextView[@resource-id='android:id/le_bottomsheet_default_title']")):
  27. driver.find_element_by_xpath(
  28. "//android.widget.Button[@resource-id='com.android.packageinstaller:id/permission_allow_button']").click()
  29. except:
  30. pass
  31.  
  32. try:
  33. # 点击搜索
  34. print('点击搜索')
  35. if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
  36. "//android.widget.ImageView[@resource-id='com.ss.android.ugc.aweme:id/ab_']")):
  37. driver.find_element_by_xpath(
  38. "//android.widget.ImageView[@resource-id='com.ss.android.ugc.aweme:id/ab_']").click()
  39. except:
  40. # [26,76][115,165]
  41. driver.tap([(26, 76), (115, 165)], 500) # 控件所在的位置 不适用xpath 500是表示点击500毫秒
  42. # 定位搜索框
  43. if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
  44. "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']")):
  45. # 获取douyin_id进行搜索
  46. driver.find_element_by_xpath(
  47. "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']").send_keys('lwnx1208')
  48. while driver.find_element_by_xpath(
  49. "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']").text != 'lwnx1208':
  50. driver.find_element_by_xpath(
  51. "//android.widget.EditText[@resource-id='com.ss.android.ugc.aweme:id/a4p']").send_keys('lwnx1208')
  52. time.sleep(0.1)
  53. # 点击搜索
  54. driver.find_element_by_xpath("//android.widget.TextView[@resource-id='com.ss.android.ugc.aweme:id/a4r']").click()
  55. # 点击用户标签
  56. if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath("//android.widget.TextView[@text='用户']")):
  57. driver.find_element_by_xpath("//android.widget.TextView[@text='用户']").click()
  58. # 点击头像
  59. if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
  60. "//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]")):
  61. driver.find_element_by_xpath(
  62. "//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()
  63. # 点击粉丝按钮
  64. if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_xpath(
  65. "//android.widget.TextView[@resource-id='com.ss.android.ugc.aweme:id/a6a']")):
  66. driver.find_element_by_xpath(
  67. "//android.widget.TextView[@resource-id='com.ss.android.ugc.aweme:id/a6a']").click()
  68.  
  69. l = get_size(driver)
  70. x1 = int(l[0] * 0.5)
  71. y1 = int(l[1] * 0.75)
  72. y2 = int(l[1] * 0.25)
  73. while True:
  74. if '没有更多了' in driver.page_source:
  75. break
  76. driver.swipe(x1, y1, x1, y2)
  77. time.sleep(0.5)
  78.  
  79. if __name__ == '__main__':
  80. handle_douyin(driver)

  

  

appium 爬取抖音的更多相关文章

  1. 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    抖音很火,楼主使用python随机爬取抖音视频,并且无水印下载,人家都说天下没有爬不到的数据,so,楼主决定试试水,纯属技术爱好,分享给大家.. 1.楼主首先使用Fiddler4来抓取手机抖音app这 ...

  2. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  3. 教你用python爬取抖音app视频

    记录一下如何用python爬取app数据,本文以爬取抖音视频app为例. 编程工具:pycharm app抓包工具:mitmproxy app自动化工具:appium 运行环境:windows10 思 ...

  4. python爬取抖音APP视频教程

    本文讲述爬取抖音APP视频数据(本文未完,后面还有很多地方优化总结) 公众号回复:抖音 即可获取源码 1.APP抓包教程,需要用到fiddler fiddler配置和使用查看>>王者荣耀盒 ...

  5. Python爬虫---爬取抖音短视频

    目录 前言 抖音爬虫制作 选定网页 分析网页 提取id构造网址 拼接数据包链接 获取视频地址 下载视频 全部代码 实现结果 待解决的问题 前言 最近一直想要写一个抖音爬虫来批量下载抖音的短视频,但是经 ...

  6. Python爬取抖音视频

    最近在研究Python爬虫,顺便爬了一下抖音上的视频,找到了哥们喜欢的小姐姐居多,咱们给他爬下来吧. 最终爬取结果 好了废话补多说了,上代码! #https://www.iesdouyin.com/a ...

  7. python+fiddler 抓取抖音数据包并下载抖音视频

    这个我们要下载视频,那么肯定首先去找抖音视频的url地址,那么这个地址肯定在json格式的数据包中,所以我们就去专门查看json格式数据包 这个怎么找我就不用了,直接看结果吧 你找json包,可以选大 ...

  8. 一篇文章教会你用Python抓取抖音app热点数据

    今天给大家分享一篇简单的安卓app数据分析及抓取方法.以抖音为例,我们想要抓取抖音的热点榜数据. 要知道,这个数据是没有网页版的,只能从手机端下手. 首先我们要安装charles抓包APP数据,它是一 ...

  9. python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。

    昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...

随机推荐

  1. USACO Corn Fields

    洛谷 P1879 [USACO06NOV]玉米田Corn Fields 洛谷传送门 题目描述 Farmer John has purchased a lush new rectangular past ...

  2. 小程序setData()使用和注意事项

    注意: 直接修改this.data,而不调用this.setData(),是无法改变当前页面的状态的,会导致数据不一致 仅支持可以JSON化的数据 单次设置的数据不能超过1024KB,尽量避免一次设置 ...

  3. 洛谷P3455 [POI2007]ZAP-Queries

    题目大意: 给定\(n,m,k,\) 求 \[\sum\limits_{x=1}^n\sum\limits_{y=1}^m[gcd(x,y)==k]\] 莫比乌斯反演入门题,先进行一步转化,将每个\( ...

  4. 机器学习之KNN

    KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同.KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别.而KNN做回归时,一般是 ...

  5. QSS QPushButton:hover :pressed ...为状态下变更字体颜色(color)无效,变成字体粗细(font-weight)有效???

    //字体颜色变更无效 QPushButton:hover{ font-weight:bold; color:rgba(, , , ); } //字体颜色变更有效 QPushButton#pushBut ...

  6. golang基础之初识

    golang 简介 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的 ...

  7. CentOS下安装FreeTDS

    导读 官方网站:http://www.freetds.org 下载地址:http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable ...

  8. Logstash:多个配置文件(conf)

    Logstash:多个配置文件(conf) 对于多个配置的处理方法,有多个处理方法: 多个pipeline 一个pipleline处理多个配置文件 一个pipeline含有一个逻辑的数据流,它从inp ...

  9. 如何判断服务器之间的服务是否可用?ping 还是 telnet?

    1. 背景 机器A需要调用机器B的服务,为此要保证服务的可用性,我们有时候用ping,有时候用telent来验证机器A和B的连通性,但有时候会出现这种情况,A可以ping通B,但A调用B的服务会一直报 ...

  10. WPF实现背景透明磨砂,并通过HandyControl组件实现弹出等待框

    前言:上一个版本的Winform需要改成WPF来做界面,第一次接触WPF,在转换过程中遇到的需求就是一个背景透明模糊,一个是类似于 加载中…… 这样的等待窗口,等后台执行完毕后再关掉.在Winform ...