前言:这篇文章在大一刚入学的时候就完成了,当初刚入门 Python 爬虫不久。现在回头看看这代码,写得什么鬼屎玩意儿。趁着周六,把这代码修改一下。
准备工作
环境
系统: Windows10 x64
编辑器: Vscode
需要的知识
这篇文章讲的是 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()
欢迎加入计算机技术协会