序言
每个人都需要互相帮助,而我要做的就是把它呈现出来让大家看到。
比如:你背不下来的书,总有人能背下来,你做不出来的题,总有人能做出来,你愿意拖到明天的事,总有人今天努力做完,那么抱歉,你想要的工作也只能别人干了,你想过的人生也只能别人过了!
师者传道授业解惑。传播的力量就是要把这些东西渗透下去,然后才能长出新的叶子。 共勉!
-实战
分析网站结构,确定我们要抓取的数据内容;
唯美图片就是追求绝对性的美感,强调超乎于生活中的纯粹性美感,是以不断追求形式完美及艺术技巧完美的展现,更高一层次就是让其脱离现实中的技巧美。
通过 Chrome 浏览器右键检查查看 network 并对网站结构进行分析;发现这个网页中蕴含的内容非常的多,如果只是单纯获取单个页面中的图片数据是非常简单的,但是 这是我们的风格吗?不是;绝对不是。即使是特别简单的逻辑,咱们也要变着花样的给它弄复杂,这就是Tony老师的编程;追求纯粹的技术。
希望能够为更多的编程从业者带来一些高质量的文章。
第一步:请求网络,获取服务器返回数据
不管三七二十一我们先获取到数据内容再说;因为在检测网站有否有反爬存在的唯一因素就是获取一下它的数据内容;看是否能够正常获取。
这里需要安装2个库:
pip install requests 网络请求库
pip install lxml 数据解析库
import requests
url='http://www.mmonly.cc/wmtp/'
html=requests.get(url).content.decode('gbk')
print(html)
接下来通过分析;看到该网站中的所有内容页数非常的多有1153页数据,所以我就想,如果只是简单的获取几页数据内容,这样确实非常的省事!但是我如果在抓取其他页面的话,岂不是还要担心它有没有那么多的数据;毕竟每一页的数据内容是不一样的; 这样 肯定不能满足我对于技术的渴望 ,那么......
第二步:解析数据
from lxml import etree
# 动态获取末页数据
page=etree.HTML(html).xpath('//a[@text="末页"]/@href')[0].split('_').split('.')[0]
# list_20_1153.html ---> 1152
print(page)
接下来在处理的时候,第一页数据和第二页数据的url是不同的;而单独获取是拿不到第二页及之后所有页面的数据;如此...只能拼接了。
http://www.mmonly.cc/wmtp/;
http://www.mmonly.cc/wmtp/list_20_2.html;
http://www.mmonly.cc/wmtp/list_20_3.html;
url_list=[]
url='http://www.mmonly.cc/wmtp/'
url_list.append(url)
html=requests.get(url).content.decode('gbk')
# print(html)
# 谓语
page=etree.HTML(html).xpath('//a[@text="末页"]/@href')[0].split('_').split('.')[0]
for item in range(2,int(page)+1):
url_list.append(url+'list_20_{}.html'.format(str(item)))
print(url_list)
到这里我们已经能够动态的获取到所有页面的链接了;很开心有没有👍;至此;我们已经跨越出了第一步;;之后,我们需要在次获取各个页面的图片详情页中为下一步的数据处理做准备。
for url_item in url_list:
img_url=etree.HTML(requests.get(url_item).text).xpath('//div[@class="ABox"]/a/@href')
print(img_url)
每个网站数据的突破,跟我们获取战利品一样。技术就是这样容易让人着迷。
接下来越来越有意思了! 我们需要再一次的对网站详情页进行分析;在分析的过程中我发现一件很有意思的事情;就是网站详情页的方式跟我们之前获取的方式很类似......emmmmmm🤣,这里就不详细阐述了!大家自己分析一下就知道了。
那么...为了让程序越来越好玩;接下来,我们换一种方式;
# 单个文件详情页中
def get_img_urls(img_urls):
html=requests.get(img_urls)
html.encoding='gbk'
data=etree.HTML(html.text)
# 标题
title=data.xpath('//div[@class="wrapper clearfix imgtitle"]/h1/text()')[0]
# 总的页数
page=data.xpath('//div[@class="wrapper clearfix imgtitle"]/h1/span/span[2]/text()')[0]
img['1']=data.xpath('//a[@class="down-btn"]/@href')[0]
print(title,page)
for item in range(2,int(page)+1):
text=requests.get(img_urls.replace('.html','_%s.html'%str(item))).text
img_url = etree.HTML(text).xpath('//a[@class="down-btn"]/@href')[0]
return title,img
第三步:数据存储
在下载数据这一块;考虑到我要下载的数据图片-->是原图,而很多图片的内存占比是不同的;倘若文件过大很有可能就会导致内存不足;我们在学习的时候,不用去考虑这一因素,但是 Tony 老师不这样想;因为如果有一天大家真正的学有所获,进入到了企业;这个时候是必须要考虑程序优化问题的;能够更好的让我们写出高质量的代码程序;这也是考验我们基本功是否真的扎实;我们在下载大文件时为了防止它占用过多的内存;于是我做了数据流的操作处理
# 下载图片
def download_pic(url,path,name):
# 判断
if os.path.exists(path):
pass
else:
os.mkdir(path)
response=requests.get(url)
if response.status_code==200:
with open(path+'/%s'%name,'ab')as file:
for data in response.iter_content():
file.write(data)
# 清空缓存
file.flush()
print('%s下载完成!'%name)
数据块处理
第四步:代码整理
for img_urls in img_url:
title, img=get_img_urls(img_urls)
for img_url_item in img.keys():
path='/Users/lucky/PycharmProjects/Module_Tony_Demo/Module_12_24/tony_img/%s'%title
download_pic(url=img_url_item,path=path,name='%s.jpg'%(title+img_url_item))