python爬虫利用requests和BeautifulSoup爬取美女图片
今天给大家分享一篇利用python爬取美女图片的文章
环境准备
开发环境:Windows 7
开发工具:Pycharm
python版本:python3.7
第三方库:requests,Beautifulsoup
网站源码分析
首先在chrome浏览器中打开帅啊网里面的美女类别下的网址:http://www.shuaia.net/meinv/,打开后会看到各种类型的美女,随便选择一个类别点进去后是一个包含了多张美女图片的详情页面,那么我们最终要爬取的就是美女详情下面的所有的美女图片。
那么当我们随便点击一个美女类别时,会跳转到另外一个详情页面,做过web开发的朋友应该都知道,这种一般都是通过超链接来实现的,在html代码里对应的也就是a标签。接下来我们就需要找到这些a标签,然后模拟浏览器请求这些链接并获取链接详情页面中的美女图片。
再回到网站的美女列表页,随便选择一个类别然后右键单击检查,这时浏览器会打开一个html源码的窗口,并且自动定位到你所选类别的html代码,通过分析我们会发现每个类别都会由一个a标签包裹,并且每个标签都有个共同的属性,就是每个标签都有一个的class类且值都为“item-img”,这样我们就可以通过定位到class=“item-img”的a标签来找到所有类别的链接地址了。
同理,我们进入到美女的详情页面,通过同样的方式会发现每张图片都有由一个img标签组成,只要我们找到所有的img标签即可,但是后面真正操作起来会发现如果只是通过img标签来过滤的话,一些我们不需要的图片也会被爬取下来,这时我们就需要去分析我们要下载的图片有哪些共同的特性,然后用这些共同的特性再进行过滤,把不需要的图片过滤掉。如果从img本身找不到不同的地方,那么可以尝试着从img标签的上一层或再上一层标签进行分析,直到能够找到不同为止。
关键代码及思路解析
- 首先我们通过第三方requests库去请求美女列表的地址:http://www.shuaia.net/meinv/,然后将请求回来的源码发送给BeautifulSoup,通过buautifulsoup的findall方法找到所有的class=“item-img”的a标签并保存的一个变量中
req = requests.get("http://www.shuaia.net/meinv/") bs = BeautifulSoup(req.text,'lxml') target_urls = bs.find_all('a',class_'item-img') -
循环遍历并请求爬下来的url地址,这时也就是跳转到详情页的那步。通过分析会发现每张图片都是一个img标签,那么刚刚上面说过如果只通过img标签去过滤的话可能或抓取出一些我们并不想要的图片,所以这里取得是img标签的父父级p标签,因为它们都有一个共同的属性:class=“ql-align-center”,而其它不需要的图片没有这个属性,这样我们就可以只过滤出我们想要的图片了。
for url in target_a: req1 = requests.get(url.get('href')) bs1 = BeautifulSoup(req1.text,'lxml') img_urls = bs1.find_all('p',class_='ql-align-center') -
继续遍历每个图片地址,下载图片并保存到本地文件夹中。
for img_url in img_urls: resp = requests.get(img_url.a.img.get('src')) name = random.randint(1,100000) with open('images/meinv_%s' % str(name),'wb') as f: f.write(resp.content)
完整代码
import requests
import os
import random
from bs4 import BeautifulSoup
def get_shuaia_meinv():
#创建images文件夹
if 'images' not in os.listdir():
os.mkdir('images')
#请求头设置,绕过网站的反爬机制
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
headers={'User_Agent': user_agent }
#爬取1-3页的所有美女
for index in range(1,4):
if index == 1:
mn_url = "http://www.shuaia.net/meinv/"
else:
mn_url = "http://www.shuaia.net/meinv/index_%d" % index
# STEP 1 获取列表页面中的所有连接
req = requests.get(url = mn_url,headers = headers)
req.encoding = 'utf-8'#设置编码格式
bs = BeautifulSoup(req.text,'lxml')
target_urls = bs.find_all('div',class_='item-img')
# STEP 2 获取详情页面中所有图片的地址
for img_url in target_urls:
req1 = requests.get(url = img_url.get('href'),headers = headers)
bs1 = BeautifulSoup(req1.text,'lxml')
img_urls = bs1.find_all('p',class_='ql-align-center')
# STEP 3 保存图片到本地
for url in img_urls:
try:
resp = requests.get(url.a.img.get('src'),headers = headers)
name = random.randint(1,100000)#生成一个1到100000的随机数
with open('images/meinv_%s' % str(name),'wb') as f:
f.write(resp.content)
print("正在下载美女:%s" % url.a.img.get('src'))
except Exception as e:
print("下载出错了。。。。")
if __name__ == '__main__':
get_shuaia_meinv()
到此就实现了简单的图片爬虫了。
如果有任何疑问或任何错误,欢迎评论留言。
更多推荐
所有评论(0)