接上一篇文章,这边文章介绍一下BeautifulSoup爬虫的操作流程。
备注:目的还是爬取相关人物目标的图片数据集
本文还是以https://www.jiepai.net/网站图片爬取为例。
1、首先对网站进行一个简单分析,结合目的本身,由于本需求重点关注的是人脸相关数据,所以选取网站上的明星穿衣子网页作为重点爬取对象(https://www.jiepai.net/dapei/mingxingchuanyi)。因为BeautifulSoup主要是对html文件格式进行的解析,所以还是需要借助requests库来获取对应网页的HTML内容。在进行编码之前需要安装如下两个库
pip install beautifulsoup4 pip install lxml
2、分析该网页(https://www.jiepai.net/dapei/mingxingchuanyi),可以发现该网页是分页展示的,并且每一页都包含很多对象的素材,因此第一要务就是要获取所有的对象连接
本人爬取的时候,该网页已经有607页,该网站是再持续更新中。。。
2.1、这个页码是可以通过解析获取的,具体操作如下:
打开网页,找到下面页码的位置,点击F12,并且右键点击页码位置,选择菜单栏中的“检查”选项。即可找到页码对应的HTML代码位置,进行解析,即可获得相关的html代码
在本文的操作中,直接对页码进行写死,循环607次(与上一博客一致)
domain = "https://www.jiepai.net/dapei/mingxingchuanyi"
for page_number in range(607): url = domain + "/" + "page" + "/" + str(page_number) response = requests.get(url)
主要区别在于对 html的解析,上一文章主要是通过正则表达式来实现对相关内容的解析,本文主要借助BeautifulSoup对 html结构进行解析。
2.2、每一页有24个对象(title)
首先对网站的具体内容进行分析,打开网页后,并且点击F12后,选择右键菜单栏的检查,找到对应title(本操作选择的是第二个title)对应的html代码
分析这段代码,找到该title对应的连接为https://www.jiepai.net/373413.html,所以需要从整个HTML代码中解析<a href="https://www.jiepai.net/373277.html" rel="nofollow" class="thumb-link">的内容。
对html进行分析,需要解析如下内容。
<a href="https://www.jiepai.net/373277.html" rel="nofollow" class="thumb-link">
通过BeautifulSoup库中的select方法来获取 属性为 thumb-link的所有<a></a>包含的内容
soup = BeautifulSoup(response.text, "lxml") title_info = soup.select('a.thumb-link')
for i in range(len(title_info)): title_url = title_info[i].get("href") title_list.append(title_url)
提取到的title_list如下所示:
https://www.jiepai.net/373420.html https://www.jiepai.net/373413.html https://www.jiepai.net/373403.html
3、对每个title连接进行解析,提取图片的连接(重点是对图片的爬取)
因为爬取图片的最终目的是进行图片处理,所以需要将每个title中所对应的人物名称(姓名)以及每张图片的网络连接进行解析出来。
3.1 每个title对应的人物名称的解析
打开title(https://www.jiepai.net/373413.html)分析人物名称出现的地方,并找到对应的html代码
考虑到每个网页的特征,多打开几个title进行对比分析,发现title人物对应的姓名的出现方式如下:
<a href="https://www.jiepai.net/tag/wuxuanyi" title="View all posts in 吴宣仪" target="_blank" class="tag_link">吴宣仪</a>
需要解析html中的所有包含tag_link属性的<a></a>标签的内容,实现代码如下所示:
user_name_list = []
user_info = soup.select('a.tag_link')
for i in range(len(user_info)): user_name = user_info[i].text user_name_list.append(user_name)
3.2、对每个网页包含的所有子网页进行解析
子网页的内容如下所示:
<a href="https://www.jiepai.net/373250.html/3" class="post-page-numbers">
因此,可以通过查询属性为post-page-numbers的<a></a>标签获得。
具体代码如下所示:
page_info = soup.select('a.post-page-numbers')
for i in range(len(page_info)): page_url = page_info[i].get("href") page_list.append(page_url)
注意:这里有种特殊情况,就是只存在一个页面的情况。考虑到兼容性的问题,故做如下处理
page_info = soup.select('a.post-page-numbers') page_list.append(title_url)
for i in range(len(page_info)): page_url = page_info[i].get("href") page_list.append(page_url)
获取所有的人物名称以及对应的页面列表后,需要进一步解析页面列表,解析对应的图片url
3.3、解析图片url
在上述步骤获取对象对应的各个子页面后,需要对各个子页面进行解析,对每个图片进行检查,寻找对应的html源码段,形式如下
<img class="lazy alignnone size-full wp-image-373278 loaded lazy-loaded" src="https://www.jiepai.net/wp-content/uploads/2021/07/2021072215562192.jpeg" data-lazy-type="image" data-lazy-src="https://www.jiepai.net/wp-content/uploads/2021/07/2021072215562192.jpeg" alt="" width="940" height="1670" data-was-processed="true" style="cursor: zoom-in;">
所以对对象属性data-lazy-type值为"image"的img对象进行搜索查询,并且解析其中data-lazy-src的属性值
soup = BeautifulSoup(response.text, "lxml") pic_info = soup.select('img[data-lazy-type="image"]')
for j in range(len(pic_info)): pic_url = pic_info[j].get("data-lazy-src") image_url_list.append(pic_url)
以下步骤与上一文章的一致
4、通过上面三个步骤后,即可获得每个人物名称以及对应的图片连接(list)
4.1、建立每个人物对应的文件夹路径,并且要对文件夹路径进行存在与否判断,因为同一个人物可以对一个多个title,我们需要将同一个人物的图片保存到同一个文件夹目录下
root_path = "/virt/image_class/jiepai/image"
user_path = root_path + "/" + user_name
if not os.path.exists(user_path): os.makedirs(user_path)
4.2、下载图片
依据上面获取的图片连接,以及人物名称,将对应的图片下载到相应的文件夹目录下(为避免重复,对图片名称进行判断,如果存在,则不进行下载)
def downImg(imgUrl, dirpath, imgName): filename = os.path.join(dirpath, imgName) if os.path.exists(filename): print("the file is exists") return False
try: res = requests.get(imgUrl, timeout=15) if str(res.status_code)[0] == "4": #print(str(res.status_code), ":" , imgUrl) return False except Exception as e: #print("抛出异常:", imgUrl) #print(e) return False with open(filename, "wb") as f: f.write(res.content) return True
5、总结:
整个爬虫过程可以描述为:
①,解析所有的title
②,依据每个title解析对应的人物名称以及图片连接(为后续下载保存图片做准备)
③,对每个人物对应的图片进行下载保存。
6、本项目是为人脸识别做准备的,所以后续需要依据人脸识别的相关需求对上述图片数据集进行清洗。
完整代码见:https://download.csdn.net/download/reset2021/20477268
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试