爬虫实战:女朋友的命令不得不立马安排
- 前言
- 数据来源
- 数据爬取
- 完整代码
- 后序
前言
今天俺女朋友说她想换情侣头像了,但是没有啥可选的图片,我说你先别急,等我一会儿。
我冲冲冲赶紧爬取了2w张图片,随她想咋挑就咋挑。
部分图片展示
数据来源
url:https://www.woyaogexing.com/
情侣专区:https://www.woyaogexing.com/touxiang/qinglv/
数据爬取
F12
:查看网页源代码
经过定位发现这里面分了许多类,每一个分类对应一个图片组,点开图片链接后,进入里面,发现有许多头像。
分析源代码:
每一张图片都有一个超链接:
首先我们要爬取每一分类的链接,之后再对每一个分类下的图片下载下来。
可以看到,每个分类的url都在 <a href=" ">
所以这里我们首先需要正则提取出所有分类的url。
<a href="(.*?)" class="img"
代码如下:
# 爬取我要个性网中情侣头像
import requests
import re
# 获取情侣头像分类链接
def getCategory(url):
# 获取请求对象
resp = requests.get(url)
# 设置编码
resp.encoding = resp.apparent_encoding
# 打印访问请求状态码200
print(resp.status_code)
# 跨行匹配所有字符
# pattern = re.compile('class="txList ".*?href="(.*?)"', re.S)
pattern = re.compile('<a href="(.*?)" class="img"')
# print(resp.text)
# 打印分类的链接
result = re.findall(pattern, resp.text)
print('分类链接数:', len(result))
print('分类链接:')
print(result)
return result
成功提取到所有分类的url
。
接下来就可以下载每一个分类中的所有图片了。
分析源代码
每一个分类下的图片链接都在 <img class="lazy" src=">
里面。
所以这里我们首先需要正则提取出所有图片的url。
<img class=“lazy” src="(.*?)"
def saveImg(links):
num = 1
for link in links:
# 获取请求对象
resp = requests.get('https://www.woyaogexing.com' + link)
# 设置编码
resp.encoding = resp.apparent_encoding
# 打印访问请求状态码200
print(resp.status_code)
# 跨行匹配所有字符
pattern = re.compile('<img class="lazy" src="(.*?)"')
# print(resp.text)
# 打印分类的链接
imgLinks = re.findall(pattern, resp.text)
print(imgLinks)
成功提取到所有图片的url。
接下来就可以下载所有图片了。
# 遍历图片的url
for imgLink in imgLinks:
resp = requests.get('https:' + imgLink)
with open('./headportrait/%d.jpg'%num, 'wb') as fin:
fin.write(resp.content) # 写入图片二进制
print('正在下载第%d图片'%num + "http:" + imgLink)
num += 1
结果展示如下:
至此,图片已经成功下载至本地。代码提升和优化的空间还很大。我只是实现了基本的功能。
完整代码
# 爬取我要个性网中情侣头像
import requests
import re
# https://www.woyaogexing.com/touxiang/qinglv/2021/1142219.html
# 获取情侣头像分类链接
def getCategory(url):
# 获取请求对象
resp = requests.get(url)
# 设置编码
resp.encoding = resp.apparent_encoding
# 打印访问请求状态码200
print(resp.status_code)
# 跨行匹配所有字符
# pattern = re.compile('class="txList ".*?href="(.*?)"', re.S)
pattern = re.compile('<a href="(.*?)" class="img"')
# print(resp.text)
# 打印分类的链接
result = re.findall(pattern, resp.text)
print('分类链接数:', len(result))
print('分类链接:')
print(result)
return result
def saveImg(links):
num = 1
for link in links:
# 获取请求对象
resp = requests.get('https://www.woyaogexing.com' + link)
# 设置编码
resp.encoding = resp.apparent_encoding
# 打印访问请求状态码200
print(resp.status_code)
# 跨行匹配所有字符
pattern = re.compile('<img class="lazy" src="(.*?)"')
# print(resp.text)
# 打印分类的链接
imgLinks = re.findall(pattern, resp.text)
print(imgLinks)
# 遍历图片的url
for imgLink in imgLinks:
resp = requests.get('https:' + imgLink)
with open('./headportrait/%d.jpg'%num, 'wb') as fin:
fin.write(resp.content) # 写入图片二进制
print('正在下载第%d图片'%num + "http:" + imgLink)
num += 1
if __name__ == "__main__":
# 访问地址
url = 'https://www.woyaogexing.com/touxiang/qinglv/'
# 获取情侣头像各个分类的链接
links = getCategory(url)
saveImg(links)
后序
该内容还有很多,接下来可以遍历所有页,数据量很大,大约2w张图片,经过分析发现每一页的url类似,所以直接for循环重复以上代码就可以。
url:/touxiang/qinglv/index_num.html
注意:一定要拼接url,在前面加上’https://www.woyaogexing.com’
正则表达式:请参考 程序员必学的《正则表达式》
爬虫基础:请参考 小白必学的爬虫基础
Thanks♪(・ω・)ノ
感谢女朋友这多年的陪伴与支持!LOVE YL (* ̄︶ ̄)
加油!
努力!
感谢!