20行PYTHON代码爬取微博高清大图,小白练手绝佳案例
<h1>0. 前戏说明</h1>
环境说明
- python3版本
- 所需库:<code>Beautifulsoup</code> 、<code>re</code> 、<code>requests</code>
- 知识点:正则表达式、基本网页请求与解析、文件写入
- 适用人群:小白
- 最终目标:20行代码爬取<a href='http://weibo.com/5263375497/Eq3GVEgEq?from=page_1005055263375497_profile&wvr=6&mod=weibotime&type=comment#_rnd1492222234309'>微博 @来点儿设计 的九张图片</a>
- 最终效果:
<h1>1. 分析网页</h1>
- 打开微博链接,Chrome浏览器调用网页解析器(快捷键:Mac:⌘ + shift + c, Windows:Ctrl + shift + c)得到如下页面
2.点击如图所示的小按钮,把它转到移动显示,然后刷新页面。注意链接会变成<code>m.weibo.cn</code>至于为什么要转移动端嘛,移动端代码优雅很多,爬虫起来方便。
Paste_Image.png3.点开第一张图,然后点击代码页面左上角那个指针,再把它移到页面上大图的位置,会在右边看到一行对应的链接地址
Paste_Image.png4.复制在<code><src></code>中的内容<code>http://wx1.sinaimg.cn/large/005KcApbly1fbknniwmsij30go0got9a.jpg</code>然后键入⌘+f (windows: ctrl + f )查找,在左下角的位置复制地址进去,看下结果有两条显示。
Paste_Image.png5.输入回车,会发现我们的结果出现在如图所示的黄色部位。
第一处 第二处- 等等,我们往下翻的时候,却惊喜的发现更多类似的链接,这是不是意味着,我们只要把接下来的链接全部爬出来就能把所有的图片提取出来了?
7.打开那些链接一看,果然是这样,不愧我看了这么多侦探小说。那么接下来逻辑就简单了,找到<code>script</code>提取<code>pics</code>下面所有<code>url</code>对应的链接就可以了。
<h1>2. 开始撸码</h1>
#coding:utf8
from bs4 import BeautifulSoup
import requests,re
#requests.get方法获取response响应
req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
#用美丽的汤BeautifulSoup解析网页html信息
soup = BeautifulSoup(req.text, 'lxml')
print(soup)
可以在Pycharm中运行一下,你将得到一连串如图的结果。
Paste_Image.png你会发现想要的链接<code>"url": "http://wx1.sinaimg.cn/orj360/005KcApbly1fbknniwmsij30go0got9a.jpg",</code>都在<code>"url":"</code>和<code>",</code>之间,那么用正则去匹配一下,就很容易拿出来了。
Paste_Image.png#coding:utf8
from bs4 import BeautifulSoup
import requests
import re
#requests.get方法获取response响应
req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
#用美丽的汤BeautifulSoup解析网页html信息
soup = BeautifulSoup(req.text, 'lxml')
#用正则匹配url中间的内容,其中\"表示转义这个"\"符号,不懂的小伙伴,要去补一下正则的知识了哦!(.*?)表示懒惰模式下匹配0个或任意个字符,re.S表示包括换行符在内的任意字符,就是说啥都匹配,我全能!!!
r = re.compile(r'"url": \"(.*?)",', re.S)
a = r.findall(soup.text)
print(a)
-------------雪中送炭:正则基础可以去这里看一下☞☞☞戳这里-------------
上面的输入结果是
Paste_Image.png我们发现,这丫的不止9张图啊。我们打开每个链接看一下,原来每张图片被输出了两次,一次是缩略图,一次是整张图。而且,我们还发现一个规律,就是链接是一张缩略图,一张大图。那也就简单了。我们只要从第二张开始,隔行提取就可以啦。上代码:
from bs4 import BeautifulSoup
import requests
import re
#requests.get方法获取response响应
req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
#用美丽的汤BeautifulSoup解析网页html信息
soup = BeautifulSoup(req.text, 'lxml')
#用正则匹配url中间的内容,其中\"表示转义这个"\"符号,不懂的小伙伴,要去补一下正则的知识了哦!(.*?)表示懒惰模式下匹配0个或任意个字符,re.S表示包括换行符在内的任意字符,就是说啥都匹配,我全能!!!
r = re.compile(r'"url": \"(.*?)",', re.S)
a = r.findall(soup.text)
#从第二个开始,即索引为1。然后隔行提取直到最后,这个是Python切片的知识,不懂的小伙伴要去补一补了哈。
aaa = a[1::2]
print(aaa)
输出的结果是这样的。我们打开链接看看,果然是没错的。
Paste_Image.png是不是已经看见了胜利的曙光,好了接下来就方便了。用fp写入文件就好了,黑喂狗。
from bs4 import BeautifulSoup
import requests
import re
#requests.get方法获取response响应
req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
#用美丽的汤BeautifulSoup解析网页html信息
soup = BeautifulSoup(req.text, 'lxml')
#用正则匹配url中间的内容,其中\"表示转义这个"\"符号,不懂的小伙伴,要去补一下正则的知识了哦!(.*?)表示懒惰模式下匹配0个或任意个字符,re.S表示包括换行符在内的任意字符,就是说啥都匹配,我全能!!!
r = re.compile(r'"url": \"(.*?)",', re.S)
a = r.findall(soup.text)
#从第二个开始,即索引为1。然后隔行提取直到最后,这个是Python切片的知识,不懂的小伙伴要去补一补了哈。
aaa = a[1::2]
#定义一个num,用来为文件夹命名,从0开始。以后每次执行循环就+1
num = 0
#把aaa集合里面的链接一次次的丢给aa
for aa in aaa:
#这里有一个坑要注意,aa得到的是一个个链接,但是我们要的是能够写入的二进制文件,所以这里还是要请求一下链接再转换成二进制文件。
b = requests.get(aa)
#为什么要保存成.gif格式呢?因为平时我们可能还要撸一些gif图,如果是写成.jpg,保存下来的gif就动不了,为了偷懒,写成".gif"以后就不用改啦
with open(str(num)+'.gif', 'wb') as f:
#b.content就是链接所得到的二进制文件
f.write(b.content)
f.close()
#上面讲过,为了写入文件名的时候用,计数+1
num = num + 1
至此,就得到了如下几张图片
最终效果不到二十行(不信的小伙伴可以把备注全部删掉看看),一个简单的微博撸图神器就完成了。把这个送给每天要爬图的新媒体运营的妹纸,就等着她投来仰慕的眼神,下班约你吃饭,然后去速八,然后嘿嘿嘿吧~
很重要的废话:转载的话,通知我一声就可以了。就是说通知,不需要等我回复的那种,别拿走了说也不说哈,我生气的话,后果很严重。