热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3.6抓取微博m站数据Grand_Jon

Python3.6抓取微博m站数据Python3.6抓取微博m站数据2019.05.01更新内容containerid可以通过107603+user_id组装得到,无需请求个人

Python 3.6 抓取微博m站数据



Python 3.6 抓取微博m站数据


2019.05.01 更新内容



  1. containerid 可以通过 "107603" + user_id 组装得到,无需请求个人信息获取;

  2. 优化多线程抓取,修复之前因urllib.request全局定义,导致代理无法正常切回本地IP;

  3. 优化分布式抓取策略,由每台机器顺序获取用户ID 再拼装URL抓取策略,修改为每台机器顺序获取URL进行抓取。防止由于某个微博账号微博动态过多导致负责本ID的机器长时间运行,而其他机器就要等待,浪费时间和资源。

  4. 加入IP代理池维护脚本,可以定时维护代理池中的有效代理IP,及时剔除无效IP。

  5. 加入Redis定时消费脚本,解决因抓取结果过大导致redis性能下降。

  6. 增加Redis连接池ConnectionPool ,解决因Redis链接端口数过多导致Redis拒绝服务错误。

  7. 调整Redis数据存储结构,采用list+set结合,存储UID+URL

  8. 单机https代理消费约100元/天,单机5个进程+代理每天能达到1000万条数据


本脚本截止20190501



  • 网址: https://m.weibo.cn/u/5463009082 新浪微博m站(智能手机网页端)

  • api : https://m.weibo.cn/api/container/getIndex?type=uid&value=5463009082&cOntainerid=1076035463009082

  • 抓取: 根据用户userId抓取历史发布的微博信息

  • 方法: python请求api接口(非页面)

  • 反扒: 疯狂抓取10-20s,IP会被禁封1-3分钟 或者 抓取2分钟禁封10分钟

  • 备注: 无需登录+IP代理池

  • 环境: Windosw或Linux、Python 3.6、Mysql、Redis



























类型效果代理花费
单机版(多线程+多进程)150万/天0
单机版(多线程+多进程)+IP代理池1000万/天100元/天
分布式(多线程+多进程)+IP代理池千万~亿级100*机器数量/天

抓取流程



  1. 启动save_uid.py脚本将准备好的微博用户ID,存入Redis中,保存两份;




    • r.lpush(WEIBO_UID_LIST_KEY, uid) 用于第一次遍历UID请求每个UID的总页数,然后生成每个UID的所有URL。


    • r.sadd(WEIBO_UID_SET_KEY, uid) 用于第二次请求,随机获取一个未抓取完的UID,去Redis中取当前UID剩余的URL进行抓取,全部抓取完毕则移除此UID。



  2. 启动proxy_pool.py脚本,初始化IP代理池(如果不使用代理,此步骤可略过)




    • target_money 用来获取你所购买的IP代理剩余金额的URL连接


    • target_ip 请求代理IP获取有效的代理IP


    • targetUrl 用来校验当前IP是否有效


    • WEIBO_PROXY_SET_KEY 存储有效的代理IP


    • WEIBO_PROXY_418_SET_KEY 存储已经出现418错误的IP,会循环利用,直到代理失效


    • WEIBO_ERROR_PROXY_SET_KEY 存储已经使用过的IP(失效IP),用于后期校验



  3. 启动start_crawler.py脚本,开启抓取任务



    • 首先会第一次请求遍历UID,生成所有的URL,然后所有的线程获取URL进行抓取

    • 先会尝试使用本地IP进行抓取,本地IP出现418之后,尝试去IP代理池获取可使用的IP,继续抓取

    • 使用代理IP抓取超过60s,停止代理抓取改为使用本地IP,循环进行

    • 代理IP出现418,则先去尝试使用本地IP,如果本地418再继续更换代理

    • 如果代理池没有可用IP,则休息30s,继续使用本地IP



  4. 添加Linux定时脚本,定时处理Redis队列中的抓取结果。




关于代理IP



  • 抓取微博的https连接,只能使用https代理,可选择市面上其他类型的代理商;

  • 免费的代理ip也有尝试,不过效果不是很好


部署问题



  • 需要一台主服务器(或者本机Windows电脑)来初始化运行 save_uid.pyproxy_pool.py脚本

  • 在Redis所在的服务器进行redis_consumer.py脚本的运行部署


  • start_crawler.py 可以集群部署到多台服务器,但要保证都能网络连通到Redis服务器

  • 添加定时脚本crontab -e 内容 如下

    0 */1 * * * nohup python /data/hw/redis_consume.py > /dev/null 2>&1 &



  • service cron restart 重启cron定时服务

  • 创建start.sh 开启多进程抓取

    #!/bin/bash
    # 开始爬虫程序;
    for((i=1;i<=5;i++));
    do
    nohup python /data/hw/start_crawler.py 1>/dev/null 2>&1 &
    echo "开启爬虫程序进程"+$i
    done
    sleep 5s
    echo "已开启以下进程"
    ps -ef|grep python



20190501目录



  • proxy_pool.py #维护IP代理池

  • redis_consume.py #redis定时消费

  • save_uid.py #初始化uid

  • start.sh #一键启动脚本

  • start_crawler.py #开启抓取程序,可以集群部署


旧版本README

README_20190307.md


项目地址

https://github.com/JiaoHongwei/Crawler_weibo

发表于

2019-03-07 19:06 

Grand_Jon 

阅读(1381

评论(0

编辑 

收藏 

举报

 



推荐阅读
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 解决MySQL远程访问故障
    同事反馈无法访问我安装的MySQL数据库。经过排查,发现是在Windows服务器上安装MySQL后未开启远程访问权限。本文将详细介绍如何解决这一问题。 ... [详细]
author-avatar
陈旺财九_999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有