用Python编写简单的微博爬虫


Posted in Python onMarch 04, 2016

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

用Python编写简单的微博爬虫

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

最后实现的功能:

1、输入要爬取的微博用户的user_id,获得该用户的所有微博
2、文字内容保存到以%user_id命名文本文件中,所有高清原图保存在weibo_image文件夹中
具体操作:
首先我们要获得自己的cookie,这里只说chrome的获取方法。

1、用chrome打开新浪微博移动端
2、option+command+i调出开发者工具
3、点开Network,将Preserve log选项选中
4、输入账号密码,登录新浪微博

用Python编写简单的微博爬虫

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

用Python编写简单的微博爬虫

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

用Python编写简单的微博爬虫

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

最后执行结束

用Python编写简单的微博爬虫

用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)

一个简单的微博爬虫就完成了,希望对大家的学习有所帮助。

Python 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
Python中实现的RC4算法
Feb 14 Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 Python
python Flask实现restful api service
Dec 04 Python
在Python中增加和插入元素的示例
Nov 01 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
django的ORM模型的实现原理
Mar 04 Python
对Python 检查文件名是否规范的实例详解
Jun 10 Python
python 函数中的参数类型
Feb 11 Python
什么是python的列表推导式
May 26 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
Python编程super应用场景及示例解析
Oct 05 Python
python相似模块用例
Mar 04 #Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 #Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 #Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 #Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 #Python
python套接字流重定向实例汇总
Mar 03 #Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 #Python
You might like
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
javascript 函数的暂停和恢复实例详解
2020/04/25 Javascript
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Sanic框架应用部署方法详解
2018/07/18 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
办公室内勤工作职责
2013/12/11 职场文书
网络技术专业求职信
2014/02/18 职场文书
就业协议书怎么填
2014/04/11 职场文书
公关活动策划方案
2014/05/25 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
市场部经理岗位职责
2015/02/02 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android