转载请注明作者和出处:
https://blog.csdn.net/qq_45627785?spm=1011.2124.3001.5343
运行平台:Windows
Python版本:Python 3.x
前言
预备知识
实战
0.背景
1.requests安装
2.爬取单页目标链接
3.爬取多页目标链接
4.整体代码
总结
0 前言
主要是刚复习完Python的知识,想做一点东西出来。之前其实就有了做爬虫的心思,但是爬什么呢,这也是个问题。看到网上有许多爬妹子图的,那我就来爬爬哥哥图趴(笑)。常言道,看哥哥可以美容养颜,延年益寿。那么,我们今天就来爬爬趴!
1预备知识
为了能快速上手写代码,我们要先来了解下我们这次爬虫代码所需要的第三方库:BeautifulSoup和requests。
安装:直接 win + R打开CMD 然后在命令行提示符后输入pip install BeautifulSoup4 一般就可以了,如果遇上各种问题,请自行百度关键词解决,安装requests也是打开CMD,然后在命令行提示符后输入 pip install requests即可。
库的具体用法:https://pypi.org/在其中查看即可,如想看中文教程,浏览器里直接查询相应库的用法,也会有很多教程的。
2实战
2.1背景
爬取《哇图》网的帅哥图片!
URL : http://www.walltu.com/sg/
先看一眼网站的样子:
2.2爬取单页目标链接
首先,我们先来爬取 “明星帅哥” 这一页的网址,打开它的源代码,我们可以看到其中图片的源代码<img>标签中的SRC属性下,我们顺利成章的找到了图片的网址,那我们来看一下代码。
代码:
#导入所需要的库
from bs4 import BeautifulSoup
import requests
import os
from urllib.request import urlretrieve
n = 0
list_url = []
url = 'http://www.walltu.com/tuku/mingxingshuaige/'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
}
req = requests.get(url=url, headers=headers)
req.encoding = 'utf-8'
html = req.text
bf = BeautifulSoup(html, 'lxml')
img_url = bf.find_all("img")
#获取图片链接
for each in img_url:
list_url.append(each.get('src'))
#创建文件
if not os.path.exists('./imgs'):
os.mkdir('./imgs')
#用循环将图片链接转化为图片
while n < (len(list_url)):
img_url = list_url[n]
urlretrieve(img_url, './imgs/%s.jpg' % n)
n = n + 1
print("下载完成")
然后,我们来看一下运行效果趴......
ok, 此时我们可以看到,明星帅哥图已经爬下来啦!(鸡冻)
代码的主体木有问题,就是在保存文件时参数携程了 'Desktop' ,这就导致了下载在桌面上的文件只有一个,且没有以图片形式保存,我还以为我的代码出了神马灰常严重的问题,多亏扎克斯大佬指出,再次向大佬献上我的膝盖。那么我们来看下扎克斯大佬关于爬取明星帅哥这页的图片的代码......
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
import os
url = "http://www.walltu.com/tuku/mingxingshuaige/"
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'lxml')
# 通过id找到图片主体
p = soup.find("p", {'id': 'l'})
imgs = p.find_all("img")
#创建文件
if not os.path.exists('./imgs'):
os.mkdir('./imgs')
#用for循环得到src
for i in range(len(imgs)):
src = imgs[i]['src']
#直接用get().content得到图片内容并将其写入文件
try:
with open('./imgs/%s.jpg' % i, 'wb') as f:
f.write(requests.get(src).content)
except Exception as e:
continue
相对来说确实是很简洁了.......
2.3爬取多页图片链接
虽然爬一页是成功了,但这一页的帅哥肿么能满足我们呢(笑),我们的目标是所有标签里的首页帅哥(见下图)
那我们先来看一下源代码:
通过代码,我们可以看到<p id = "q">是上述链接的主体,那我们写代码就有了思路:
#导入需要的库
from bs4 import BeautifulSoup
import requests
import os
from urllib.request import urlretrieve
n = 0
s = 0
list_url = []
url_1 = []
url = 'http://www.walltu.com/sg/'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
}
req = requests.get(url=url, headers=headers)
req.encoding = 'utf-8'
html = req.text
soup = BeautifulSoup(html, 'lxml')
#通过id得到标签主体的url
p = soup.find("p", {'id': 'q'})
content = p.find_all('a')
for i in content:
url_1.append(i.get('href'))
#得到上面标签中每一页的url
while s < (len(url_1)):
url = url_1[s]
s = s + 1
real_url = 'http://www.walltu.com' + url
req = requests.get(url=real_url, headers=headers)
req.encoding = 'utf-8'
html = req.text
soup = BeautifulSoup(html, 'lxml')
img_url = soup.find_all("img")
for each in img_url:
list_url.append(each.get('src'))
#创建文件
if not os.path.exists('./imgs'):
os.mkdir('./imgs')
#得到并下载每一张图片
while n < (len(list_url)):
img_url = list_url[n]
try:
urlretrieve(img_url, './imgs/%s.jpg' % n)
except Exception as e:
print(img_url)
n = n + 1
print("下载完成")
ok,让我们看下运行效果
哦豁,5分钟之内,1345张各式各样的帅哥到位,效果拉满哇!
总结
这次的网站总体来说结构比较简单,也没有涉及到反爬什么的,也不用增加代理ip, 休眠时间什么的......编写的过程中,不是很建议用循环,循环涉及到覆盖的问题,而且循环也容易把自己绕晕,索引的值也需要注意。不如扎克斯大佬直接get().content比较简单。总的来说,爬到哥哥们还是很开心哒,人生寂寞如雪,唯有帅哥(图片)永相随哇!!!