用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 model去掉unique_together报错的解决方案
Oct 18 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
python中实现k-means聚类算法详解
Nov 11 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python爬取豆瓣电影TOP250数据
May 23 Python
PyTorch 如何检查模型梯度是否可导
Jun 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安全编程之加密功能
2006/10/09 PHP
QueryPath PHP 中的jQuery
2010/04/11 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
2017/11/09 Python
Python对List中的元素排序的方法
2018/04/01 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
CLR与IL分别是什么含义
2016/08/23 面试题
在C#中如何实现多态
2014/07/02 面试题
四年的个人工作自我评价
2013/12/10 职场文书
军训学生自我鉴定
2014/02/12 职场文书
甘南现象心得体会
2014/09/11 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
运动员代表致辞
2015/07/29 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
mysqldump进行数据备份详解
2022/07/15 MySQL