用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中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
python机器人运动范围问题的解答
Apr 29 Python
python把转列表为集合的方法
Jun 28 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 Python
简单了解python元组tuple相关原理
Dec 02 Python
Python换行与不换行的输出实例
Feb 19 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
Python 如何实现访问者模式
Jul 28 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
用Python进行websocket接口测试
Oct 16 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 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
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
php中stdClass的用法分析
2015/02/27 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
jquery动态添加删除div 具体实现
2013/07/20 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
Vue动态获取width的方法
2018/08/22 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
Python IDLE清空窗口的实例
2018/06/25 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
大学生求职推荐信
2013/11/27 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python