通过PYTHON爬虫爬取明星的照片和资料
- 一.准备工作
- 1.选择合适的网站
- 2.安装MongoDB数据库
- 3.导入依赖库
- 二.开始爬虫
一.准备工作
1.选择合适的网站
这次爬虫的目的,是为了为人脸识别项目提供足量的数据集。所以要求目标网站必须符合:
- 明星信息齐全(至少包含正脸照片和姓名)
- 网站结构简洁,利于格式化爬取。
通过不断的排查,最终锁定粉丝网。随手打开一位明星
发现信息齐全,并且域名非常有规律,只要改变s后面的数字,即可分分钟爬取成千上万的数据,就决定是你了!
2.安装MongoDB数据库
这么大量的数据需要用数据库来合理的储存,我们选择MongoDB来进行,因为它上手简单并且可以使用Python中的pymongo库操作。
安装过程请教百度喔
安装完成后我们选择robo 3T来可视化我们的数据库,界面如下:
非常的简洁明了!
3.导入依赖库
import requests
import sys
import re #用于正则化操作
from lxml import etree
#上述用于爬虫
import pymongo as pm #链接mongoDB
二.开始爬虫
首先我们链接数据库
client = pm.MongoClient()
db = client['face'] #访问数据库
collection = db['my_face'] #访问表
如果数据库和表不存在则会自动创建
接着我们构建请求头,来躲过网站的反爬虫机制。
headers = {'Referer':'https://accounts.pixiv.net/loginlang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
for j in range(1,5000):
content1 = requests.get('http://star.ifensi.com/s{}/'.format(j),headers=headers).text
# print(content1)
root1 = etree.HTML(content1)
# print(root1)
href1 = root1.xpath('//div[@class="hbox clearfix"]/div[@class="hd_1"]/img') #定位到img标签
name = root1.xpath("//h1[@class='t1']/text()") #获得明星的名字
birth = root1.xpath("//p[@class='t2'][1]//text()") #获得明星的身高和生日
data = {}
try:
data["name"] = name[0] #这一步是为了排除无法访问的网站,如果网站无法访问直接进入下一循环
except:
continue
data["id"] = j
for i in range(len(birth)):
birth[i] = birth[i].replace("\xa0","") #去空格
hanzi,number = re.findall('(.*):(.*)',birth[i])[0] #分别提取出key和value
data[hanzi] = number #在字典中创建键值对
img_url = href1[0].attrib["src"] #获取图片的url
response = requests.get(img_url,headers=headers)
img = response.content
with open( 'faces/{}.jpg'.format(j),'wb' ) as f:
f.write(img) #将图片保存到faces文件夹
data["path"] = 'faces/{}.jpg'.format(j) #保存相对路劲
collection.insert_one(data) #将字典插入到表中
正式开始爬虫操作,需要先在当前目录下创建faces文件夹,获得的明星照片会保存在这个目录。我们期望获得5000位明星的数据。
代码将在数据库中写入以下4个数据:
- ID(与保存的图片序号一致)
- 明星姓名
- 明星身高
- 明星生日
- 该明星照片的相对路径
大功告成!