爬虫背景:
由于原来的数据库中有1.5亿左右的用户id,但是其中有1.2亿的用户资料是不完整的(没有粉丝数量,点赞数量等,算是无用数据),现在老板要求将这些没有资料的用户更新信息,咋办?
刚开始的想法是使用主从模式+scrapy爬取,但是写着写着觉得麻烦(写python的都很懒,scrapy还是比较臃肿的),然后突然想到,python中的多线程,处理爬虫这种存在大量io的操作时,多线程是非常有用的,而且省服务器资源(其他的爬虫也在服务器,能省一点是一点,毕竟是自己用的,太卡的话上班都不爽),开始干!

不怕笑话,就2个函数。。。。
我觉得代码不重要,重要的是处理的方式,以及多多利用多线程的这种方法,各种原因不想搭scrapy的时候,只需要几行代码,就能将爬虫速度提升n倍,岂不美哉?
一.
说一下我的爬虫思路(架构?),不存在花里胡哨的操作与各种专业名词,只讲究实用
1.我的整个爬虫所用到的有django1.8.2 + requests + redis + pgsql 由于这里django的作用很小(代码中有讲),就不讲了
2.django操作pg存数据,redis作为队列
3.由于使用了redis作为队列,所以不存在多线程中的锁(Lock)的隐患,队列本身就是安全的,锁来锁去什么的不用管
4.我的这个模式,自认为还是比较好用的,简单快捷,剩下的会在下面代码中注释说明,只copy了部分代码块

二.
说一下我这个里面的多线程的注意事项吧:
1.将爬虫用while True包裹起来,目的是为了保持线程的存活,至于单个线程的退出条件,可以用for,while之类的条件来限制
2.函数中不要用return,不要用return,不要用return,重要的事情说三遍

@staticmethoddef get_user_info_from_app_new(**kwargs):while True:user_id = redis_client.rpop(REDIS_DOUYIN_NULL_INFO_USER)  # 从redis中取一个user_idretry_list = []for retry in range(150):  # 额,由于设备号不足的原因,导致一个user_id的请求最多重复请求150次,只要其中任意一次成功,就okurl_as, url_cp, iid, device_id, openudid = DouyinCrawler.get_params_for_app(**kwargs)device_info = redis_client.srandmember(REDIS_DOUYIN_SET_DEVICE_TYPE_BRAND)  # str 每一次请求都是随机不同的设备型号device = device_info.split(';')d_type = device[0]d_brand = device[1]# print 'device_type', d_type# print 'device_brand', d_brandurl = 'https://aweme-eagle.snssdk.com/aweme/v1/user/?user_id={}&retry_type=no_retry&iid={}&device_id={}&ac=wifi&channel=xiaomi&aid=1128&app_name=aweme&version_code=179&version_name=1.6.8&device_platform=android&ssmix=a&device_type={}&device_brand={}&language=zh&os_api=22&os_version=5.1.1&openudid={}&manifest_version_code=179&resolution=720*1280&dpi=240&update_version_code=1792&_rticket={}&ts={}&as={}&cp={}'.format(user_id, iid, device_id, d_type, d_brand, openudid, int(time.time() * 1000), int(time.time()), url_as,url_cp)req = requests.get(url, headers=app_headers)try:jdata = json.loads(req.content)except ValueError as e:logging.info('retry for no json data decode, {}, {}'.format(user_id, req.content))continueif jdata['status_code'] != 0 or not jdata.get('user'):logging.error('get user info from app error, {}, {}, times:{}'.format(user_id, jdata, retry))retry_list.append(retry)# return Noneelse:try:douyin_id = user_iduser = jdata.get('user')city = user.get('city')if user.get('cover_url') is None and user.get("nickname", u'已重置') == u"已重置":logging.info('user has been limited, {}, {}'.format(user_id, jdata))locations = user.get('location')activity_digg_count = user['activity']['digg_count']use_music_count = user['activity']['use_music_count']apple_account = user['apple_account']head_url = user['avatar_larger']['url_list'][0]gender = user.get('gender')bind_phone = user['bind_phone']birthday = user['birthday']country = user['country']province = user['province']constellation_id = user['constellation']verify_info = user['custom_verify']dongtai_count = user['dongtai_count']like_num = user['favoriting_count']follower_quantity = user['follower_count']followed_quantity = user['following_count']ins_id = user['ins_id']mplatform_followers_count = user['mplatform_followers_count']name = user['nickname']room_id = user['room_id']musician_digg_count = user.get('original_musician', {}).get('digg_count')musician_music_count = user.get('original_musician', {}).get('music_count')musician_music_used_count = user.get('original_musician', {}).get('music_used_count')share_qrcode_uri = user['share_qrcode_uri']short_id = user['short_id']signature = user['signature']total_digg_count = user['total_favorited']uid = user['uid']unique_id = user['unique_id']weibo_name = user.get('weibo_name')weibo_url = user.get('weibo_url')feed_num = user.get('aweme_count')with_fusion_shop_entry = user.get('with_fusion_shop_entry')with_item_commerce_entry = user.get('with_commerce_entry')verification_type = user.get('verification_type')custom_verify = user.get('custom_verify')enterprise_verify_reason = user.get('enterprise_verify_reason')payloads = {'user': user,'city': city,'locations': locations,'activity_digg_count': activity_digg_count,'use_music_count': use_music_count,'apple_account': apple_account,'head_url': head_url,'gender': gender,'bind_phone': bind_phone,'birthday': birthday,'country': country,'province': province,'constellation_id': constellation_id,'verify_info': verify_info,'dongtai_count': dongtai_count,'like_num': like_num,'follower_quantity': follower_quantity,'followed_quantity': followed_quantity,'ins_id': ins_id,'mplatform_followers_count': mplatform_followers_count,'name': name,'room_id': room_id,'musician_digg_count': musician_digg_count,'musician_music_count': musician_music_count,'musician_music_used_count': musician_music_used_count,'share_qrcode_uri': share_qrcode_uri,'short_id': short_id,'signature': signature,'total_digg_count': total_digg_count,'uid': uid,'unique_id': unique_id,'weibo_name': weibo_name,'weibo_url': weibo_url,'feed_num': feed_num,'with_fusion_shop_entry': with_fusion_shop_entry,'with_item_commerce_entry': with_item_commerce_entry,'verification_type': verification_type,'custom_verify': custom_verify,'enterprise_verify_reason': enterprise_verify_reason,}try:# django中有很好用的方法,创建或更新资料,都不用管去重的问题dd_user, is_create = DouyinUser.objects.update_or_create(douyin_id=user_id, defaults={'name': payloads['name'],'verify_info': payloads['verify_info'],'signature': payloads['signature'],'follower_quantity': payloads['follower_quantity'],'followed_quantity': payloads['followed_quantity'],'total_digg_count': payloads['total_digg_count'],'feed_num': payloads['feed_num'],'like_num': payloads['like_num']})print dd_user, 'UPDATE USER INFO SUCCESS'# return payloads  # 注释了 最好不要有return这个东西except:continueexcept:# 加入到抓取失败的队列# redis_client.lpush(REDIS_DOUYIN_USER_GET_FAILED_LIST, user_id)continue

主函数

    def get_new(self):for i in range(10):  # 创建线程池,大小10,想要多少就多少,电脑性能决定tt = Thread(target=DouyinCrawler.get_user_info_from_app_new)  #  个人不建议在这里传参tt.start()  # 不加锁,不回收,直接start

是的,多加2行就搞定了,速度提升10倍!
最后:
注意!!!!!!!
windows上,把主函数放在main函数里面调用

python爬虫———多线程threading模块爬取抖音用户信息相关推荐

  1. python批量爬取抖音用户信息_python 爬取抖音个人主页分享信息方法

    注释:本文仅用于技术学习 操作步骤: 1.拿到分享短链接或者能直接拿到短链接对应的长连接如 2.解决字体反爬,谷歌浏览器F12查看代码,像页面展示的数字都是框框 3.下载字体包,找到network下的 ...

  2. python爬取抖音用户评论_python实现模拟器爬取抖音评论数据的示例代码

    目标: 由于之前和朋友聊到抖音评论的爬虫,demo做出来之后一直没整理,最近时间充裕后,在这里做个笔记. 提示:大体思路 通过fiddle + app模拟器进行抖音抓包,使用python进行数据整理 ...

  3. python爬取抖音用户数据_使用python爬取抖音视频列表信息

    如果看到特别感兴趣的抖音vlogger的视频,想全部dump下来,如何操作呢?下面介绍介绍如何使用python导出特定用户所有视频信息 抓包分析 Chrome Deveploer Tools Chro ...

  4. Python爬取抖音用户相关数据(目前最方便的方法)

    import json import urllib.parse import requeststestId = 'J1DaRdD'def getFansNum(strSecUid):'''获取粉丝数: ...

  5. Python爬虫-02 request模块爬取妹子图网站

    简介 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载 ...

  6. python爬取抖音用户数据_一篇文章教会你用Python抓取抖音app热点数据

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

  7. 使用python + Fiddler爬取抖音用户下所有视频

    1.下载Fiddler 2.设置fiddler_FiddlerScript 加入以下内容H:/baidu  为json数据保存的文件夹 3.打开你要下载的抖音用户详情页面,右上角三个点,分享主页,复制 ...

  8. python爬取抖音用户数据_python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  9. python爬虫之使用selenium爬取b站视频信息

    前言 在之前提到爬虫时,我想到的步骤大多是: 查找要爬取内容的页面的url,使用requests库获取响应内容 内容为html源码则使用BeautifulSoup等工具解析html源码,得到想要的数据 ...

最新文章

  1. Java:多个文档合并输出到一个文档
  2. char N2Char(int n)函数:将一个整数转换为字符串,并放入一个字符串中
  3. Boost:分配服务的实例
  4. IDEA 2021.3 重磅发布!远程开发 (Beta) 、机器学习、故障自检、体验优化......
  5. FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制
  6. Spring Boot单元测试入门实战之关于JUnit
  7. 大巴山计算机教育中心那所学校,大巴山计算机教育中心
  8. 传递给 left 或 substring 函数的长度参数无效_MySQL:函数入门实例
  9. 【概率论与数理统计】小结7 - 统计学中的基本概念
  10. DL-C_1_week_1_1
  11. ListView原理分析之重要方法介绍
  12. 应用程序错误电脑黑屏_werfault应用程序错误黑屏|Win7解决werfault.exe应用程序错误方法...
  13. Linux init程序分析
  14. NCBI生物分类数据库(Taxonomy)
  15. ExcelVBA之 sheet隐藏
  16. HashMap扩容改进分析
  17. w7电脑组件服务器,W7电脑系统电脑如何配置Web服务器
  18. 解决页面报错 500-内部服务器错误
  19. 亚马逊CPC认证审核通不过什么是什么原因
  20. Window10怎么清理电脑的虚拟内存以及查询系统激活状态

热门文章

  1. pica8公司和picOS
  2. 测试岗位只有一个人的公司中,如何做好测试?
  3. Win10打印机使用异常?windows系统如何删除更新补丁解决方案
  4. 联邦学习论文阅读笔记
  5. 微信开放平台(公众号第三方平台) -- 全网发布
  6. 啤酒每罐2.3元,饮料每罐1.9元
  7. 信安实验-RSA(备课)
  8. 计算机启动应用程序的方法,怎么启动Windows应用程序
  9. ifconfig安装
  10. php实现的几种基本算法