爬取YOLOv3训练所需图片
在我们使用yolov3我们自己的模型前,我们需要准备很多张图片,一个一个下载太麻烦了,所以使用简单的爬虫来解决这个问题使用步骤
1.引入库
代码如下(示例):
import re
import requests
re库可以让我们使用正则表达式,这样子可以很快的找到我们要找的东西(解析网页)
requests库里面包含了爬虫的很多方法(不推荐使用urllib)
2.访问要爬取的网站
因为我是用yolov3训练识别口罩的,所以这里爬取的都为带有口罩的人
代码如下(示例):
url = 'https://699pic.com/jpg/daikouzhao.html'
headers = {"User-Agent":
"Mozilla/5.0 (compatible; MSIE 10.0; WindowsNT 6.1; WOW64; Trident/6.0; QQBrowser/7.7.24962.400)"}
#将python包装成浏览器,防止被防爬。这个可以在自己电脑里面的浏览器里面查到,右击网页空白地方,选择检查(同样查看源代码也是必须的)...进入下图中的页面。这个工具好像是叫抓包工具
html = requests.get(url=url, headers=headers)
#使用get方法进行访问,也有post方法,具体情况可以使用上面所说的抓包工具进行选择
#<img alt="职业劳动者戴口罩抗疫复工高清图片" title="职业劳动者戴口罩抗疫复工图片下载" class="lazy" src="//static.699pic.com/images/blank.png" data-original="//img95.699pic.com/photo/50159/9753.jpg_wh300.jpg" data-original-srcset="//imgs.699pic.com/01/501/599/753/501599753.jpg!list2x.v1 2x" width="1062.3160892264" height="300" />
findlink = re.compile(r'<img alt=.*?data-original="(?P<jpg>.*?)" .*?</a>', re.S)
#正则表达式,爬虫时都使用惰性模式即 .*?(匹配尽可能多的字符),可根据上面的例子进行分析
htmllink = findlink.finditer(html.text)
#在爬取返回的内容里面匹配上面的正则表达式
for i in htmllink:
print(i.group('jpg'))
if len(i.group('jpg')) == 49: #这里发现爬取的图片有些不符合要求就自己去掉了(好像爬的是广告的图)
print(i.group('jpg'))
!
这里面可以看到我们需要的东西,一般我们爬虫都是按照这个来伪装自己的。如果需要密码登录,我们可以使用cookies,有防盗链,我们就添加referer
3.将爬取的图片链接进行存储
在存储图片之前我们需要得到照片的内容,按照上述操作,我们得到了子连接,想要获取里面的内容我们就还需要访问图片的链接
sonhtml = 'https:'+i.group('jpg')
#爬取的子连接为//img95.699pic.com/photo/50157/5121.jpg_wh300.jpg,所以要访问的话要加上https(如果爬取的是http就要在get或post里面加参数verify=false)
result = requests.get(url=sonhtml, headers=headers)
jpg_name = sonhtml.split("/")[-1]
#对文件进行命名,将连接进行划分,结果为5121.jpg_wh300.jpg
with open(jpg_name, mode="wb") as f:
f.write(result.content)
#以二进制写入文件,图片是由二进制组成的
print("下载成功")
4.综合爬取图片
上面的为爬取一页的图片,如果要爬很多呢?
我们对网址进行分析,下面都为同一页面的网址
url = ‘https://699pic.com/jpg/daikouzhao.html’
url = ‘https://699pic.com/soso/daikouzhao-complex------jpg—0–0.html’
经过尝试后发现下面链接的最后一位为页面数(其实正常情况理应如此)
def geturl():
for m in range(1, 2):
url = 'https://699pic.com/soso/daikouzhao-complex------jpg---0--'+str(m)+'.html'
headers = {"User-Agent":
"Mozilla/5.0 (compatible; MSIE 10.0; WindowsNT 6.1; WOW64; Trident/6.0; QQBrowser/7.7.24962.400)"}
findlink = re.compile(r'<img alt=.*?data-original="(?P<jpg>.*?)" .*?</a>', re.S)
url = url
html = requests.get(url=url, headers=headers)
htmllink = findlink.finditer(html.text)
for i in htmllink:
# print(i.group('jpg'))
if len(i.group('jpg')) == 49:
#print(i.group('jpg'))
sonhtml = 'https:' + i.group('jpg')
result = requests.get(url=sonhtml, headers=headers)
jpg_name = sonhtml.split("/")[-1]
with open(jpg_name, mode="wb") as f:
f.write(result.content)
print("下载成功")