用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 相关文章推荐
在Django的session中使用User对象的方法
Jul 23 Python
windows下python安装pip图文教程
May 25 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
python面试题小结附答案实例代码
Apr 11 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
Python数据存储之 h5py详解
Dec 26 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
Python之京东商品秒杀的实现示例
Jan 06 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
请离开include_once和require_once
2013/07/18 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python 输出上个月的月末日期实例
2018/04/11 Python
python编写计算器功能
2019/10/25 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript