导航:首页 > 编程语言 > python爬微博的评论

python爬微博的评论

发布时间:2023-09-04 23:08:55

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

先上结论,通过公开的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。

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

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

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

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

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+" "

    else :

    text = text+" "

    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 +" "

    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)

  • 3. 怎么利用python或R分析我的微博或者朋友圈

    一. 你在浏览微博的时候,受到哪些用户的影响。
    1. 抓取你微博的关注列表,通过一定的条件筛选一部分用户,继续抓他们的关注列表,这样抓两到三层就行了,不然数据太大了。
    2. 对抓取的用户进行影响力建模,例如,用户最近两个月的微博的转发评论和点赞数据
    3. 最后分析出哪些用户对你的影响最大

    二. 基于地理位置的分析
    1. 抓取以某个城市为发微博的地理位置的微博数据,并且抓取发微博的用户的相关信息
    2. 对数据清洗,通过用户资料筛选出是否土着居民,还是旅游出差之类的数据
    3. 对数据分析,通过发微博的时间啊,某个地点发微博的次数啊,发微博出现最多的关键词
    这些应该能得到一些有意思的数据

    三. 自然语言处理
    微博的大量的文本数据可以做自然语言处理,情感分析之类的很多研究

    四. 热点事件追踪
    1. 通过关键词的搜索,跟踪热点事件
    2. 很多热点事情都是某个微博开始发酵的,可以抓取转发路径,找出哪些是重要的转发节点,
    抓取评论内容,看看网友对这件事情的态度。
    3. 监控微博博主的粉丝增加数量的变化

    五. 计算机视觉相关研究
    1. 抓取微博出现的图片,做计算视觉相关的研究
    2. 抓取微博用户的头像,做人脸识别之类的,应该很有意思。

    六. 个人微博数据分析
    1. 发微博时间
    2. 微博出现的关键词
    3. 你点过哪些赞,评论过哪些微博。
    4. 和哪些人发过私信,这些都可以研究,关键是找到合适的模型

    4. python 新浪微博爬虫,求助

    0x00. 起因
    因为参加学校大学生创新竞赛,研究有关微博博文表达的情绪,需要大量微博博文,而网上无论是国内的某度、csdn,还是国外谷歌、gayhub、codeproject等都找不到想要的程序,没办法只能自己写一个程序了。
    ps.在爬盟找到类似的程序,但是是windows下的,并且闭源,而且最终爬取保存的文件用notepad++打开有很多奇怪的问题,所以放弃了。
    0x01. 基础知识
    本程序由Python写成,所以基本的python知识是必须的。另外,如果你有一定的计算机网络基础,在前期准备时会有少走很多弯路。
    对于爬虫,需要明确几点:
    1. 对爬取对象分类,可以分为以下几种:第一种是不需要登录的,比如博主以前练手时爬的中国天气网,这种网页爬取难度较低,建议爬虫新手爬这类网页;第二种是需要登录的,如豆瓣、新浪微博,这些网页爬取难度较高;第三种独立于前两种,你想要的信息一般是动态刷新的,如AJAX或内嵌资源,这种爬虫难度最大,博主也没研究过,在此不细举(据同学说淘宝的商品评论就属于这类)。
    2. 如果同一个数据源有多种形式(比如电脑版、手机版、客户端等),优先选取较为“纯净的”展现。比如新浪微博,有网页版,也有手机版,而且手机版可以用电脑浏览器访问,这时我优先选手机版新浪微博。
    3. 爬虫一般是将网页下载到本地,再通过某些方式提取出感兴趣的信息。也就是说,爬取网页只完成了一半,你还要将你感兴趣的信息从下载下来的html文件中提取出来。这时就需要一些xml的知识了,在这个项目中,博主用的是XPath提取信息,另外可以使用XQuery等等其他技术,详情请访问w3cschool。
    4. 爬虫应该尽量模仿人类,现在网站反爬机制已经比较发达,从验证码到禁IP,爬虫技术和反爬技术可谓不断博弈。
    0x02. 开始
    决定了爬虫的目标之后,首先应该访问目标网页,明确目标网页属于上述几种爬虫的哪种,另外,记录为了得到感兴趣的信息你需要进行的步骤,如是否需要登录,如果需要登录,是否需要验证码;你要进行哪些操作才能获得希望得到的信息,是否需要提交某些表单;你希望得到的信息所在页面的url有什么规律等等。
    以下博文以博主项目为例,该项目爬取特定新浪微博用户从注册至今的所有微博博文和根据关键词爬取100页微博博文(大约1000条)。
    0x03. 收集必要信息
    首先访问目标网页,发现需要登录,进入登录页面如下新浪微博手机版登录页面
    注意url后半段有很多形如”%xx”的转义字符,本文后面将会讲到。
    从这个页面可以看到,登录新浪微博手机版需要填写账号、密码和验证码。
    这个验证码是近期(本文创作于2016.3.11)才需要提供的,如果不需要提供验证码的话,将有两种方法进行登录。
    第一种是填写账号密码之后执行js模拟点击“登录”按钮,博主之前写过一个Java爬虫就是利用这个方法,但是现在找不到工程了,在此不再赘述。
    第二种需要一定HTTP基础,提交包含所需信息的HTTP POST请求。我们需要Wireshark 工具来抓取登录微博时我们发出和接收的数据包。如下图我抓取了在登录时发出和接收的数据包Wireshark抓取结果1
    在搜索栏提供搜索条件”http”可得到所有http协议数据包,右侧info显示该数据包的缩略信息。图中蓝色一行是POST请求,并且info中有”login”,可以初步判断这个请求是登录时发出的第一个数据包,并且这个180.149.153.4应该是新浪微博手机版登录认证的服务器IP地址,此时我们并没有任何的cookie。
    在序号为30是数据包中有一个从该IP发出的HTTP数据包,里面有四个Set-Cookie字段,这些cookie将是我们爬虫的基础。
    Wireshark抓取结果2
    早在新浪微博服务器反爬机制升级之前,登录是不需要验证码的,通过提交POST请求,可以拿到这些cookie,在项目源码中的TestCookie.py中有示例代码。
    ps.如果没有wireshark或者不想这么麻烦的话,可以用浏览器的开发者工具,以chrome为例,在登录前打开开发者工具,转到Network,登录,可以看到发出和接收的数据,登录完成后可以看到cookies,如下图chrome开发者工具
    接下来访问所需页面,查看页面url是否有某种规律。由于本项目目标之一是获取某用户的全部微博,所以直接访问该用户的微博页面,以央视新闻 为例。
    央视新闻1
    图为央视新闻微博第一页,观察该页面的url可以发现,新浪微博手机版的微博页面url组成是 “weibo.cn/(displayID)?page=(pagenum)” 。这将成为我们爬虫拼接url的依据。
    接下来查看网页源码,找到我们希望得到的信息的位置。打开浏览器开发者工具,直接定位某条微博,可以发现它的位置,如下所示。
    xpath
    观察html代码发现,所有的微博都在<div>标签里,并且这个标签里有两个属性,其中class属性为”c”,和一个唯一的id属性值。得到这个信息有助于将所需信息提取出来。
    另外,还有一些需要特别注意的因素
    * 微博分为原创微博和转发微博
    * 按照发布时间至当前时间的差距,在页面上有”MM分钟前”、”今天HH:MM”、”mm月dd日 HH:MM”、”yyyy-mm-dd HH:MM:SS”等多种显示时间的方式* 手机版新浪微博一个页面大约显示10条微博,所以要注意对总共页数进行记录以上几点都是细节,在爬虫和提取的时候需要仔细考虑。
    0x04. 编码
    1.爬取用户微博
    本项目开发语言是Python 2.7,项目中用了一些第三方库,第三方库可以用pip的方法添加。
    既然程序自动登录的想法被验证码挡住了,想要访问特定用户微博页面,只能使用者提供cookies了。
    首先用到的是Python的request模块,它提供了带cookies的url请求。
    import request
    print request.get(url, cookies=cookies).content使用这段代码就可以打印带cookies的url请求页面结果。
    首先取得该用户微博页面数,通过检查网页源码,查找到表示页数的元素,通过XPath等技术提取出页数。
    页数
    项目使用lxml模块对html进行XPath提取。
    首先导入lxml模块,在项目里只用到了etree,所以from lxml import etree
    然后利用下面的方法返回页数
    def getpagenum(self):
    url = self.geturl(pagenum=1)
    html = requests.get(url, cookies=self.cook).content # Visit the first page to get the page number.
    selector = etree.HTML(html)
    pagenum = selector.xpath('//input[@name="mp"]/@value')[0]
    return int(pagenum)
    接下来就是不断地拼接url->访问url->下载网页。
    需要注意的是,由于新浪反爬机制的存在,同一cookies访问页面过于“频繁”的话会进入类似于“冷却期”,即返回一个无用页面,通过分析该无用页面发现,这个页面在特定的地方会出现特定的信息,通过XPath技术来检查这个特定地方是否出现了特定信息即可判断该页面是否对我们有用。
    def ispageneeded(html):
    selector = etree.HTML(html)
    try:
    title = selector.xpath('//title')[0]
    except:
    return False
    return title.text != '微博广场' and title.text != '微博'
    如果出现了无用页面,只需简单地重新访问即可,但是通过后期的实验发现,如果长期处于过频访问,返回的页面将全是无用页面,程序也将陷入死循环。为了避免程序陷入死循环,博主设置了尝试次数阈值trycount,超过这个阈值之后方法自动返回。
    下面代码片展示了单线程爬虫的方法。
    def startcrawling(self, startpage=1, trycount=20):
    attempt = 0
    try:
    os.mkdir(sys.path[0] + '/Weibo_raw/' + self.wanted)except Exception, e:
    print str(e)
    isdone = False
    while not isdone and attempt < trycount:
    try:
    pagenum = self.getpagenum()
    isdone = True
    except Exception, e:
    attempt += 1
    if attempt == trycount:
    return False
    i = startpage
    while i <= pagenum:
    attempt = 0
    isneeded = False
    html = ''
    while not isneeded and attempt < trycount:
    html = self.getpage(self.geturl(i))
    isneeded = self.ispageneeded(html)
    if not isneeded:
    attempt += 1
    if attempt == trycount:
    return False
    self.savehtml(sys.path[0] + '/Weibo_raw/' + self.wanted + '/' + str(i) + '.txt', html)print str(i) + '/' + str(pagenum - 1)
    i += 1
    return True
    考虑到程序的时间效率,在写好单线程爬虫之后,博主也写了多线程爬虫版本,基本思想是将微博页数除以线程数,如一个微博用户有100页微博,程序开10个线程,那么每个线程只负责10个页面的爬取,其他基本思想跟单线程类似,只需仔细处理边界值即可,在此不再赘述,感兴趣的同学可以直接看代码。另外,由于多线程的效率比较高,并发量特别大,所以服务器很容易就返回无效页面,此时trycount的设置就显得更重要了。博主在写这篇微博的时候,用一个新的cookies,多线程爬取现场测试了一下爬取北京邮电大学的微博,3976条微博全部爬取成功并提取博文,用时仅15s,实际可能跟cookies的新旧程度和网络环境有关,命令行设置如下,命令行意义在项目网址里有说明python main.py _T_WM=xxx; SUHB=xxx; SUB=xxx; gsid_CTandWM=xxx u bupt m 20 20爬取的工作以上基本介绍结束,接下来就是爬虫的第二部分,解析了。由于项目中提供了多线程爬取方法,而多线程一般是无序的,但微博博文是依靠时间排序的,所以项目采用了一种折衷的办法,将下载完成的页面保存在本地文件系统,每个页面以其页号为文件名,待爬取的工作结束后,再遍历文件夹内所有文件并解析。
    通过前面的观察,我们已经了解到微博博文存在的标签有什么特点了,利用XPath技术,将这个页面里所有有这个特点的标签全部提取出来已经不是难事了。
    在这再次提醒,微博分为转发微博和原创微博、时间表示方式。另外,由于我们的研究课题仅对微博文本感兴趣,所以配图不考虑。
    def startparsing(self, parsingtime=datetime.datetime.now()):
    basepath = sys.path[0] + '/Weibo_raw/' + self.uidfor filename in os.listdir(basepath):
    if filename.startswith('.'):
    continue
    path = basepath + '/' + filename
    f = open(path, 'r')
    html = f.read()
    selector = etree.HTML(html)
    weiboitems = selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
    weibo = Weibo()
    weibo.id = item.xpath('./@id')[0]
    cmt = item.xpath('./div/span[@class="cmt"]')if len(cmt) != 0:
    weibo.isrepost = True
    weibo.content = cmt[0].text
    else:
    weibo.isrepost = False
    ctt = item.xpath('./div/span[@class="ctt"]')[0]
    if ctt.text is not None:
    weibo.content += ctt.text
    for a in ctt.xpath('./a'):
    if a.text is not None:
    weibo.content += a.text
    if a.tail is not None:
    weibo.content += a.tail
    if len(cmt) != 0:
    reason = cmt[1].text.split(u'\xa0')
    if len(reason) != 1:
    weibo.repostreason = reason[0]
    ct = item.xpath('./div/span[@class="ct"]')[0]
    time = ct.text.split(u'\xa0')[0]
    weibo.time = self.gettime(self, time, parsingtime)self.weibos.append(weibo.__dict__)
    f.close()
    方法传递的参数parsingtime的设置初衷是,开发前期爬取和解析可能不是同时进行的(并不是严格的“同时”),微博时间显示是基于访问时间的,比如爬取时间是10:00,这时爬取到一条微博显示是5分钟前发布的,但如果解析时间是10:30,那么解析时间将错误,所以应该讲解析时间设置为10:00。到后期爬虫基本开发完毕,爬取工作和解析工作开始时间差距降低,时间差将是爬取过程时长,基本可以忽略。
    解析结果保存在一个列表里,最后将这个列表以json格式保存到文件系统里,删除过渡文件夹,完成。
    def save(self):
    f = open(sys.path[0] + '/Weibo_parsed/' + self.uid + '.txt', 'w')jsonstr = json.mps(self.weibos, indent=4, ensure_ascii=False)f.write(jsonstr)
    f.close()
    2.爬取关键词
    同样的,收集必要的信息。在微博手机版搜索页面敲入”python”,观察url,研究其规律。虽然第一页并无规律,但是第二页我们发现了规律,而且这个规律可以返回应用于第一页第一页
    第二页
    应用后第一页
    观察url可以发现,对于关键词的搜索,url中的变量只有keyword和page(事实上,hideSearchFrame对我们的搜索结果和爬虫都没有影响),所以在代码中我们就可以对这两个变量进行控制。
    另外,如果关键词是中文,那么url就需要对中文字符进行转换,如我们在搜索框敲入”开心”并搜索,发现url如下显示搜索开心
    但复制出来却为
    http://weibo.cn/search/mblog?hideSearchFrame=&keyword=%E5%BC%80%E5%BF%83&page=1幸好,python的urllib库有qoute方法处理中文转换的功能(如果是英文则不做转换),所以在拼接url前使用这个方法处理一下参数。
    另外,考虑到关键词搜索属于数据收集阶段使用的方法,所以在此只提供单线程下载网页,如有多线程需要,大家可以按照多线程爬取用户微博的方法自己改写。最后,对下载下来的网页进行提取并保存(我知道这样的模块设计有点奇怪,打算重(xin)构(qing)时(hao)时再改,就先这样吧)。
    def keywordcrawling(self, keyword):
    realkeyword = urllib.quote(keyword) # Handle the keyword in Chinese.
    try:
    os.mkdir(sys.path[0] + '/keywords')
    except Exception, e:
    print str(e)
    weibos = []
    try:
    highpoints = re.compile(u'[\U00010000-\U0010ffff]') # Handle emoji, but it seems doesn't work.
    except re.error:
    highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')pagenum = 0
    isneeded = False
    while not isneeded:
    html = self.getpage('http://weibo.cn/search/mblog?keyword=%s&page=1' % realkeyword)isneeded = self.ispageneeded(html)
    if isneeded:
    selector = etree.HTML(html)
    try:
    pagenum = int(selector.xpath('//input[@name="mp"]/@value')[0])except:
    pagenum = 1
    for i in range(1, pagenum + 1):
    try:
    isneeded = False
    while not isneeded:
    html = self.getpage('http://weibo.cn/search/mblog?keyword=%s&page=%s' % (realkeyword, str(i)))isneeded = self.ispageneeded(html)
    selector = etree.HTML(html)
    weiboitems = selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
    cmt = item.xpath('./div/span[@class="cmt"]')if (len(cmt)) == 0:
    ctt = item.xpath('./div/span[@class="ctt"]')[0]
    if ctt.text is not None:
    text = etree.tostring(ctt, method='text', encoding="unicode")tail = ctt.tail
    if text.endswith(tail):
    index = -len(tail)
    text = text[1:index]
    text = highpoints.sub(u'\u25FD', text) # Emoji handling, seems doesn't work.
    weibotext = text
    weibos.append(weibotext)
    print str(i) + '/' + str(pagenum)
    except Exception, e:
    print str(e)
    f = open(sys.path[0] + '/keywords/' + keyword + '.txt', 'w')try:
    f.write(json.mps(weibos,indent=4,ensure_ascii=False))except Exception,ex:
    print str(ex)
    finally:
    f.close()
    博主之前从未写过任何爬虫程序,为了获取新浪微博博文,博主先后写了3个不同的爬虫程序,有Python,有Java,爬虫不能用了是很正常的,不要气馁,爬虫程序和反爬机制一直都在不断博弈中,道高一尺魔高一丈。
    另. 转载请告知博主,如果觉得博主帅的话就可以不用告知了

    5. 可以用Python爬虫监控一个人在微博等社交网络发出与收到的评论吗

    你可以监控已授权的账户收到的评论和自动回复评论,微博是有这个相关api的,至于监控其他人的,就不是很清楚了,你可以看一下微博开放平台上的微博API
    http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI

    阅读全文

    与python爬微博的评论相关的资料

    热点内容
    奔驰smart车型压缩机功率 浏览:525
    服务器预留地址获取 浏览:1002
    云库文件夹怎么设置 浏览:293
    文件夹目录制作自动跳转 浏览:452
    在哪个音乐app能听exo的歌 浏览:847
    pdf超级加密 浏览:47
    苹果手机app安装包怎么解压并安装 浏览:905
    中原30系统源码 浏览:184
    程序员如何遵纪守法 浏览:499
    java的webxml配置 浏览:962
    如何封包远程注入服务器 浏览:864
    监测机构资金动向源码 浏览:967
    android状态栏字体50 浏览:767
    python如何判断文件后缀 浏览:126
    龙空app哪里下 浏览:348
    阿里云服务器搭建网盘 浏览:691
    京东软件程序员 浏览:806
    php游戏服务器框架 浏览:392
    导航开发算法 浏览:432
    为什么30岁还想转行程序员 浏览:380