Python 3.6 抓取微博m站数据
Python 3.6 抓取微博m站数据
2019.05.01 更新内容
- containerid 可以通过
"107603" + user_id组装得到,无需请求个人信息获取; - 优化多线程抓取,修复之前因
urllib.request全局定义,导致代理无法正常切回本地IP; - 优化分布式抓取策略,由每台机器顺序获取用户ID 再拼装URL抓取策略,修改为每台机器顺序获取URL进行抓取。防止由于某个微博账号微博动态过多导致负责本ID的机器长时间运行,而其他机器就要等待,浪费时间和资源。
- 加入IP代理池维护脚本,可以定时维护代理池中的有效代理IP,及时剔除无效IP。
- 加入Redis定时消费脚本,解决因抓取结果过大导致redis性能下降。
- 增加Redis连接池
ConnectionPool,解决因Redis链接端口数过多导致Redis拒绝服务错误。 - 调整Redis数据存储结构,采用list+set结合,存储UID+URL
- 单机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*机器数量/天 |
抓取流程
- 启动
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。
- 启动
proxy_pool.py脚本,初始化IP代理池(如果不使用代理,此步骤可略过)target_money用来获取你所购买的IP代理剩余金额的URL连接target_ip请求代理IP获取有效的代理IPtargetUrl用来校验当前IP是否有效WEIBO_PROXY_SET_KEY存储有效的代理IPWEIBO_PROXY_418_SET_KEY存储已经出现418错误的IP,会循环利用,直到代理失效WEIBO_ERROR_PROXY_SET_KEY存储已经使用过的IP(失效IP),用于后期校验
- 启动
start_crawler.py脚本,开启抓取任务- 首先会第一次请求遍历UID,生成所有的URL,然后所有的线程获取URL进行抓取
- 先会尝试使用本地IP进行抓取,本地IP出现418之后,尝试去IP代理池获取可使用的IP,继续抓取
- 使用代理IP抓取超过60s,停止代理抓取改为使用本地IP,循环进行
- 代理IP出现418,则先去尝试使用本地IP,如果本地418再继续更换代理
- 如果代理池没有可用IP,则休息30s,继续使用本地IP
- 添加Linux定时脚本,定时处理Redis队列中的抓取结果。
关于代理IP
- 抓取微博的https连接,只能使用https代理,可选择市面上其他类型的代理商;
- 免费的代理ip也有尝试,不过效果不是很好
部署问题
- 需要一台主服务器(或者本机Windows电脑)来初始化运行
save_uid.py和proxy_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
donesleep 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
项目地址
https://github.com/JiaoHongwei/Crawler_weibo
Python 3.6 抓取微博m站数据的更多相关文章
- Python小爬虫——抓取豆瓣电影Top250数据
python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...
- 【转】Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- Python实例之抓取淘宝商品数据(json型数据)并保存为TXT
本实例实现了抓取淘宝网中以‘python’为关键字的搜索结果,经详细查看数据存储于html文档中的js脚本中,数据类型为JSON 具体实现代码如下: import requests import re ...
- Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- Python爬虫:抓取手机APP的数据
摘要 大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP数据包 表单: 表单中包括了用户名和密码,当然都是加密 ...
- Python实例之抓取HTML中的数据并保存为TXT
本实例实现了抓取捧腹网中存储于html中的笑话数据(非JSON数据) 通过浏览器相关工具发现捧腹网笑话页面的数据存储在HTML页面而非json数据中,因此可以直接使用soup.select()方法来抓 ...
- 用python+selenium抓取微博24小时热门话题的前15个并保存到txt中
抓取微博24小时热门话题的前15个,抓取的内容请保存至txt文件中,需要抓取排行.话题和阅读数 #coding=utf-8 from selenium import webdriver import ...
- [Python爬虫] 之八:Selenium +phantomjs抓取微博数据
基本思路:在登录状态下,打开首页,利用高级搜索框输入需要查询的条件,点击搜索链接进行搜索.如果数据有多页,每页数据是20条件,读取页数 然后循环页数,对每页数据进行抓取数据. 在实践过程中发现一个问题 ...
- [Python爬虫] 之四:Selenium 抓取微博数据
抓取代码: # coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.suppor ...
随机推荐
- 【Python爬虫案例学习】python爬取淘宝里的手机报价并以价格排序
第一步: 先分析这个url,"?"后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data, 关键字用字典的形式传进去,这 ...
- Python输出菱形
最近准备熟悉下Python的基础语法,准备练习下输出菱形.刚好作为自己blog的开篇~~ n =10 #控制菱形的大小 for i in range(1, n): for j in range(int ...
- C语言:求π
1835: 圆的面积 本题的关键在于如何求π: 今天先给给大家介绍一种针对本题的方法——利用反三角函数求π. 在高数中arcsin(0)=arccos(1)=π,不过编译器中并没有arcsin和arc ...
- 关于一致性hash,这可能是全网最形象生动最容易理解的文档,想做架构师的你来了解一下
问题提出 一致性hash是什么?假设有4台缓存服务器N0,N1,N2,N3,现在需要存储数据OBJECT1,OBJECT2,OBJECT3,OBJECT4,OBJECT5,OBJECT5,OBJECT ...
- 微信配置JS接口安全域名问题-Nginx配置
1.将下载的txt文件放入/usr/local/nginx/html/目录下面. 2.修改nginx.cong配置文件中的location标签 location / { root html; inde ...
- python_封装redis_hash方法
xshell 进入 虚拟环境 安装 redis workon py3env # 进入虚拟环境 pip install redis # 安装redis deactivate # 退出虚拟环境 简单的封装 ...
- linux配置环境jdk
条件:将jdk安装好,如果没有安装请看这里:linux(Centos7系统)中安装JDK.Tomcat.Mysql 步骤如下: linux中,环境变量是在 /etc/profile 中修改文件 vi ...
- C# 运行流程
转载 https://www.cnblogs.com/qcloud1001/p/9816956.html 从编译原理说起 一句话介绍编译器:编译器是将用某种程式语言写成的源代码(源语言),转换成另一 ...
- How to do SSH Tunneling (Port Forwarding)
How to do SSH Tunneling (Port Forwarding) In this post we will see how ssh works?, what is SSH tunne ...
- iOS之集成GoogleMap定位、搜索注意事项
简介: 最近花了些时间看了GoogleMap官方文件并集成到国际版app中,网上关于GoogleMap for iOS的讲解相对Android来说少一点,比较有帮助的几乎全是英文文档.下面是我开发过程 ...