本帖最后由 可控核聚变 于 2021-1-6 22:13 编辑
嗨!朋友们,大家好。我这两天在浏览魔镜原创摄影这个网站,里面有超多美丽可爱的小姐姐,都是一些街拍摄影大师的高质量作品,先上几张图look look。:lol
可是,这些都是小图,要看全套高清大图是要付费的,无奈我囊中羞涩,付不起这个钱(如果对这些作品感兴趣的朋友们也可以付费支持一下这些大师哦)。所以我只好把每个大师每个系列的展示图片爬下来,估计也有几千张图片,也能过过眼瘾了。
说干就干,代码一顿敲,终于找到图片地址了,准备下载!走你!
网页图片地址标签
嗯?不对,怎么获取到的是一堆,什么鬼?
我以为我标签搞错了,仔细反复检查了N遍,标签没问题呀,我又尝试获取同级标签下的其它标签属性,都能正确得到数据。唯独获取这个img src属性就给我来一堆这玩意:template/dsvue_black_gold/skin_img/t.gif
然后我就到Elements里面去搜索template/dsvue_black_gold/skin_img/t.gif 这串字符串哪来的?原来从这来的。
当我看到text/javascript这几个字时我就怂了,我没学过javascript呀,对javascript一窍不通,我只能上度娘查如何解决这个lazyLoadImg。原来这个叫懒加载模式(具体是什么我就不说了,可以网上查),很多帖子都说使用js_script可以解决,可我不会咋办咧?代码都敲了这么多行,就这样完蛋了,MD,我不甘心就这样被她征服,喝下她藏好的毒。
继续查,终于在CSDN上有一哥们说可以通过打印网页源码,对比文本,就能找到img标签中真正存放图片链接的属性。试试呗!
打印网页源码
通过对比网页源码文本,终于找到目标,就是这么简单。
找到真实的标签
OK,走起!
上全部代码:
[Python] 纯文本查看 复制代码 import requests
from lxml import etree
import re
import os
from faker import Factory
import ast
import random
class MoJing_Spider(object):
def __init__(self):
user_agent = []
for i in range(30):
f = Factory.create()
ua = "{{{0}}}".format("'User-Agent'" + ":" + "'{}'".format(f.user_agent()))
headers = ast.literal_eval(ua) # 使用 ast.literal_eval 将str转换为dict
user_agent.append(headers)
self.headers = random.choice(user_agent)
self.start_url = 'https://www.520mojing.com/forum.php' # 网站根地址
self.main_folder = r'/Volumes/魔镜街拍图' # 主路径
# print(self.headers)
# 解析主页
def data_range(self):
start_res = requests.get(url=self.start_url, headers=self.headers)
start_sel = etree.HTML(start_res.content.decode())
return start_sel
# 获取网址列表
def get_author_url(self, start_sel):
main_url_list = start_sel.xpath('//dt[@style="font-size:15px; margin-top:6px"]/a/@href')
return main_url_list
# 获取分区网址
def create_url(self, author_url):
author_res = requests.get(url=author_url, headers=self.headers)
author_sel = etree.HTML(author_res.content.decode())
try:
id = re.findall(r'https://www.520mojing.com/forum-(.*?)-1.html', author_url)[0]
len_page = author_sel.xpath('//span[@id="fd_page_top"]/div/label/span/text()')[0].replace('/ ', '').replace(' 页', '')
len_page = int(len_page)
name = author_sel.xpath('//div[@class="bm_h cl"]/h1/a/text()')[0]
print(f'=================正在保存{name}图片,共{len_page}页=================')
return name, id, len_page
except IndexError:
pass
# 获取每页图片链接
def get_pciturelinks(self, page_url):
picture_res = requests.get(url=page_url, headers=self.headers)
picture_sel = etree.HTML(picture_res.content.decode())
try:
pciture_links = picture_sel.xpath('//div[@class="c cl"]/a/img/@data-src')
return pciture_links
except IndexError:
pass
# 保存图片
def save_picture(self, name, link, num):
try:
# 创建多层文件夹
folder = self.main_folder + '/' + name + '/' + str(num) + '/'
if not os.path.exists(folder):
os.makedirs(folder)
with open(folder + link.split('/')[-2] + os.path.splitext(link)[-1], 'wb') as f:
image = requests.get(url=link, headers=self.headers).content
f.write(image)
except:
print('保存失败')
def run(self):
start_sel = self.data_range()
main_url_list = self. get_author_url(start_sel)
for author_url in main_url_list:
name, id, len_page = self.create_url(author_url)
for num in range(1, len_page + 1):
page_url = f'https://www.520mojing.com/forum-{id}-{num}.html'
pciture_links = self.get_pciturelinks(page_url)
for link in pciture_links:
# print(link)
self.save_picture(name, link, num)
if __name__ == '__main__':
MoJing = MoJing_Spider() # 实例化对象
MoJing.run()
我在测试代码的时候,访问网站的次数过多,所以我就弄了几个随机的请求头,不知道有没有用。运行代码之前改一下self.main_folder的路径就可以了,朋友们开心就好! |