平时没事就喜欢刷刷微博,追追星,关注关注娱乐圈动态顺便看看老婆们的最新动态,每次看到老婆们发的新图就很幸福,于是就想写个爬虫把老婆们的微博配图给爬下来,一般爬到的不是自拍就是表情包,还是收获满满的。
因为最近学到了一句话:不要重复造轮子。所以第一当然是去看一看有没有别的写出来的成品,然后发现确实有,但没有找到特别合适的,当然每个人都有自己的要求,别人的代码不符合自己的需求也是正常的。不过看了这么多代码,自然也就有了个大概的思路,于是经过三天两夜的努力,就有了这篇作品,看着老婆们静静地躺在我的硬盘里对我甜甜地笑着,心里真的别提有多开心了(* ̄3 ̄)╭
思路
首先遇到的问题是去哪个页面抓取,开始自己尝试的时候是直接去微博网页端:https://www.weibo.com,然后发现…好像有点难,不知道从何下手,听说api还限制了爬取速度,爬的贼慢,所以web端pass。接着我又去了移动端也就是html5版:https://m.weibo.cn,听说接口也比较好,是比较好实现的,但我这条菜鸟又遇到了一个问题,因为html5版的微博页面和web端一样也是采用动态加载的,什么是动态加载呢,就是你打开一页可以一直往下翻,他会一直帮你自动加载,直到底部。这就导致了代码是根据你的行为(鼠标的点击等等)不断变化的。所以我就选择了更加简单的移动版,应该是老年机版:https://weibo.cn,这里的页面是分页式的,代码好像也是静态的,十分轻松就能完成任务。
接着第二个问题是模拟登陆,开始我想着是post模拟登陆输入用户账号和密码即可,后来发现是我想多了…好像有点困难,于是就采用了cookie直接登陆,这个方法简单粗暴,适合我这种菜鸡。cookie直接在chrome按f12选择Network点击第一个网页,再点右边的Headers–>Request Headers,赋值下面的cookie即可。百度可以很轻松的找到方法。
想清楚上面的问题后就开始分析移动端的网页构造了,经过分析源代码,发现微博总页数是一个input标签的value属性,而input标签的name属性为’mp’,这是唯一的。然后每条微博的代码块由div标签闭合,含有id属性并且class属性的值均为’c’。微博配图所对应的url链接由img标签闭合,而且该标签的alt属性的值均为’图片’。然后微博发送时间的标签为span标签,span标签的class属性的值为’ct’,这也是发送时间的代码块特有的属性值。
屁话少说,放码过来

import requests
from bs4 import BeautifulSoup as bs
import os
import re#uid即进入对方微博主页后网址部分/u/后的那一串数字
uid = input('请输入所要爬取的用户id:')
url = 'https://weibo.cn/u/' + uid
cookie = input('请输入你的新浪微博的cookie:')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36', 'Cookie': cookie}r = requests.get(url, headers=headers)
soup = bs(r.text, 'html.parser')
# 所访问的微博用户名
weibo_user_name = soup.find('title').text.replace('的微博', '')
# 存放图片的根目录
rootDir = 'D://微博配图相册//' + weibo_user_name + '//'
# 微博总页数,通过审查元素可知
totalPage = int(soup.find('input', attrs={'name': 'mp'}).attrs['value'])
print('总共检测到%d页微博页面' % totalPage)
# 每页微博的URL的列表
weibo_urlList = [url + '?page=' + str(i + 1) for i in range(totalPage)]
#当前已爬取的图片总数
pictrue_num = 0
for page, weibo_url in enumerate(weibo_urlList):r = requests.get(weibo_url, headers=headers)soup = bs(r.text, 'html.parser')#每条微博所对应的标签代码块列表weibo_tags_list = soup.find_all('div', attrs={'class': 'c'}, id=True)#微博发送时间与微博配图的字典imgs_urls_dic = {}for entry, weibo_tag in enumerate(weibo_tags_list):print('正在爬取第%d页第%d条微博' % (page + 1, entry + 1))#获取微博发送时间hms = ' '.join(weibo_tag.find('span', attrs={'class': 'ct'}).text.replace('\xa0', ' ').replace(':', '-').split(' ')[:2])#该条微博若带有组图,获取组图中所有图片的URLif weibo_tag.find('a', text=re.compile('组图')):imgs_url = weibo_tag.find('a', text=re.compile('组图')).attrs['href']html = requests.get(imgs_url, headers=headers)imgs_soup = bs(html.text, 'html.parser')imgs_tags_List = imgs_soup.find_all('img', alt='图片加载中...')img_urls_list = [imgs_tag.attrs['src'].replace('thumb180', 'large') for imgs_tag in imgs_tags_List]imgs_urls_dic[hms] = img_urls_list#该条微博仅有一张配图,或者没有图片,获取图片的URLelse:img_tags_List = weibo_tag.find_all('img', alt='图片')img_urls_list = [img_tag.attrs['src'].replace('wap180', 'large') for img_tag in img_tags_List]imgs_urls_dic[hms] = img_urls_listprint('第%d页微博爬取完毕,开始生成图片' % (page + 1))for hms, img_urls_list in imgs_urls_dic.items():for index, img_url in enumerate(img_urls_list):#生成图片的存放路径,图片被命名为微博发送时间path = rootDir + hms#如果一条微博在同一时间发送了多张图片(即组图)的命名处理if(index > 0):path = path + '(' + str(index) + ')'path = path + '.jpg'try:if not os.path.exists(rootDir):#makedirs递归生成多级目录,mkdir仅能生成一级目录os.makedirs(rootDir)if not os.path.exists(path):r = requests.get(img_url)with open(path, 'wb') as f:f.write(r.content)pictrue_num = pictrue_num + 1print('success,成功爬取第%d张图片' % pictrue_num)else:print('%s已经存在' % path)except:print('爬取失败,%s' % img_url)
print('总共爬取了%d张图片,存放在 %s 目录下' % (pictrue_num, rootDir))

食用方法
运行后输入目标用户id和自己的cookie就行了,运行结果是爬取目标微博的配图并以微博发送时间命名存放在指定目录下。然后就可以每天欣赏女神的各种高清写真了。经过测试,该代码可能会有bug爬取不下来的。但是感觉还是适用于大多数情况的。
感想
需求永远是第一生产力,老婆才是最大的动力! ! !顺便吐槽一下idle和sublime,各种bug导致运行错误,快要被逼疯了! ! !

python爬取微博配图相关推荐

  1. 看看你爱的他今天是什么‘颜色‘ -- Python爬取微博评论制作专属偶像词云

    简介:快来拿出你珍藏的pick star,用大家对他的爱重塑一个他吧.通过爬取微博评论,制作你的偶像图片词云,天天都是不重样的哦! 很多人学习python,不知道从何学起. 很多人学习python,掌 ...

  2. python爬取微博热搜榜

    python爬取微博热搜榜 最近应我大学室友得需求,做了一个简单的爬虫案例,先给大家看一下程序运行效果 接下来就是贴出代码了,在这里我会做一些简单说明,对如刚入门的同学可能会有所帮助,这里使用的是py ...

  3. python爬取微博热搜数据并保存!

    主要用到requests和bf4两个库将获得的信息保存在d://hotsearch.txt下importrequests;importbs4mylist=[]r=requests.get(ur- 很多 ...

  4. python爬取微博话题下面的帖子并存入excel文件

    此次写的是python爬取微博话题下面的帖子,示例代码以爬取#转发这个杨超越# https://s.weibo.com/weibo/%23%E8%BD%AC%E5%8F%91%E8%BF%99%E4% ...

  5. python爬取微博数据词云_用Python爬取微博数据生成词云图片

    原标题:用Python爬取微博数据生成词云图片 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数 ...

  6. python3爬取微博评论教程_用python 爬取微博评论,怎么打开微博评论下的查看更多|...

    怎样用python爬新浪微博大V所有数据 先上结论,通过公开的api如爬到某大v的所有数据,需足以下两个条件: 1.在你的爬虫开始运行时,该大v的所有微博发布量没有超过回溯查询的上限,新浪是2000, ...

  7. python爬取微博热门消息(一)——效果展示

    微博的热搜榜对于研究大众的流量有非常大的价值. 今天的教程就来说说如何爬取微博的热搜榜. 感兴趣的小伙伴可以 收藏 + 关注 哦! 另外,关于本项目的效果展示,以及教程,点击一下链接即可. pytho ...

  8. python爬取微博热门消息(三)—— 爬取微博热门信息的功能函数

    微博的热搜榜对于研究大众的流量有非常大的价值. 今天的教程就来说说如何爬取微博的热搜榜. 感兴趣的小伙伴可以 收藏 + 关注 哦! 另外,关于本项目的效果展示,以及教程,点击一下链接即可. pytho ...

  9. python爬取微博热搜写入数据库_python实现爬取微博热搜存入Mysql

    python爬取微博热搜存入Mysql最终的效果 使用的库 目标分析 一:得到数据 二:链接数据库 总代码 最终的效果 废话不多少,直接上图 这里可以清楚的看到,数据库里包含了日期,内容,和网站lin ...

最新文章

  1. 漫画:你真的懂Github吗?
  2. kubernetes相关概念
  3. css 图片居中放大,不同比例图片居中缩放显示的三种方法
  4. 修改can接口波特率_CAN总线分析仪使用
  5. BZOJ 4291: [PA2015]Kieszonkowe 水题
  6. windows安装pm2
  7. 前端: 42 种前端常用布局方案,值得收藏!
  8. jdbc 连接池 java_JDBC自定义连接池过程详解
  9. 目标跟踪学习笔记_2(particle filter初探1)
  10. 【转载+整理】EJB(三) EJB分层架构
  11. 内存的管理方式有哪些
  12. 从turtlesim到贪吃蛇……(补充)
  13. CrownCAD 注册/登录
  14. 如何用计算机算标准偏差,标准差计算器怎样安装使用?标准差计算器使用教程介绍...
  15. MS17-010(永恒之蓝)适合Windows 2008r2的补丁如何打?
  16. 暑假学习计划:Day_1.JSPServletTomcat 环境搭建到基础的认识。
  17. MySQL鲜为人知的排序方式
  18. Apache Doris 技术调研
  19. JAI LT-400CL相机设置
  20. 微信小程序微信支付安卓手机可以,苹果手机支付失败。

热门文章

  1. paylinks.php_私服发布网站PHP程序(含系统安装教程)
  2. PHP开发实战权威指南-读书总结
  3. 内地生在港学习广东话八大心得
  4. 2022流动式起重机司机培训试题模拟考试平台操作
  5. 怎么才能知道条码扫描器哪个好?
  6. 【汇正财经】什么是复盘?
  7. 第12期《乘风破浪》2月刊
  8. 修改DLL文件实现龙崖Dragon Cliff作弊
  9. 梦幻西游手游海外服务器维护,梦幻西游手游服务器5月4系统维护
  10. python火车票查询工具tkinter_python 3.6 tkinter+urllib+json实现火车车次信息查询功能...