现在讲述python网络爬虫的资料已经很多啦,由于项目的需求,需要收集人脸相关数据集,于是便考虑用爬虫来补充部分数据集,下面将结合尚街拍(https://www.jiepai.net/)网站的具体爬虫过程来对python requests 具体爬虫过程进行梳理总结。
1、首先对网站进行一个简单分析,结合目的本身,由于本需求重点关注的是人脸相关数据,所以选取网站上的明星穿衣子网页作为重点爬取对象(https://www.jiepai.net/dapei/mingxingchuanyi)
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)
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">的内容。
具体实现title网络连接的代码为:
title_url_pattern = re.compile(r'''<a href="(.*)" rel="nofollow" class="thumb-link">''')
list_find_res = title_url_pattern.findall(response.text)
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>
因此可以用如下正则表达式来实现,代码如下:
user_pattern = re.compile(r'''<a.*?class="tag_link">(.*?)</a>''')
user_find_res = user_pattern.findall(response.text)
3.2、解析每个title对应的图片连接
通过对title网页进行检查分析,发现图片连接的形式如下
所以正则表达式如下:
image_url_pattern = re.compile(r'''data-lazy-src="(.*?)"''')
image_find_res = image_url_pattern.findall(response.text)
依据上述两个步骤,即可得到每个title对应的人物名称以及对应的图片连接list(每个title对应多张图片)
但是在具体爬取调试的过程过程中,发现有部分title的展现方式有所改变,是以页面的显示来展示不同图片的
3.3、于是需要对每个title页面进行子页面进行解析,如果存在多个子页面,则需要增加对每个子页面的图片解析,否则,则直接进行图片连接的解析,操作步骤与上面是一致的。
#<a href="https://www.jiepai.net/373250.html/3" class="post-page-numbers">
page_url_pattern = re.compile(r'''<a href="(.*?)" class="post-page-numbers"''')
page_url = page_url_pattern.findall(response.text)
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、本项目是为人脸识别做准备的,所以后续需要依据人脸识别的相关需求对上述图片数据集进行清洗。