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

类型 效果 代理花费
单机版(多线程+多进程) 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 开启多进程抓取
    ```bash
    #!/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

Python 3.6 抓取微博m站数据的更多相关文章

  1. Python小爬虫——抓取豆瓣电影Top250数据

    python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...

  2. 【转】Python爬虫:抓取新浪新闻数据

    案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...

  3. Python实例之抓取淘宝商品数据(json型数据)并保存为TXT

    本实例实现了抓取淘宝网中以‘python’为关键字的搜索结果,经详细查看数据存储于html文档中的js脚本中,数据类型为JSON 具体实现代码如下: import requests import re ...

  4. Python爬虫:抓取新浪新闻数据

    案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...

  5. Python爬虫:抓取手机APP的数据

    摘要 大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP数据包 表单: 表单中包括了用户名和密码,当然都是加密 ...

  6. Python实例之抓取HTML中的数据并保存为TXT

    本实例实现了抓取捧腹网中存储于html中的笑话数据(非JSON数据) 通过浏览器相关工具发现捧腹网笑话页面的数据存储在HTML页面而非json数据中,因此可以直接使用soup.select()方法来抓 ...

  7. 用python+selenium抓取微博24小时热门话题的前15个并保存到txt中

    抓取微博24小时热门话题的前15个,抓取的内容请保存至txt文件中,需要抓取排行.话题和阅读数 #coding=utf-8 from selenium import webdriver import ...

  8. [Python爬虫] 之八:Selenium +phantomjs抓取微博数据

    基本思路:在登录状态下,打开首页,利用高级搜索框输入需要查询的条件,点击搜索链接进行搜索.如果数据有多页,每页数据是20条件,读取页数 然后循环页数,对每页数据进行抓取数据. 在实践过程中发现一个问题 ...

  9. [Python爬虫] 之四:Selenium 抓取微博数据

    抓取代码: # coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.suppor ...

随机推荐

  1. C++中STL中简单的Vector的实现

    该vector只能容纳标准库中string类, 直接上代码了,StrVec.h文件内容为: #ifndef STRVEC_H #define STRVEC_H #include<iostream ...

  2. CLRS10.2-7练习 - 翻转单向列表

    要求: Give a Θ(n)-time nonrecursive procedure that reverses a singly linked list of nelements. The pro ...

  3. 1005 继续(3n+1)猜想(C#)

    一.题目内容: 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n= ...

  4. 部署基于maven的springboot项目到linux服务器上

    目录 本地运行调试 导入数据库: 导入项目: 将项目打包: linux准备: 运行项目: 脚本运行 本地运行调试 导入数据库: 导入数据库的时候使用的是sqlYog导入navcat的脚本:由于两个应用 ...

  5. 一个多进程爬虫下载图片的demo

    import os,re import pickle import requests import random import time from bs4 import BeautifulSoup f ...

  6. vsftp 安装配置(被动模式)

    vi /etc/vsftpd/vsftpd.conf vsftp配置末尾添加 pasv_enable=YES pasv_min_port=10000 pasv_max_port=10030 防火墙端口 ...

  7. 详细介绍:Kubernetes1.4版本的新功能

    Kubernetes1.4主要新特性 创建kubernetes集群只需要两条命令 增强了对有状态应用的支持 增加了集群联盟API 支持容器安全控制 增强包括调度在内的Kubernetes基础架构 通过 ...

  8. k8s--yml文件2

  9. UIView与CALayer的区别,很详细(基础教学拓展)转

    研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其 ...

  10. WIN2K8R2安装MySQL5.7及Tomcat8.5

    一.WIN2K8R2操作系统配置: 1.激活: 2.关闭防火墙: 3.打开远程桌面: 4.设置密码永不过期: 5.update: