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

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

准备工作

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


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

需要的知识

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

开始爬虫

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


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

基本思路

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

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

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

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

这个很简单,看图



图片地址就在箭头所指的方向。
那如何获取这个链接呢?
非常简单。
首先要获取整个页面的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']) # 打印出图片地址

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


第二步:保存图片

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

# 导入所需要的库
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()

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



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

翻页功能

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


地址变为了 http://tieba.baidu.com/p/4629627483?pn=2
对比一下第一页 http://tieba.baidu.com/p/4629627483
多了一个参数 pn
我们把 2 改为 3,是不是就可以跳转到第三页, 试一下

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

# 导入所需要的库
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()

欢迎加入计算机技术协会

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • 一、 女孩子是水做的。 女孩子生下来就是被宠的。 女孩子要富养。 女孩子可以撒娇。 女孩子可以胆小。 女孩子力气小...
    花生牛奶酱醋茶阅读 424评论 0 1
  • 于此第四年 破晓时离开 致我未及的欲望 与遗憾 我在图书馆巨大的玻璃幕墙后 翻来覆去地背诵 书本...
    一安焉阅读 687评论 15 23