Python爬虫实战(五) :下载百度贴吧帖子里的所有图片

原创 2017年09月05日 12:31:16
准备工作:
目标网址:https://tieba.baidu.com/p/5113603072
目的:    下载该页面上的所有楼层里的照片

第一步:分析网页源码
火狐浏览器  ---> 在该页面上右击 “查看页面源代码”,会打开一个新的标签页。

第二步:查找图片源地址
在新标签页上ctrl + F,输入jpg,找到第一个图片的源地址

<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=29a773eb871001e94e3c1407880f7b06/50cf3bc79f3df8dc5b6bb593c711728b47102859.jpg"
BTW,怎么知道这个链接是不是第一张图,在查找jpg的时候,直接复制jpg网址在浏览器上输入回车对比即可,如果是超链接,直接点击即可。

查找后分析,所有楼层里面的图片都是这个格式<img class="BDE_Image" src=.......


第三步:使用强大BeautifulSoup,过滤标签img 和 class="BDE_Image",代码:
soup = BeautifulSoup(html, 'html.parser')
img_info = soup.find_all('img', class_='BDE_Image')

第四步:找出所有照片的原始链接,代码
for img in img_info:
    img.get("src")

第五步:下载
使用urllib.request.urlretrieve函数

整合后写成完整代码:


#coding=utf-8  
import requests
import urllib.request
from bs4 import BeautifulSoup

def getHtml(url):  
    page = requests.get(url)  
    html =page.text  
    return html

def getImg(html):
    soup = BeautifulSoup(html, 'html.parser')  
    img_info = soup.find_all('img', class_='BDE_Image')
    for index,img in enumerate(img_info,1):
        print ("正在下载第{}张图片".format(index))
        urllib.request.urlretrieve(img.get("src"),'%s.jpg' % index)  
        
if __name__=='__main__':
    url = "https://tieba.baidu.com/p/5113603072"
    html = getHtml(url)
    getImg(html)

    print ("OK!All DownLoad!")




我们看到该帖子远远不止一页,我们也想下载其他页面上的图片怎么办?

点击第二页,网址变为
https://tieba.baidu.com/p/5113603072?pn=2

将pn=2改成pn=1试试,回车,又发现与之前的网站https://tieba.baidu.com/p/5113603072指向的是同一个页面,因此可以循环来访问了。

代码:

#coding=utf-8
import re
import requests
import urllib.request 
from bs4 import BeautifulSoup

def getHtml(url):  
    page = requests.get(url)  
    html =page.text  
    return html

def getImg(html):
    soup = BeautifulSoup(html, 'html.parser')  
    img_info = soup.find_all('img', class_='BDE_Image')
    global index 
    for index,img in enumerate(img_info,index+1):
        print ("正在下载第{}张图片".format(index))
        urllib.request.urlretrieve(img.get("src"),'%s.jpg' % index)

def getMaxPage(url):
    html = getHtml(url)
    reg  = re.compile(r'max-page="(\d+)"')
    page = re.findall(reg,html)
    page = int(page[0])
    return page
    
        
if __name__=='__main__':
    url   = "https://tieba.baidu.com/p/5113603072"
    page  = getMaxPage(url)
    index = 0
    for i in range(1,page):
        url = "%s%s"  % ("https://tieba.baidu.com/p/5113603072?pn=",str(i))
        html = getHtml(url)
        getImg(html)
        
    print ("OK!All DownLoad!")


   





总结:BeautifulSoup功能真是太强大了。





版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Spring学习(九)使用ioc注解方式配置bean

context层 : 上下文环境/容器环境 applicationContext.xml1 ioc注解功能 注解 简化xml文件配置 如 hibernate 映射文件 ioc...

spring security与cas 集成(中)

上一篇对于spring security与cas集成中涉及的名词,认证与授权进行简单说明,现在将spring security与cas集成的配置文件简单贴上来,这其中所需要的jar太多了,主要涉及ca...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Windows客户端开发简介(四)

在上一篇文章里,我简单扼要的给大家介绍了一下GDI的基础知识,包括DC,HDC,GDI对象等等,总的来说都是些偏理论的知识,属于概念的范畴。          今天这篇文章里,我就要正式开始...

CSS3你可能不知道的冷知识

可能我们在看一些网页的源码时 会发现自己从来没见过的属性或用法 今天我就来总结一下 CSS3的冷知识 样式计算在CSS中也可以进行简单的计算 通过calc函数可以实现 这样还可以使我们的元...

挂载Azure file share 到K8S container

在Azure里面我们可以使用虚拟机搭建k8s,也可以使用ACS(Azure container service)去创建K8S,不同的是用虚拟机去自己搭建K8S,可配置的内容多一些。ACS是个标准的模板...

jenkins的安装与使用(基于 centos 7)

jenkins的安装与使用(基于 centos 7)1、首先去官网(https://jenkins.io/index.html)下载最新的rpm包。 安装好后。 war:/usr/lib/jenk...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)