热门标签 | 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

编辑 

收藏 

举报

 



推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
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社区 版权所有