用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 相关文章推荐
Python 通过pip安装Django详细介绍
Apr 28 Python
Python实现自动登录百度空间的方法
Jun 10 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
Python3实现腾讯云OCR识别
Nov 27 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
Django学习笔记之为Model添加Action
Apr 30 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
python将时分秒转换成秒的实例
Dec 07 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
如何利用python之wxpy模块玩转微信
Aug 17 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
使用adodb lite解决问题
2006/12/31 PHP
php中变量及部分适用方法
2008/03/27 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
移动节点的jquery代码
2014/01/13 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
javascript每日必学之循环
2016/02/19 Javascript
vue.js表格分页示例
2016/10/18 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
Python中的文件和目录操作实现代码
2011/03/13 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
浅谈Python3中print函数的换行
2020/08/05 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
人代会标语
2014/06/30 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
安全教育培训心得体会
2016/01/15 职场文书