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

爬虫背景:
由于原来的数据库中有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,重要的事情说三遍

@staticmethod
    def get_user_info_from_app_new(**kwargs):
        while True:
            user_id = redis_client.rpop(REDIS_DOUYIN_NULL_INFO_USER)  # 从redis中取一个user_id
            retry_list = []
            for retry in range(150):  # 额,由于设备号不足的原因,导致一个user_id的请求最多重复请求150次,只要其中任意一次成功,就ok
                url_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_brand
                url = 'https://aweme-eagle.snssdk.com/aweme/v1/user/?user_id={}&retry_type=no_retry&iid={}&device_id={}&ac=wifi&channel=xiaomi&aid=1128&app_nam
  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值