用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基础教程之获取本机ip数据包示例
Feb 10 Python
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
Apr 15 Python
Windows下安装Scrapy
Oct 17 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
Python requests模块实例用法
Feb 11 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
python 多进程和协程配合使用写入数据
Oct 30 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的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
python将图片转base64,实现前端显示
2020/01/09 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
三年级音乐教学反思
2014/01/28 职场文书
药品业务员岗位职责
2014/04/17 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
2014年小学工作总结
2014/11/26 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers