想必用过迅雷的朋友都有体验,就是左边是下载信息,右边却是广告之类的。偶尔也会有些美女图片的推送,咳~,本着好奇的心里,我就点进去看了一下。
这是网址http://meitu.xunlei.com/index.html
然后发现,哇,好多美女啊。本着养眼的目标,我就往后看了看。突然发现个问题,有的图片只能看五张!五张!可恶啊。
比如这样的:
那段时间刚接触爬虫,然后看什么都想看看他的URL,都想看看他的HTML结构看看能不能爬取一下看看。
于是我点击鼠标右键,复制了图片网址,然后打开看了一下。
不经意间发现了一个奇怪的数字,1.jpg?难道还有2.jpg?。然后我又复制了第二张可看图片地址发现还真有2.jpg。
让我们比较一下这两个网址:
http://data.meitu.xunlei.com/data/image/suntiantian0922/1.jpg
http://data.meitu.xunlei.com/data/image/suntiantian0922/2.jpg
除了末尾不一样,貌似没啥区别,如果改成6呢?
问题就来了,他显示的这个。
Paste_Image.png
本以为是巧合,结果我试了试其他的貌似也是这样。
这样我是不是就可以把这一套都爬下来了,貌似是的,于是就写了一下程序。
def pic_request(tup):
#通过tup[1]拿到一共多少张图
num = tup[1]
#通过tup[0]拿到套图名字
pic_name = tup[0]
#设置路径
path = pic_path + pic_name
#创建路径
os.chdir(path)
for i in range(int(num)):
#然后,发送请求然后保存图片
resp = requests.get(built_url(pic_name, i + 1))
if resp is None:
raise 'Error'
else:
filename = '%s_%s.jpg' % (pic_name, i + 1)
with open(filename, 'wb') as f:
f.write(resp.content)
怎么才能拿到所有的图呢?很是好奇,于是找了一下,皇天不负有心人,在这里我发现了。
Paste_Image.png我么来解析一下这个js
Paste_Image.png这三个数据,大概就是我们需要的。
需要就拿下来呗
#请求js拿到数据
def requestAllUrl():
resp = requests.get(all_url, headers=headers)
jsontext = resp.content
#匹配拿到list中的数据
json_match = re.search(r'\[.*\]', jsontext)
if json_match is None:
raise 'match Error'
else:
json_a = json.loads(json_match.group())
if json_a is None:
raise 'json Error'
else:
返回数据
yield json_a
主程序中我们需要这样执行.
def main():
try:
json_a = requestAllUrl()
except Exception as e:
print e
#尝试使用多进程
p = Pool(4)
for dic in json_a:
try:
os.chdir(pic_path)
title = dic['title']
match = re.search(r'花絮$', title)
print match
if match is None and int(dic['totals']) != 1:
os.makedirs(dic['resource_id'])
tup = (dic['resource_id'], dic['totals'])
#使用多进程异步请求,请求方法为pic_request方法
p.apply_async(pic_request, args=(tup,))
except Exception as e:
print e
p.close()
p.join()
ok这样我们就算完成了,然后就可以美美的看图了。
网友评论