爬虫练习一:爬取睿奢图片

编程入门 行业动态 更新时间:2024-10-25 02:28:30

<a href=https://www.elefans.com/category/jswz/34/1770264.html style=爬虫练习一:爬取睿奢图片"/>

爬虫练习一:爬取睿奢图片

爬取网站:睿奢-套装合集-私房定制

目标:爬取并保存该网站分类下每个主题的所有图片

python版本:python 3.6

使用库:urllib,Beautifulsoup,os,random,re,time

 

对网站进行访问查看

首先需要通过浏览器对目标网站进行访问,了解该网站的页面跳转逻辑。

要获得想要爬取的图片,有以下两个步骤:

1. 通过链接打开网页,不需要登陆就可以看到该分类下所有主题的图片。

2. 随便点击一个主题,比如“告白气球”,即跳转入对应的“告白气球”主题详情页面,这个页面一次性展示了“告白气球”主题下所有的图片。每个详情页面下的所有照片就是本次爬取目标。

 

编写代码

1. 通过睿奢-套装合集-私房定制 总揽页面,获得每个图片主题对应的名称和图片详情页url

1)对该总揽页面进行元素检查,发现主题的名称和详情页url直接在源代码中明文展示,并没有用上异步加载或是使用接口传输数据等方式

因此,直接获取网站元素后进行解析即可提取想要的数据。

2)该总揽页面可以进行翻页,总共有5页。对比翻页前后页面的url发现,只需要对url最后一个数据做替换即可得到翻页后的url

第一页:.php?tid=47&TotalResult=90&PageNo=1

第二页:.php?tid=47&TotalResult=90&PageNo=2

3)实现

orig_url = '.php?tid=47&TotalResult=90&PageNo='
# 实现翻页,page_url是每次翻页后页面的url
for n in range(1, 6, 1):page_url = orig_url + str(n)def get_girl_url(page_url):headers = {'User_Agent': get_userAgent()}# 使用随机User-Agent,通过urllib获取该网页的元素url = urllib.request.Request(page_url, headers=headers)page = urllib.request.urlopen(url).read()# 使用Beautifulsoup进行解析soup = BeautifulSoup(page, 'html.parser')# url_info包含每个主题对应的图片详情页urlurl_info = soup.find_all('a', class_="img js-anchor etag noul")# girl_info包含每个主题对应的名称girl_info = soup.find_all('img', class_="etag js-img bdc4 bds0 bdwa")return url_info, girl_info

2. 通过每个主题的图片详情页url获得该主题下使用图片,并保存至对应文件夹

1)从总揽页面获取的每个主题详情页的url地址,不能直接进行访问。需要在url前加上''后才可以正常访问

2)对详情页进行元素检查,所有图片的对应url都在页面源代码中明文保存。处理方式同总揽页,直接从源代码进行提取

3)详情页获得的每张图片的url,也不完全。需要在url前加上''后才可以正常访问

4)实现

def get_each_girl(url_info, girl_info, path):for i in range(len(url_info)):# 当前主题对应详情页urlinfo_url = '' + str(url_info[i]['href'])# 当前主题对应名称girl_name = girl_info[i]['alt']# 设置保存路径,路径为本地指定文件夹。单个主题的所有图片保存在一个子文件夹内download_path = path+str(girl_name).replace(' ','')+'/'if not os.path.exists(download_path):os.makedirs(download_path)page = urllib.request.urlopen(info_url).read()# 暂停4stime.sleep(4)soup = BeautifulSoup(page, 'html.parser')# 得到每张照片的urlphoto_url = soup.find_all('img')i = 0for each in photo_url:try:# 修正为可访问的url,并使用urllib保存至本地img_url = '' + re.findall('src="(\S+)"', str(each))[0]urllib.request.urlretrieve(img_url, download_path+str(i)+'.jpg')i += 1print(girl_name, '第', i, '张 done')except:print('passed')path = '/Users/asdfgh/Desktop/ruishe/'

3. 全部代码

import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import random
import re
import os
import time# 访问网页时随机选取一个User-Agent
def get_userAgent():agent = ['Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50','Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11','Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)','Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)','Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36']return agent[random.randint(0, 5)]def get_girl_url(page_url):headers = {'User_Agent': get_userAgent()}# 使用随机User-Agent,通过urllib获取该网页的元素url = urllib.request.Request(page_url, headers=headers)page = urllib.request.urlopen(url).read()# 使用Beautifulsoup进行解析soup = BeautifulSoup(page, 'html.parser')# url_info包含每个主题对应的图片详情页urlurl_info = soup.find_all('a', class_="img js-anchor etag noul")# girl_info包含每个主题对应的名称girl_info = soup.find_all('img', class_="etag js-img bdc4 bds0 bdwa")return url_info, girl_infodef get_each_girl(url_info, girl_info, path):for i in range(len(url_info)):info_url = '' + str(url_info[i]['href'])girl_name = girl_info[i]['alt']# 保存路径download_path = path+str(girl_name).replace(' ','')+'/'if not os.path.exists(download_path):os.makedirs(download_path)page = urllib.request.urlopen(info_url).read()# 暂停4stime.sleep(4)soup = BeautifulSoup(page, 'html.parser')photo_url = soup.find_all('img')i = 0for each in photo_url:try:img_url = '' + re.findall('src="(\S+)"', str(each))[0]urllib.request.urlretrieve(img_url, download_path+str(i)+'.jpg')i += 1print(girl_name, '第', i, '张 done')except:print('passed')path = '/Users/asdfgh/Desktop/ruishe/'
orig_url = '.php?tid=47&TotalResult=90&PageNo='for n in range(1, 6, 1):page_url = orig_url + str(n)url_info, girl_info = get_girl_url(page_url)get_each_girl(url_info, girl_info, path)

 

实现效果

 执行代码后,成功爬下网站该分类下所以主题的图片,并保存在本地文件夹中。

总结

该网站的结构简单,也没有看到使用什么反爬手段。所以简单使用urllib库进行网页访问和beautifulsoup进行解析就可以获得想要爬取的数据。

这次练习的收益在于:

1)将学习到的爬虫抓取思想运用在实际抓取中,在运用中进行理解

比如:编写一个爬虫的流程/方法论,可以用哪些方法来找到应该从哪里获取我们想要获得的数据。

2)熟悉urllib和beautifulsoup库的基本使用

反思:

1) 完成这个练习的要求很低,仅仅是一个入门练习。还需要尝试更多更难的练习

2)从实际业务来考虑,编写爬虫爬取数据至少是需要一个目的的,即在什么前提下为了满足什么需求才需要进行数据爬取、爬取后数据如何存储/进一步处理

3)伪造请求头是一个很有效的反反爬的方法。需要深入练习

转载于:.html

更多推荐

爬虫练习一:爬取睿奢图片

本文发布于:2024-02-11 22:44:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1684024.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爬虫   图片   爬取睿奢

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!