Python爬虫之爬取百度贴吧帖子内的图片

前言:这篇文章在大一刚入学的时候就完成了,当初刚入门 Python 爬虫不久。现在回头看看这代码,写得什么鬼屎玩意儿。趁着周六,把这代码修改一下。

准备工作

环境
系统: Windows10 x64
编辑器: Vscode


用到的库
requests -> 文档
bs4 -> 文档

需要的知识

这篇文章讲的是 Python爬虫, 其实懂点 Python 语法应该很容易看懂。
还有一些HTML语法基础以及HTTP基础。不懂可以在后台留言。
这几个库的用法会在代码中体现。

开始爬虫

这次要爬取的帖子是这个。
地址在这:http://tieba.baidu.com/p/4629627483

Python爬虫之爬取百度贴吧帖子内的图片_第1张图片

这个帖子下面有很多南滨校园的照片,非常漂亮。

基本思路

我们如何获取到每张图片呢?
其实很简单

第一步:获取每张图片的链接
第二步:保存图片

是不是非常简单,具体怎么做请往下看。

第一步:获取每张图片的链接

这个很简单,看图


Python爬虫之爬取百度贴吧帖子内的图片_第2张图片

图片地址就在箭头所指的方向。
那如何获取这个链接呢?
非常简单。
首先要获取整个页面的HTML源码,然后再获取图片地址。
不算注释7行代码就可以搞定

# 导入所需要的库
import requests 
from bs4 import BeautifulSoup
url = 'http://tieba.baidu.com/p/4629627483' # 帖子地址
html = requests.get(url)  # 用 get 方法发送请求,返回 response 保存到变量 html
soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 库解析网页源代码
for eve_url in soup.find_all('img', class_='BDE_Image'): # 在网页源代码中找到所有图片地址
    print(eve_url['src']) # 打印出图片地址
Python爬虫之爬取百度贴吧帖子内的图片_第3张图片

随便打开一个链接验证一下


Python爬虫之爬取百度贴吧帖子内的图片_第4张图片

第二步:保存图片

在第一步中我们获取到了每张图片的地址,接下来我们就要保存这些图片到我们的电脑中。
上一步我们只是获取到了图片的地址,还没有保存,这里我们需要用一个列表来保存这些图片的地址

# 导入所需要的库
import requests 
from bs4 import BeautifulSoup
url = 'http://tieba.baidu.com/p/4629627483' # 帖子地址
html = requests.get(url)  # 用 get 方法发送请求,返回 response 保存到变量 html
soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 库解析网页源代码
for eve_url in soup.find_all('img', class_='BDE_Image'): # 在网页源代码中找到所有图片地址
    img_url_list = [] # 定义一个空列表,用于保存图片地址
    img_url_list.append(eve_url['src']) # 将每张图片的地址添加到列表当中

接下来就是要保存这些图片了,直接看代码

# 导入所需要的库
import requests 
from bs4 import BeautifulSoup
url = 'http://tieba.baidu.com/p/4629627483' # 帖子地址
html = requests.get(url)  # 用 get 方法发送请求,返回 response 保存到变量 html
soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 库解析网页源代码
for eve_url in soup.find_all('img', class_='BDE_Image'): # 在网页源代码中找到所有图片地址
    img_url_list = [] # 定义一个空列表,用于保存图片地址
    img_url_list.append(eve_url['src']) # 将每张图片的地址添加到列表当中
    for eve_url in img_url_list:
        pic = requests.get(eve_url).content # 因为图片是以二进制存储的,所以这些要用 content
        with open(eve_url.split('/')[-1] + '.jpg', 'wb') as f: # 将图片保存到文件根目录
                f.write(pic) # 写入图片
                f.close()

运行完之后看一下文件根目录,可以看到图片已经被下载下来了。


Python爬虫之爬取百度贴吧帖子内的图片_第5张图片

是不是很简单?
不过这里只下载了第一帖的图片,还有第二页,第三页...如何下载?

翻页功能

这里我们回到帖子第一页,拉倒最下面点击第二页,观察URL的变化


地址变为了 http://tieba.baidu.com/p/4629627483?pn=2
对比一下第一页 http://tieba.baidu.com/p/4629627483
多了一个参数 pn
我们把 2 改为 3,是不是就可以跳转到第三页, 试一下
Python爬虫之爬取百度贴吧帖子内的图片_第6张图片

成功跳转,这证明我们的猜想是正确的,那这就非常简单了。
只需要将参数值修改一下,就可以实现翻页功能。
直接看最后的代码

# 导入所需要的库
import requests 
from bs4 import BeautifulSoup
for i in range(3):
    url = 'http://tieba.baidu.com/p/4629627483' + '?pn=' + str(i) # 帖子地址
    html = requests.get(url)  # 用 get 方法发送请求,返回 response 保存到变量 html
    soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 库解析网页源代码
    for eve_url in soup.find_all('img', class_='BDE_Image'): # 在网页源代码中找到所有图片地址
        img_url_list = [] # 定义一个空列表,用于保存图片地址
        img_url_list.append(eve_url['src']) # 将每张图片的地址添加到列表当中
        for eve_url in img_url_list:
            pic = requests.get(eve_url).content # 因为图片是以二进制存储的,所以这些要用 content
            with open(eve_url.split('/')[-1], 'wb') as f: # 将图片保存到文件根目录
                    f.write(pic) # 写入图片
                    f.close()

到这里就结束了,其实这几行代码一点也不 Python。
可以把这些功能比如获取网页源代码、保存图片封装成函数,在主函数里调用。
emmm,那我还是封装一下吧,反正外卖也没到。

import requests
from bs4 import BeautifulSoup

imgUrls =[] #存放所有图片的URL

def get_Html_ImgUrl(url):
    '''
    获取网页的源代码和图片的地址
    存放在imgUrls这个列表里
    '''
    #获取网页源代码
    headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
    html = requests.get(url, headers=headers)
    html.encoding = 'utf-8'
    soup = BeautifulSoup(html.text, 'lxml')
    #获取图片的地址并且存放在imgUrls列表里
    for i in soup.find_all('img', class_='BDE_Image'):
        imgUrls.append(i['src'])

def save_img():
    #保存图片
    for i,url in enumerate(imgUrls):
        pic = requests.get(url).content
        with open('./'+str(i)+'.jpg', 'wb') as f:#保存至根目录下
             f.write(pic)
def main():
    url = 'http://tieba.baidu.com/p/4629627483?pn='
    for i in range(3):
        try:
            get_Html_ImgUrl(url + str(i))
        except:
            pass
    save_img()

if __name__ == '__main__':
    main()

欢迎加入计算机技术协会

你可能感兴趣的:(Python爬虫之爬取百度贴吧帖子内的图片)