微信扫码登录

其他登录方式

绑定手机号

注册

我同意用户协议

忘记密码

用户协议

绑定手机号

近期有不法分子打着爱盈利的旗号,制作“爱盈利”名称的App,并伪造爱盈利证件,骗取用户信任,以抖音点赞赚钱或其他方式赚钱为名义,过程中以升级会员获得高佣金为名让用户充值。
爱盈利公司郑重声明:我司没有研发或运营过任何名为“爱盈利”的APP,我司做任务赚钱类产品从没有让任何普通用户充值升级会员。我公司产品均在本网站可查询,请将网站拉至底部,点击“关于我们”可查看爱盈利相关产品与服务。
温馨提示:当遇到此类问题请拨打官方电话或添加官方微信,以免财产损失。爱盈利官网地址:www.aiyingli.com。
  • 推广与合作
X

用 Python 写一个简单的微博爬虫

来源: 2916
爱盈利(aiyingli.com)移动互联网最具影响力的盈利指导网站。定位于服务移动互联网创业者,移动盈利指导。我们的目标是让盈利目标清晰可见!降低门槛,让缺乏经验、资金有限的个人和团队获得经验和机会,提高热情,激发产品。

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

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

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

用 Python 写一个简单的微博爬虫
只能获取当前授权的用户(就是自己),而且只能返回最新的5条,WTF!

所以果断放弃掉这条路,改为『生爬』,因为PC端的微博是Ajax的动态加载,爬取起来有些困难,我果断知难而退,改为对移动端的微博进行爬取,因为移动端的微博可以通过分页爬取的方式来一次性爬取所有微博内容,这样工作就简化了不少。

最后实现的功能:

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

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

具体操作:

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

  1. 用chrome打开新浪微博移动端
  2. option+command+i调出开发者工具
  3. 点开Network,将Preserve log选项选中
  4. 输入账号密码,登录新浪微博用 Python 写一个简单的微博爬虫

找到m.weibo.cn->Headers->Cookie,把cookie复制到代码中的#your cookie处用 Python 写一个简单的微博爬虫

cookie

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

将python代码保存到weibo_spider.py文件中

定位到当前目录下后,命令行执行python weibo_spider.py user_id

当然如果你忘记在后面加user_id,执行的时候命令行也会提示你输入

最后执行结束用 Python 写一个简单的微博爬虫

iTerm用 Python 写一个简单的微博爬虫用 Python 写一个简单的微博爬虫

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

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

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

#-*-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 = ‘http://weibo.cn/u/%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 = ‘http://weibo.cn/u/%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’^http://weibo.cn/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)

via:Python开发者

End.

转载请注明来自36大数据(36dsj.com):36大数据 » 用 Python 写一个简单的微博爬虫

爱盈利-运营小咖秀 始终坚持研究分享移动互联网App数据运营推广经验、策略、全案、渠道等纯干货知识内容;是广大App运营从业者的知识启蒙、成长指导、进阶学习的集聚平台;

评论

相关文章推荐

SELECT dw_posts.ID,dw_posts.post_title,dw_posts.post_content FROM dw_posts INNER JOIN dw_term_relationships ON (dw_posts.ID = dw_term_relationships.object_id) WHERE 1=1 AND(dw_term_relationships.term_taxonomy_id = 3413 ) AND dw_posts.post_type = 'post' AND (dw_posts.post_status = 'publish') GROUP BY dw_posts.ID ORDER BY RAND() LIMIT 0, 6

京ICP备15063977号-2 © 2012-2018 aiyingli.com. All Rights Reserved. 京公网安备 11010102003938号