Python精选生活不易 我用python

听说迅雷看图要会员?python篇

2017-04-10  本文已影响277人  Rokkia

想必用过迅雷的朋友都有体验,就是左边是下载信息,右边却是广告之类的。偶尔也会有些美女图片的推送,咳~,本着好奇的心里,我就点进去看了一下。
这是网址http://meitu.xunlei.com/index.html
然后发现,哇,好多美女啊。本着养眼的目标,我就往后看了看。突然发现个问题,有的图片只能看五张!五张!可恶啊。
比如这样的:

Paste_Image.png

那段时间刚接触爬虫,然后看什么都想看看他的URL,都想看看他的HTML结构看看能不能爬取一下看看。
于是我点击鼠标右键,复制了图片网址,然后打开看了一下。

Paste_Image.png

不经意间发现了一个奇怪的数字,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这样我们就算完成了,然后就可以美美的看图了。

上一篇下一篇

猜你喜欢

热点阅读