用Python写一个简单的微博爬虫
admin
2023-07-30 20:45:30
0

我是个微博重度用户,工作学习之余喜欢刷刷timeline看看有什么新鲜事发生,也因此认识了不少高质量的原创大V,有分享技术资料的,比如好东西传送门;有时不时给你一点人生经验的,比如石康;有高产的段子手,比如银教授;有黄图黄段子小能手,比如阿良哥哥 木木萝希木 初犬饼…

好吧,我承认,爬黄图黄段子才是我的真实目的,前三个是掩人耳目的…(捂脸,跑开)

另外说点题外话,我一开始想使用Sina Weibo API来获取微博内容,但后来发现新浪微博的API限制实在太多,大家感受一下:


user_timeline API document

只能获取当前授权的用户(就是自己),而且只能返回最新的5条,WTF!
所以果断放弃掉这条路,改为『生爬』,因为PC端的微博是Ajax的动态加载,爬取起来有些困难,我果断知难而退,改为对移动端的微博进行爬取,因为移动端的微博可以通过分页爬取的方式来一次性爬取所有微博内容,这样工作就简化了不少。

最后实现的功能:

  1. 输入要爬取的微博用户的user_id,获得该用户的所有微博
  2. 文字内容保存到以%user_id命名文本文件中,所有高清原图保存在weibo_image文件夹中

具体操作:
首先我们要获得自己的cookie,这里只说chrome的获取方法。

  • 用chrome打开新浪微博移动端
  • option+command+i调出开发者工具
  • 点开Network,将Preserve log选项选中
  • 输入账号密码,登录新浪微博

  • 找到m.weibo.cn->Headers->Cookie,把cookie复制到代码中的#your cookie处


cookie

然后再获取你想爬取的用户的user_id,这个我不用多说啥了吧,点开用户主页,地址栏里面那个号码就是user_id

将python代码保存到weibo_spider.py文件中
定位到当前目录下后,命令行执行python weibo_spider.py user_id
当然如果你忘记在后面加user_id,执行的时候命令行也会提示你输入

最后执行结束


iTerm


文字内容


图片内容

小问题:在我的测试中,有的时候会出现图片下载失败的问题,具体原因还不是很清楚,可能是网速问题,因为我宿舍的网速实在太不稳定了,当然也有可能是别的问题,所以在程序根目录下面,我还生成了一个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)

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...