怎样用python爬新浪微博大V所有数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样用python爬新浪微博大V所有数据相关的知识,希望对你有一定的参考价值。

我是个微博重度用户,工作学习之余喜欢刷刷timeline看看有什么新鲜事发生,也因此认识了不少高质量的原创大V,有分享技术资料的,比如好东西传送门;有时不时给你一点人生经验的,比如石康;有高产的段子手,比如银教授;有黄图黄段子小能手,比如阿良哥哥 木木萝希木 初犬饼…

好吧,我承认,爬黄图黄段子才是我的真实目的,前三个是掩人耳目的…(捂脸,跑开)

另外说点题外话,我一开始想使用Sina Weibo API来获取微博内容,但后来发现新浪微博的API限制实在太多,大家感受一下:

只能获取当前授权的用户(就是自己),而且只能返回最新的5条,WTF!
所以果断放弃掉这条路,改为『生爬』,因为PC端的微博是Ajax的动态加载,爬取起来有些困难,我果断知难而退,改为对移动端的微博进行爬取,因为移动端的微博可以通过分页爬取的方式来一次性爬取所有微博内容,这样工作就简化了不少。

最后实现的功能:

    输入要爬取的微博用户的user_id,获得该用户的所有微博

    文字内容保存到以%user_id命名文本文件中,所有高清原图保存在weibo_image文件夹中

    具体操作:
    首先我们要获得自己的cookie,这里只说chrome的获取方法。

    用chrome打开新浪微博移动端

    option+command+i调出开发者工具

    点开Network,将Preserve log选项选中

    输入账号密码,登录新浪微博

    找到m.weibo.cn->Headers->Cookie,把cookie复制到代码中的#your cookie处

    cookie

    然后再获取你想爬取的用户的user_id,这个我不用多说啥了吧,点开用户主页,地址栏里面那个号码就是user_id

    将python代码保存到weibo_spider.py文件中
    定位到当前目录下后,命令行执行python weibo_spider.py user_id
    当然如果你忘记在后面加user_id,执行的时候命令行也会提示你输入

    最后执行结束

    iTerm

    小问题:在我的测试中,有的时候会出现图片下载失败的问题,具体原因还不是很清楚,可能是网速问题,因为我宿舍的网速实在太不稳定了,当然也有可能是别的问题,所以在程序根目录下面,我还生成了一个userid_imageurls的文本文件,里面存储了爬取的所有图片的下载链接,如果出现大片的图片下载失败,可以将该链接群一股脑导进迅雷等下载工具进行下载。

    另外,我的系统是OSX EI Capitan10.11.2,Python的版本是2.7,依赖库用sudo pip install XXXX就可以安装,具体配置问题可以自行stackoverflow,这里就不展开讲了。

    下面我就给出实现代码(严肃脸)

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

       

    #-*-coding:utf8-*-

    import re

    import string

    import sys

    import os

    import urllib

    import urllib2

    from bs4 import BeautifulSoup

    import requests

    from lxml import etree

    reload(sys)

    sys.setdefaultencoding('utf-8')

    if(len(sys.argv) >=2):

    user_id = (int)(sys.argv[1])

    else:

    user_id = (int)(raw_input(u"请输入user_id: "))

    cookie = "Cookie": "#your cookie"

    url = 'd?filter=1&page=1'%user_id

    html = requests.get(url, cookies = cookie).content

    selector = etree.HTML(html)

    pageNum = (int)(selector.xpath('//input[@name="mp"]')[0].attrib['value'])

    result = ""

    urllist_set = set()

    word_count = 1

    image_count = 1

    print u'爬虫准备就绪...'

    for page in range(1,pageNum+1):

    #获取lxml页面

    url = 'hu/%d?filter=1&page=%d'%(user_id,page)

    lxml = requests.get(url, cookies = cookie).content

    #文字爬取

    selector = etree.HTML(lxml)

    content = selector.xpath('//span[@class="ctt"]')

    for each in content:

    text = each.xpath('string(.)')

    if word_count >= 4:

    text = "%d :"%(word_count-3) +text+"\\n\\n"

    else :

    text = text+"\\n\\n"

    result = result + text

    word_count += 1

    #图片爬取

    soup = BeautifulSoup(lxml, "lxml")

    urllist = soup.find_all('a',href=re.compile(r'^mblog/oripic',re.I))

    first = 0

    for imgurl in urllist:

    urllist_set.add(requests.get(imgurl['href'], cookies = cookie).url)

    image_count +=1

    fo = open("/Users/Personals/%s"%user_id, "wb")

    fo.write(result)

    word_path=os.getcwd()+'/%d'%user_id

    print u'文字微博爬取完毕'

    link = ""

    fo2 = open("/Users/Personals/%s_imageurls"%user_id, "wb")

    for eachlink in urllist_set:

    link = link + eachlink +"\\n"

    fo2.write(link)

    print u'图片链接爬取完毕'

    if not urllist_set:

    print u'该页面中不存在图片'

    else:

    #下载图片,保存在当前目录的pythonimg文件夹下

    image_path=os.getcwd()+'/weibo_image'

    if os.path.exists(image_path) is False:

    os.mkdir(image_path)

    x=1

    for imgurl in urllist_set:

    temp= image_path + '/%s.jpg' % x

    print u'正在下载第%s张图片' % x

    try:

    urllib.urlretrieve(urllib2.urlopen(imgurl).geturl(),temp)

    except:

    print u"该图片下载失败:%s"%imgurl

    x+=1

    print u'原创微博爬取完毕,共%d条,保存路径%s'%(word_count-4,word_path)

    print u'微博图片爬取完毕,共%d张,保存路径%s'%(image_count-1,image_path)

       

参考技术A   先上结论,通过公开的api如果想爬到某大v的所有数据,需要满足以下两个条件:

  1、在你的爬虫开始运行时,该大v的所有微博发布量没有超过回溯查询的上限,新浪是2000,twitter是3200。
  2、爬虫程序必须不间断运行。

  新浪微博的api基本完全照搬twitter,其中接口的参数特性与底层的NoSQL密不可分,建议先看点Nosql数据库的设计理念有助于更好的理解api设计。

  一般来说,如果决定爬某个大v,第一步先试获取该用户的基本信息,中间会包含一条最新的status,记下其中的id号作为基准,命名为baseId。

  接口中最重要的两个参数:

  since_id:返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0。
  max_id:返回ID小于或等于max_id的微博,默认为0。

  出于各种原因,获取statuses的接口,固定为按id降序排列(scan_index_forward=false),即最新的statuses返回在前。假设该微博第一天上线,就一个用户,发了一百条,id是1到100。而你在该用户发了第50条的时候开始运行的爬虫,即baseId=50。本回答被提问者和网友采纳
参考技术B 用python 写爬虫,然后一次次的找啊。比较费事

如何通过python调用新浪微博的API来爬取数据

1:安装python(这个不多说啦)
2:下载新浪微博SDK的python包,解压为weibopy目录

3:申请AppKey,

流程:

1:通过oAuth认证
按我的理解简化如下:
用户在新浪微博给的页面输入账号密码,然后微博给应用一个PIN码,这样应用通过PIN码才有权限访问该用户的信息,而应用在整个过程中是接触不到密码的,所以用户觉得很安全,后果很满意
2:获得认证之后,就可以使用微博SDK提供的API获得信息啦
3:如果想设计web或者客户端应用的话,那就继续加个GUI好啦(未完成)

代码:

#!/usr/bin/python

import webbrowser

from weibopy.auth import OAuthHandler
from weibopy.api import API

AppKey = '2525355147'
AppSecret = '2e2c7bcdfc362eace266d1f2bf83fe6b'

my_auth = OAuthHandler(AppKey , AppSecret)
webbrowser.open(my_auth.get_authorization_url())
verifier = raw_input('PIN: ').strip()
my_auth.get_access_token(verifier)

my_api = API(my_auth)
for comment in my_api.mentions():
object = comment
id = object.__getattribute__("id")
text = object.__getattribute__("text")
print str(id) + " : " + text
参考技术A 1:安装python(这个不多说啦)
2:下载新浪微博SDK的python包,解压为weibopy目录
(http://open.t.sina.com.cn/wiki/index.php/SDK)
3:申请AppKey,详见(http://open.t.sina.com.cn/wiki/index.php/FAQ)

流程:

1:通过oAuth认证,详见(http://open.t.sina.com.cn/wiki/index.php/Oauth)
按我的理解简化如下:
用户在新浪微博给的页面输入账号密码,然后微博给应用一个PIN码,这样应用通过PIN码才有权限访问该用户的信息,而应用在整个过程中是接触不到密码的,所以用户觉得很安全,后果很满意
2:获得认证之后,就可以使用微博SDK提供的API获得信息啦
3:如果想设计web或者客户端应用的话,那就继续加个GUI好啦(未完成)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#!/usr/bin/python

import webbrowser

from weibopy.auth import OAuthHandler
from weibopy.api import API

AppKey = '2525355147'
AppSecret = '2e2c7bcdfc362eace266d1f2bf83fe6b'

my_auth = OAuthHandler(AppKey , AppSecret)
webbrowser.open(my_auth.get_authorization_url())
verifier = raw_input('PIN: ').strip()
my_auth.get_access_token(verifier)

my_api = API(my_auth)
for comment in my_api.mentions():
object = comment
id = object.__getattribute__("id")
text = object.__getattribute__("text")
print str(id) + " : " + text
参考技术B 参考官方文档

以上是关于怎样用python爬新浪微博大V所有数据的主要内容,如果未能解决你的问题,请参考以下文章

如何通过python调用新浪微博的API来爬取数据

Python爬取新浪微博用户信息及内容

Python爬取新浪微博用户信息及内容

Python 超简单爬取新浪微博数据 (高级版)

python网络编程新浪爬虫:关键词搜索爬取微博数据

python网络编程新浪爬虫:关键词搜索爬取微博数据