• 技术文章 >后端开发 >Python教程

    Python 爬虫如何机器登录新浪微博并抓取内容?

    2016-06-06 16:21:58原创967

    回复内容:

    教你一个爬虫小技巧:所有社交网站爬虫,优先选择爬移动版,比如:m.weibo.com 我开通了一个QQ群,在极客学院参加了我的定向爬虫课程的同学可以在里面沟通交流提问。群号为:398687538

    如果你是直接在淘宝上买的视频或者甚至是直接在网盘上免费下载的视频,请不要进来。

    ====================================

    我在极客学院做了一个视频课程来讲解如何模拟登陆新浪微博。

    请戳:->

    http://www.jikexueyuan.com/course/995.html

    我做了一个定向爬虫的入门系列课程:
    1. 基本的正则表达式
    2. 单线程爬虫
    3. Xpath与多线程爬虫
    4. 简单的模拟登录
    5. Scrapy初探
    6. MongoDB与Scrapy
    7. Scrapy与Redis入门
    8. 动态加载网页的爬取
    欢迎关注~ 你问,为什么浏览器中看到的跟程序里获取的html不一样。我推断你对网页从一个文本文件到你所看到得样子这期间经历了什么不甚了解。浏览器里所看到的跟你用程序抓取的看到不一样是因为网页文本中的javascript代码会被浏览器解析执行。而javascript会修改页面dom结构。但是python中网页文本中的javascript不会被解析执行。建议了解一下浏览器解析网页过程。
    工欲善其事,必先利其器。推荐你看一下这个项目 binux/pyspider · GitHub 。另外开阔思路的项目 ariya/phantomjs · GitHub 、 n1k0/casperjs · GitHub
    最后经验,抓取网页的话 wap站 > m站 > pc站 。微博wap站无js,表单结构简单清晰。适合初学拿来学习抓取。做微博爬虫,微博机器人没事千万别在微博上关注微博反垃圾团队的工程师,因为他们很可能互粉你,别问我为什么知道滴。 啊喂,你们不要只收藏不点赞啊 = =
    稍微更新一下,多说两句。
    虽然爬取移动端比较简单,但是爬一点难的东西对身体好对吧。
    总结一下这个模拟登陆涉及的东西:
    1.用户名经过base64加密。
    2.输入用户名后会进行预登陆操作。
    3.密码明文与一些其它的字符串参数拼接后,使用RSA加密,再提交给服务器,其中RSA公钥和各种参数都可以从预登陆操作返回的结果中找到。
    4.会出现两个跳转。

    所以思路如下:
    1.用base64加密用户名之后仿造一个预登陆,用正则匹配得到各项参数。
    2.用上一步里得到的参数,拼接密码明文,再用RSA加密得到密文,并构造POST的form data。
    3.使用构造好的form data仿造登录请求
    4.用正则匹配获得跳转的目标链接。
    5.为了保持登陆,用cookiejar一类的工具绑定一个cookie就行了。

    ======以下原答案=======
    刚写完这个爬虫。。
    新浪这东西做的煞是恶心。
    代码和分析过程写在我blog里了。
    http://shrik3.com/2016/03/25/sina-login/

    测试可以用。
    有理解不对的地方欢迎聚聚们指正
    。。
    你说的最后那段代码,是从重定向页面中获取新的url然后继续登陆,然而少了一步喔。 难点在于模拟登陆,登陆后不管直接抓网页还是调用API都好办,前者抓包仔细检查返回内容,后者抽时间阅读API,不过API有限制调用次数。
    以前在研究的时候,找到一个不需要验证码的入口:新浪通行证登录
    登陆代码见我博文中的第一种方法:Python 模拟登录新浪微博的两种方法 1. 可以不用模拟登陆,因为微博的登陆有注册码,很难手动破解。用搜狗浏览器或者chrome登陆网站前 按F12调出调试窗口,然后正常的登陆到网站,在调试窗口中找到访问网站所使用的COOKIE值。COOKIE值决定你是否有访问权限,没有COOKIE小饼干,你就是个游客,很多的url地址将会被重定位到weibo.cn/pub

    2. 设置header = { 'Connection' : 'keep-alive', 'cookie' : COOKIE, 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0' }。 COOKIE就不用多说了, User-Agent模拟浏览器行为, Connection加速socket访问,不用每次都重新打开新的socket连接。

    3. 调用req = urllib2.Request(url, headers=h) 构造请求,然后content =urllib2.urlopen(req)返回网站的内容。请求包括地址与请求头,如果有表单参数,还要加入data。

    4. 返回了内容content之后,可以采用正则表达式匹配要爬的数据,或者采用lxml、betaifulsoup等html解析工具解析找到需要爬的数据。看具体的任务,简单点的就直接正则匹配了,复杂的还是用html解析之后再提取内容。

    爬虫就是这么简单。这么easy。有了python,再也不用担心指针越界内存回收了。哈哈哈。
    url = url, # url = '....' (怎么找的?)
    人工找的, 在你爬一个网页之前要进行踩点, 既然要模拟登录, 当然要人工找到登录的页面, 在请求中填入预先准备好的表单信息及http头并通过urllib提交表单(data=postdata, headers = headers这两句)
    text = result.read() # 这读出来的是什么?
    读的是页面源代码, 但这个页面源代码跟我们浏览器看到的页面并不完全一致, 这是经过js处理的, 你截图里看到div里没有内容, 排除认证失败或者操作错误的原因则说明这个div的内容是经过js处理输出的. 这对爬虫来说不是个好消息, 因为它意味着我们的爬虫要对js进行处理, 我所知道的方法是用一些可以模拟浏览器行为的python库,如selenium、webdriver.
    可以参考下这个问题:Python 爬虫如何获取 JS 生成的 URL 和网页内容? - JavaScript
    不过我认为这种方法多少有点费劲了, 可以爬取这个页面的移动版来达到更好的效果.

    写爬虫的时候还早用浏览器的查看源代码功能吧, 这才是爬虫看到的真实页面.

    如果是要实现模拟登录的话, 推荐用截包工具Fiddler free web debugging proxy, 这个工具无论是用来前端调试还是截包分析都是个神器.
    比如说, 在Fiddler的拦截下, 你可以试着把浏览器在该网站下的cookie和session清掉, 然后刷新一下. 观察有无cookie两个请求返回页面的差距, 再用Fiddler手工填写表单内容试一下登录, 接着只要用python的http库模拟发出一个一样的登录请求, 并把cookie保存下来就可以了.不知道说的是否清楚, 如果无法理解的话我再补充回答吧. 微博的内容是通过pagelet填进去的,你去看看下边的众多script标签就能看到一大堆转义过的html,在直接拿到的body内是看不到源html的
    所以你要做的是去抓script标签,拿到html字段的内容并反转义 这个好像是初学爬虫必修课。。。爬微博,微博好可怜。以下是干货:
    1、微博可以直接爬移动版: weibo.cn
    2、关于pc版的模拟登录分析,可以参考我之前的文章,应该是帮助了不少人,最近还有人微博私信我的,地址:python 新浪微博模拟登陆 & 密码加密分析_The_Third_Wave_新浪博客
    3、关于使用微博api,昨天接到升级通知,好像限制ip使用应用了,不知道还可以用否,但是当时的笔记,还是很有用的,同样,最近还能收到关于微博api使用的咨询私信,地址如下:
    Python:新浪微博API的使用及安全的模拟登陆自动获取code值,微博API怎么爬取其他未授权用户的微博/怎么爬取指定用户发布的微博。 其实很简单,模拟提交一些数据,你先用抓包工具把正常登陆时发送的字段都记录下来,然后一个个模拟,建议不要直接模拟登录pc版的先试试wap版的
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:
    上一篇:想从事运维开发,有什么好的自学 CentOS 和 Python 学习方案? 下一篇:关于 Python 的经典入门书籍有哪些?
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 实例详解Python面向对象的四大特征• 简单学习Python字符和列表(实例详解)• 图文详解怎么用Python绘制动态可视化图表• 介绍六个超好用的Python内置函数• 一起聊聊Python的编码样式
    1/1

    PHP中文网