ISEE小语
本次通过requestium和BeautifulSoup这两个三方包,组合高效的爬取图网的图片。
requestium是用于简化使用requests和Selenium库进行web自动化测试和爬虫任务的开发。它提供了一个易于使用的API,同时结合了requests库的简洁性和Selenium库的功能强大性。
BeautifulSoup是用于从HTML或XML文档中提取数据的工具。它提供了一种简单且灵活的方式来解析和遍历网页内容,使得数据提取和处理变得更加容易。
环境:
Pycharm
Python 3.9.16
安装:
pip install requestium==0.3.0
pip install beautifulsoup4==4.12.2
注:爬虫需要的包,没有的话可以去自行下载。直接用pip安装即可。
导入:
import re
from requestium import Session
from bs4 import BeautifulSoup
(左右滑动查看完整代码)
1 网站地址
首先,先确定网站地址
# 网图地址
base_url = 'http://www.netbian.com'
(左右滑动查看完整代码)
再根据自己的需要的分类资源去进入分类首页面,本次以【动漫】分类为例,就爬取这个了。
# 根据自己的需要的分类资源,本次以【动漫】分类为例
sub_class = 'dongman'
# 定义分类的首页,爬取相应资源
url = f'{base_url}/{sub_class}/'
(左右滑动查看完整代码)
2 头信息
头信息,即headers信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
(左右滑动查看完整代码)
headers可以在浏览器中获取,打开浏览器,按下F12键,输入网站链接,在Network中可以看到。
3 创建会话
使用requestium库,首先需要创建会话对象
# 创建一个会话对象
ses = Session()
ses.headers.update(headers)
(左右滑动查看完整代码)
4 获取页面内容
获取【动漫】分类首页的页面内容
# 获取页面内容
resp = ses.get(url, headers=headers)
resp.raise_for_status()
resp.encoding = resp.apparent_encoding
html_content = resp.text
print(html_content)
(左右滑动查看完整代码)
结果:
5 获取图片链接
爬取第一页所有图片的链接,并将含有https的链接直接剔除掉,组成完整的有效链接
# 获取图片链接
url_list = []
soup = BeautifulSoup(html_content, 'html.parser')
sp = soup.find_all('div', class_="list")
# 用正则表达式提取链接
url_all = re.findall(r'a href="(.*?)"', str(sp))
for i in url_all:
# 优化一下所获得的链接,将含有https的链接直接剔除掉
if 'https' in i:
continue
# 在获取的链接中添加前缀(就是主网站的链接),组成完整的有效链接
url_list.append(base_url + i)
print(url_list)
(左右滑动查看完整代码)
6 下载并保存
打开第一页所有图片的链接,并以二进制形式返回结果,给图片赋予名字,保存到相应文件夹下,可以看一下效果
for index, _url in enumerate(url_list):
sleep(3)
# 获取页面内容
resp = ses.get(_url, headers=headers)
resp.raise_for_status()
resp.encoding = resp.apparent_encoding
html_content = resp.text
soup = BeautifulSoup(html_content, 'html.parser')
pic_soup = soup.find('div', class_="pic")
pic_url = re.findall(r'lay-src="(.*?)"', str(pic_soup))[0]
# 打开图片链接,并以二进制形式返回结果
pic = ses.get(pic_url).content
# 给图片赋予名字及保存到相应文件夹下
image_name = '动漫模块:' + '第{}页'.format(1) + str(index + 1) + '图.jpg'
image_path = './pictures' + '/' + image_name # 定义图片保存的地址
with open(image_path, 'wb') as f: # 保存图片
f.write(pic)
print(image_name, '下载完毕!!!')
(左右滑动查看完整代码)
pictures文件夹内:
爬取代码实现,注重两点,
一是:
加一个等待3s的时间,防止频繁请求网站,被禁止访问!
time.sleep(3)
二是:
给图片赋予名字及保存到相应文件夹下,提前需要在代码当前目录下新建文件夹pictures,使用的时候这个可自定义
# 给图片赋予名字及保存到相应文件夹下
image_name = '动漫模块:' + '第{}页'.format(1) + str(index + 1) + '图.jpg'
image_path = './pictures' + '/' + image_name # 定义图片保存的地址
with open(image_path, 'wb') as f: # 保存图片
f.write(pic)
print(image_name, '下载完毕!!!')
(左右滑动查看完整代码)
7 总结
以上实例针对图网的第一页,第二页及之后的链接有一点点变化。在源码中进行了添加,有兴趣可以看源码。
源码将以上共用的方法做了封装,更加清晰,更加方便使用!
有需求的朋友可自取哟
后台回复“tuwang_spider”即可获取~!
寄语:世间三美,明月,清风,眼前……
看到这儿的朋友帮点个“赞”和“在看”,谢谢支持~!
文章就分享到这儿,喜欢就点个赞吧!