前言(一些废话)

最近试了一下网页版的(weibo.com)和移动端的(m.weibo.cn),网页版的解析一大堆网页实在是太麻烦,移动端只需要请求,直接返回json数据,这里对这两种方式做了下优缺点对比

网页版

  • 优点
  1. 用户信息获取的很全面,出生日期、性取向、感情状况是移动端不能获取的
  2. 微博、粉丝可以抓取的比较全面
  3. 可以学习xpath、bs4、正则的网页解析
  • 缺点
  1. 要花钱哦,因为多账号登录需要验证码,验证码识别的话,用云打码(没用过)是收费的
  2. 解析页面恶心的一批,要写正则、要去看网页...比较麻烦

移动版

  • 优点
  1. 不需要验证码
  2. 直接解析json
  • 缺点
  1. 个人信息不全
  2. 微博、粉丝分页到了250之后,就没有数据返回了,暂时还没解决这个是为什么。

现在用的是移动版,配了5个微博账号,5个线程在跑,电脑扔在寝室跑,不敢说一天多少多少数据,但现在保持在一天用户30W、微博20W左右的数据量...只跑了两天...

源码的话,看后面....

正题

其实思路很简单,就是通过urllib模拟请求登录、发请求,然后解析json,存数据库...当然程序还有很多优化的地方,以后慢慢改进

环境

  • python3
  • django 1.11.3
  • mysql 5.7.17
  • fiddler 4

抓取

写爬虫的套路就是,访问页面,分析页面行为,也就是页面的每一个操作都发了什么样的请求,返回了什么数据,记住这个套路,还有什么爬虫不能写。

模拟登陆

打开m.weibo.cn,打开fiddler 4,开启https请求的捕捉,不知道怎么开自行google
当你输入好账号、密码点击登录的时候,看fiddler4捕获的请求


post请求,当然是看看他发了什么数据啦....

再看看response的数据


返回了用户登录的状态,uid...
你可以访问 www://weibo.com/u/ + 上图的uid加一波微博关注(真无耻,强行吸粉)

密码没有做任何加密处理,嘻嘻,很简单吧,现在只要模拟个post请求就行了。是不是很简单?

def login(user_name, password, opener):LOGGER.info(user_name + ' login')args = {'username': user_name,'password': password,'savestate': 1,'ec': 0,'pagerefer': 'https://passport.weibo.cn/signin/''welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F&wm=3349&vt=4','entry': 'mweibo','wentry': '','loginfrom': '','client_id': '','code': '','qq': '','hff': '','hfp': ''}post_data = urllib.parse.urlencode(args).encode()try_time = 0while try_time < constants.TRY_TIME:try:resp = opener.open(constants.LOGIN_URL, post_data)resp_json = json.loads(resp.read().decode())if 'retcode' in resp_json and resp_json['retcode'] == '20000000':LOGGER.info("%s login successful" % user_name)breakelse:LOGGER.warn('login fail:%s' % str(resp_json))sleep(10)try_time += 1except :LOGGER.error("login failed")LOGGER.error(traceback.print_exc())sleep(10)try_time += 1LOGGER.info('try %d time' % try_time)

看看写的模拟登录能不能用,当然要测试啦,这个测试当然是你自己写啦,反正我已经测试过了,如果不出意外的话,你的测试会不通过,如下URLError

Traceback (most recent call last):File "E:\codingspace\python\Jpider\spiders\weibo\weibo_http.py", line 40, in loginresp = opener.open(constants.LOGIN_URL, post_data)File "D:\ProgramData\Anaconda3\lib\urllib\request.py", line 526, in openresponse = self._open(req, data)File "D:\ProgramData\Anaconda3\lib\urllib\request.py", line 544, in _open'_open', req)File "D:\ProgramData\Anaconda3\lib\urllib\request.py", line 504, in _call_chainresult = func(*args)File "D:\ProgramData\Anaconda3\lib\urllib\request.py", line 1361, in https_opencontext=self._context, check_hostname=self._check_hostname)File "D:\ProgramData\Anaconda3\lib\urllib\request.py", line 1320, in do_openraise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>

哎呀,好烦,又报错,怎么办呢,stackoverflow欢迎你,传送门https://stackoverflow.com/,有错自己查,stackoverflow能解决99%你遇到的问题。

关注信息抓取

登录就那么轻松的搞定了,用户信息、微博、粉丝、关注的套路都是一样,分析拦截的请求,看哪个请求是返回数据的,然后自己模拟这个请求,就ok啦。

这里就只做用户关注的抓取示例,其他的自己去依葫芦画瓢。
最近在看环法,自己也是个骑行爱好者...现在天热...都不能出去骑了,很绝望。
就以环法自行车赛这个用户的关注信息为例吧

现在你可以借助chrome的工具栏看请求,windows下的快捷键是F12

查看他的关注->全部关注。你会发现浏览器发了如下的请求

你可以直接复制这个请求,在浏览器上打开。

可以看到这个请求返回的就是他的关注用户的json数据,而python中的json模块直接解析,很方便吧。

看看这个url[点开试试?]

https://m.weibo.cn/api/container/getIndex?containerid=231051_-_followers_-_5901021570&luicode=10000011&lfid=1005055901021570&featurecode=20000320&type=uid&value=5901021570

该用户的uid为5901021570,url是怎么拼的不用再多说了吧。

当然还有分页,自己往下拖,你可以看到url上会多了个page的参数,那个就是页号

数据都拿到了,还等什么?解析完后想怎么存怎么存吧。

    def grab_user_follower(self, user_id):opener = weibo_http.get_openner()user = self.grab_user(user_id)att_num = user.attNummax_page = int(int(att_num) / 20)page = 1while page <= max_page:resp = opener.open(constants.FOLLOWER_URL_PATTERN % (user_id, user_id, str(page)))self.logger.info(constants.FOLLOWER_URL_PATTERN % (user_id, user_id, str(page)))r = resp.read()resp_json = json.loads(r.decode())if 'msg' in resp_json:breakfor card in resp_json['cards']:for cg in filter(lambda c: 'user' in c, card['card_group']):follower = dao.save_user_info(cg['user'])dao.save_relationship(follower, user)self.id_enqueue(follower.id, self.user_set_lock, self.CRAWLED_USERS, self.user_queue)page += 1

后语

关于微博移动端的抓取就暂时说这么多吧,说实话,移动端还是比较简单的,多线程可以搞定,只开了五个,日抓取量已经达到了30W用户+20W微博了,之后打算改成分布式的...

关于源码,暂时还没想放出来,因为不开心,而且我觉得这个也没什么难度,基本可以自己动手写,单线程写完再改成多线程的,很easy的...

当然我已经放在github了,地址暂时先不放,考验你找资料的能力了....

过几天再把网页版的抓取过程放上来,心情好点再说...

python3+urllib打造新浪微博爬虫,真的很easy相关推荐

  1. 智能家居DIY真的很easy的实现了

    买个智能空调,手机装个APP,远程可以控制空调工作,感觉很爽.再买个智能热水器,又安装一个APP,下班前烧好热水,过瘾.再买几个智能灯泡,再安装一个APP,开关灯不用起床,觉得还方便.再买套智能报警系 ...

  2. Python爬虫获取京东大数据!其实爬虫真的很简单!

    简介 Python是一个简洁的语言,集成性非常高,我们可以使用集成的工具库,本文中用到的库有requests.re 找到我们需要爬取的链接 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  3. python3 asyncio 爬虫_python3 asyncio异步新浪微博爬虫WeiboSpider

    一些废话 之前写的用python3+urllib写的多线程微博(传送门),后面发现登录账号频繁被403,所以解决登录问题迫在眉睫.而且python的"多线程"并不那么多线程,最近因 ...

  4. 新浪微博爬虫设计(Python版)

    最近手头上有一个项目,是关于新浪微博的,其中有一环要做新浪微博的爬虫.虽然之前把<Python学习手册>和<Python核心编程>都囫囵吞栆地通读完了,不过真正到做项目的时候还 ...

  5. 新浪微博爬虫分享(2016年12月01日更新)

    前言: 上篇文章:<新浪微博爬虫分享(一天可抓取 1300 万条数据)>.<新浪微博分布式爬虫分享> Github地址:SinaSpider Q群讨论: 更新完<QQ空间 ...

  6. Python3 Requests+BS4网络爬虫:最详细零基础的获取百度快照链接爬虫教程(思路篇)

    Hello,大家好呀,五一劳动节快乐呀!最近在后台接到一个粉丝的私信说怎么爬取百度快照.正好五一有一段时间休息,咱们就来水一篇文章,顺便来巩固巩固基础的知识. 注意注意!这是思路篇,没有代码!只有思路 ...

  7. 新浪微博爬虫遇到的cookie rejected 问题解决办法

    最近做了个新浪微博爬虫,用到了httpclient-4.3.3,程序运行的很好,就是一直会出现 cookie rejected警告,日志如下: 2014-06-05 10:27:17.417 [mai ...

  8. python拿什么做可视化界面好-用python打造可视化爬虫监控系统,酷炫的图形化界面...

    原标题:用python打造可视化爬虫监控系统,酷炫的图形化界面 本文并不是讲解爬虫的相关技术实现的,而是从实用性的角度,将抓取并存入 MongoDB 的数据 用 InfluxDB 进行处理,而后又通过 ...

  9. python3爬虫实例-python3.7简单的爬虫实例详解

    python3.7简单的爬虫,具体代码如下所示: #https://www.runoob.com/w3cnote/python-spider-intro.html #Python 爬虫介绍 impor ...

最新文章

  1. 解決scott 用戶登錄錯誤: invalid username/password;logon denied
  2. 贵州发布大数据发展十方面成果
  3. HTML5 本地文件操作之FileSystemAPI整理(一)
  4. Android开发基本概念
  5. 设计一个具有等待队列的连接池
  6. 第九篇:Spring Boot整合Spring Data JPA_入门试炼03
  7. java入栈_java中代码块的执行,也会有入栈的步骤吗?
  8. java流程控制结构不包括_以下各项中不属于Java语言流程控制结构的是()。
  9. hdu4906:3-idiots【FFT】
  10. 加密音乐文件MGG/NCM转MP3
  11. Web 框架之 SSH 框架的简单搭建的简单整理(基于Eclipse)
  12. 高效能人士的七个习惯的简要定义与架构图
  13. FIsh论坛《零基础入门学习Python》| 第012讲 课后测试题及答案
  14. mysql explain结果信息_MySQL EXPLAIN 输出信息解读
  15. 答案揭晓 | 关于云基础架构,你了解多少?
  16. MacOS Big Sur Beta 测评|使用体验|有哪些BUG?|如何安装?|实际体验如何?|WWDC2020
  17. 雅思考试为您揭秘美国大学最新排名中的玄机
  18. 微信小程序的基本使用
  19. 怎么给php加音乐,视频中添加背景音乐 怎么给视频添加背景 给视频中某段加背景音乐...
  20. python分析微博粉丝_新浪微博Python SDK笔记——获取粉丝列表或关注列表 | 学步园...

热门文章

  1. Python之冒泡排序和选择排序的比较
  2. 巧用PHP双$功能兼容线上线下配置文件
  3. JNIWrapper控件发布v3.8.4版本
  4. 无法在VMware Player中安装64位系统
  5. Citrix Bypass总结
  6. GAE研究小组:面向对象与面向过程的工程化理解
  7. 微软4月补丁星期二修复119个漏洞,含2个0day
  8. 速修复!CISA警告称 Zoho 服务器0day已遭在野利用
  9. Java Swing中键盘事件的处理
  10. Shell(6): 多线程操作及线程数