20行PYTHON代码爬取微博高清大图,小白练手绝佳案例

2017-04-15  本文已影响476人  鸡仔说

<h1>0. 前戏说明</h1>

环境说明
效果预览

<h1>1. 分析网页</h1>

  1. 打开微博链接,Chrome浏览器调用网页解析器(快捷键:Mac:⌘ + shift + c, Windows:Ctrl + shift + c)得到如下页面
微博页面

2.点击如图所示的小按钮,把它转到移动显示,然后刷新页面。注意链接会变成<code>m.weibo.cn</code>至于为什么要转移动端嘛,移动端代码优雅很多,爬虫起来方便。

Paste_Image.png

3.点开第一张图,然后点击代码页面左上角那个指针,再把它移到页面上大图的位置,会在右边看到一行对应的链接地址

Paste_Image.png

4.复制在<code><src></code>中的内容<code>http://wx1.sinaimg.cn/large/005KcApbly1fbknniwmsij30go0got9a.jpg</code>然后键入⌘+f (windows: ctrl + f )查找,在左下角的位置复制地址进去,看下结果有两条显示。

Paste_Image.png

5.输入回车,会发现我们的结果出现在如图所示的黄色部位。

第一处 第二处
  1. 等等,我们往下翻的时候,却惊喜的发现更多类似的链接,这是不是意味着,我们只要把接下来的链接全部爬出来就能把所有的图片提取出来了?
Paste_Image.png

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

至此,就得到了如下几张图片

最终效果

不到二十行(不信的小伙伴可以把备注全部删掉看看),一个简单的微博撸图神器就完成了。把这个送给每天要爬图的新媒体运营的妹纸,就等着她投来仰慕的眼神,下班约你吃饭,然后去速八,然后嘿嘿嘿吧~

很重要的废话:转载的话,通知我一声就可以了。就是说通知,不需要等我回复的那种,别拿走了说也不说哈,我生气的话,后果很严重。

上一篇下一篇

猜你喜欢

热点阅读