python爬虫抖某音爬取视频 Airtest+fiddler

  所用到的模块和库:python3+reqeuests+Airtest+fiddler
 
  Airtest:(app自动化软,类似Appium,网易家的本人很喜欢)
 
  1.首先环境的配置Fiddler和Airtest
  fiddler可以设定抓取包的链接,并自动保存到设定的txt文件中
 
  #在配置好手机证书,以及可以抓到手机包的情况下,再看下面步骤----配置fiddler环境:https://jingyan.baidu.com/article/1876c8524581d9890b1376a5.html
 
  手机抓包证书教程:https://www.jianshu.com/p/724097741bdf
 
  弄好之后,打开抖音,可以看到一堆抖音的包的话,就说明可以了,
 
  接着来下面操作,设置抓包规则并自动保存由于截图不好截,就手机拍了==图片不好勿打
 
  打开后按ctrl+f搜素OnBeforeRequest找到这个方法
 
  将下面代码插入fiddlerOnBeforeRequest方法中
 
  //保存到本地添加开始
 
   //这是抖音的地址设定视频包的链接名
 
   if(
 
   oSession.fullUrl.Contains("v1-dy.bytecdn.cn")||
 
   oSession.fullUrl.Contains("v3-dy-y.bytecdn.cn")||
 
   oSession.fullUrl.Contains("v3-dy.z.bytecdn.cn")||
 
   oSession.fullUrl.Contains("v5-dy.bytecdn.cn")||
 
   oSession.fullUrl.Contains("v6-dy.bytecdn.cn")||
 
   oSession.fullUrl.Contains("v9-dy-z.bytecdn.cn")||
 
   oSession.fullUrl.Contains("v9-dy.bytecdn.cn")
 
   ){
 
   varfso;
 
   varfile;
 
   fso=newActiveXObject("Scripting.FileSystemObject");
 
   //文件保存路径,可自定义自动保存的txt文档地址
 
   file=fso.OpenTextFile("E:url_btdouyin.txt",8,true);
 
   //file.writeLine("Request-url:"+oSession.url);
 
   file.writeLine("http://"+oSession.url)
 
   //file.writeLine("Request-host:"+oSession.host);
 
   //file.writeLine("Request-header:"+"n"+oSession.oRequest.headers);
 
   //file.writeLine("Request-body:"+oSession.GetRequestBodyAsString());
 
   //file.writeLine("n");
 
   file.close();
 
   }
 
   //保存到本地添加结束
 
  将上面的代码插入后打开抖音刷一刷,然后去自动保存的地址查询是否有相应的txt文档,如果没有,查看fiddler对应视频包名是否有修改
 
  效果---这些链接可以在浏览器打开,但是可能看不到视频,那是浏览器不支持,这个无影响,
 
  !!!这些地址是有有效期的。。目测是大概1-2小时吧
 
  那么问题来了。。如何自动模拟人的滑动来获取到这些链接----华丽丽的Airtest登场(没有接触过手机自动化软件的可以先去入门了,入门后再回来查看,有appium的童鞋可以接着看)
 
  Airetest基本操作教程:https://segmentfault.com/a/1190000017982620?utm_source=tag-newest
 
  Airtest是支持python代码操作的,需要对应的库:pocouipipinstallpocoui
 
  安装好之后,写入自动滑动抖音的视频来截取链接-----当然可以截取推荐,同城,搜索,榜单的一些视频包,只需要打开相应的视频界面滑动
 
  以下是我写的自动上滑,拉动视频的代码--如果不适用,建议在Airtest上自己写好copy到python代码中就欧克
 
  __author__="xiaojun"
 
  fromairtest.core.apiimport*
 
  auto_setup(__file__)
 
  frompoco.drivers.android.uiautomationimportAndroidUiautomationPoco
 
  poco=AndroidUiautomationPoco(use_airtest_input=True,screenshot_each_action=False)
 
  #模拟滑动
 
  defdouyin_spwipe():
 
  #无限循环向上滑动
 
  whileTrue:
 
  #坐标,以及速度
 
  poco.swipe([0.5,0.8],[0.5,0.3],duration=0.2)
 
  sleep(3)
 
  那么有了视频的链接。。。剩下的就是写一个python代码获取这些链接并请求写入mp4视频文件中了
 
  !!!注意视频链接是有有效期的大概1-2小时吧,所以建议是,一边滑动获取链接,一边写入生成链接
 
  下面是python获取链接,和写入mp4的代码。。。如有不合适,请自行修改调试代码
 
  获取和生成两个方法可以同时进行,多线程,多个文件,多个进程随意生成视频后清空txt文件,休眠十几分钟让滑动程序,继续截图视频包链接
 
  importos
 
  importrequests
 
  importsys
 
  importtime
 
  fromfake_useragentimportUserAgent
 
  headers={
 
  'User-Agent':UserAgent().chrome
 
  }
 
  #去重
 
  defdistinct_data():
 
  datalist_blank=[]
 
  withopen(r'E:url_btdouyin.txt','r')asf:
 
  #读取所有行,生成列表
 
  f_data_list=f.readlines()
 
  print(f_data_list)
 
  forurlinf_data_list:
 
  iflen(url)>40:
 
  datalist_blank.append(url.strip())#去掉nstrip去掉头尾默认空格或换行符
 
  #print(url.strip())
 
  f.close()
 
  #print(len(datalist_blank),datalist_blank)
 
  #print(len(set(datalist_blank)),set(datalist_blank))
 
  #去重后的列表url
 
  datalist_blank=list(set(datalist_blank))
 
  returndatalist_blank
 
  #写入文件夹
 
  defresponsedouyin():
 
  #获得种子链接
 
  data_url=distinct_data()
 
  #统计文件夹中视频数量
 
  DIR=r'E:url_btdouyin_mp4'#要统计的文件夹
 
  num=len([namefornameinos.listdir(DIR)ifos.path.isfile(os.path.join(DIR,name))])+1
 
  print(num)#文件夹现文件数量
 
  forurlindata_url:
 
  #stream=True作用是推迟下载响应体直到访问Response.content属性
 
  #res=requests.get(url,stream=True,headers=headers)
 
  res=requests.get(url=url,stream=True,headers=headers)
 
  ##定义视频存放的路径
 
  pathinfo=r'E:url_btdouyin_mp4%d.mp4'%num#%d用于整数输出%s用于字符串输出
 
  #实现下载进度条显示,这一步需要得到总视频大小
 
  total_size=int(res.headers['Content-Length'])
 
  print('这是视频的总大小:',total_size)
 
  #设置流的起始值为0
 
  temp_size=0
 
  ifres.status_code==200:
 
  #将视频写入文件夹
 
  withopen(pathinfo,'wb')asfile:
 
  file.write(res.content)
 
  print(pathinfo+'下载完成啦啦啦啦啦')
 
  num+=1
 
  withopen(r'E:url_btdouyin.txt','w')asf:
 
  f.write('')
 
  f.close()
 
  time.sleep(700)