使用Python爬取微博高清美女大图

打开微博官网,这里以爬取美女博主Duebass的所有图片为例,首先打开她的主页

主页中显示的都是一些小图,我们点击其中的某一张图片,就可以查看她的大图了。

打开F12查看图片的地址信息,

//wx4.sinaimg.cn/mw690/75614297ly1g2sq66raswj21vl2qae82.jpg

复制这个地址去源代码中搜索,我们发现搜索不到这个url,那么狠明显,图片的地址信息是存放在js或者json文件中的。由于电脑端查看的信息不是很完整,这里我们使用手机端的模式来查看。点击左上角的手机图标然后刷新页面就可以切换到手机浏览模式

切换到手机视图之后,我们再打开Network这个选项,刷新页面信息,可以看到服务的发送了很多的文件过来,翻看这些文件我们发现其中有一个以getIndex开头的文件里面返回的信息中,包含了大量的图片的地址信息,使用浏览器打开这些图片,

图片正是我们所需要的,有些是大图,有些是小图,进一步分析发现,在一个pics数组中,带有large属性的图片是大图,而没有的则是小图。

知道这些信息之后,我们还需找到其他的分页地址信息,因为当前返回的数据中的图片并没有多少,用鼠标拖动页面获取更多的图片,然后在network中找到对应的地址,复制两个不同页的地址我们可以发现,除了page不同之外,其他的都是相同的。

https://m.weibo.cn/api/container/getIndex?is_hot[]=1&is_hot[]=1&jumpfrom=weibocom&type=uid&value=1969308311&containerid=1076031969308311&page=3
https://m.weibo.cn/api/container/getIndex?is_hot[]=1&is_hot[]=1&jumpfrom=weibocom&type=uid&value=1969308311&containerid=1076031969308311&page=4

最后我们还需找到一共有多少页,

查看头部信息

total的数量是4081,然后每页大概有几十张图片,我们将page参数的值改成50,查看头信息,发现page显示的是50,然后将page值改成60,发现显示的还是50,说明它的页数也就是50了,知道这些信息之后,那么写出代码就变得很简单了。

#爬取微博 Duebass的图片

from urllib import request
import re
import ssl

file_path = 'F:/blog/'
#http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid=6&start=6590&count=50
base_url = 'https://m.weibo.cn/api/container/getIndex?is_hot[]=1&is_hot[]=1&jumpfrom=weibocom&type=uid&value=1969308311&containerid=1076031969308311&page='

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
    'Accept': 'application/json, text/plain, */*',
    'Referer': 'https://m.weibo.cn/p/1005051969308311/photos?from=page_100505&from=page_100505&mod=TAB&mod=TAB&jumpfrom=weibocom'
}

context = ssl._create_unverified_context()

for i in range(5, 6):
    try:
        realurl = base_url+str(i)
        req = request.Request(url=realurl, headers=header)
        #resp = requests.get(realurl, headers=header)
        resp = request.urlopen(req, context=context).read().decode()
        print('==============正在下载第'+str(i)+'页的图片===============')
        # 先获取所有的large里面的url,注意观察,大图的url中都包含/large,那么我们获取所有的url然后过虐掉不包含/large的url就行了
        pat = '"url":"(.*?)"'
        list1 = re.compile(pat).findall(resp)
        list2 = filter(lambda url : url.find('/large') != -1, list1)
        list2 = list(list2)
        for j in range(0, len(list2)-1):
            pic_url = list2[j].replace('\/', '/')
            request.urlretrieve(pic_url, file_path+str(i)+str(j)+'.jpg')
        print('============第' + str(i) + '页的图片下载完成===============')

    except Exception as error:
        print(error)

下载过程中可能会出现计算机拒绝等异常信息,可根据控制台打印的情况,将出了异常的页数重新下载。

猜你喜欢

转载自blog.csdn.net/qq_21963133/article/details/90142087