鱼C论坛

 找回密码
 立即注册
查看: 7632|回复: 16

[作品展示] 最新煎蛋网爬虫,xxoo妹子图,解密反爬虫机制,带源码

[复制链接]
发表于 2018-3-17 19:27:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gopythoner 于 2018-5-2 10:27 编辑

前两天写了一个有道翻译的的爬虫http://bbs.fishc.com/thread-106892-1-1.html,解密的了有道翻译的反爬虫机制

主要是因为群里面经常有人会遇到{"errorCode":50}所以去写的

今天又写了另一个论坛经常会问到的爬虫,是关于煎蛋网的妹子图爬虫

很多爬虫煎蛋网妹子图的都知道,现在妹子图的链接加密了,请求的网页根本没有图片链接,所以无法下载图片

当然,可以通过selenium模拟浏览器去爬

不过,我这篇不是用的这个,而是解密了煎蛋网的加密方式,直接获取图片链接了

爬虫思路:

                               
登录/注册后可看大图


直接贴源代码吧

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import hashlib
  5. import re
  6. import base64


  7. def _md5(value):
  8.     '''md5加密'''
  9.     m = hashlib.md5()
  10.     m.update(value.encode('utf-8'))
  11.     return m.hexdigest()


  12. def _base64_decode(data):
  13.     '''bash64解码,要注意原字符串长度报错问题'''
  14.     missing_padding = 4 - len(data) % 4
  15.     if missing_padding:
  16.         data += '=' * missing_padding
  17.     return base64.b64decode(data)


  18. def get_imgurl(m, r='', d=0):
  19.     '''解密获取图片链接'''
  20.     e = "DECODE"
  21.     q = 4
  22.     r = _md5(r)
  23.     o = _md5(r[0:0 + 16])
  24.     n = _md5(r[16:16 + 16])
  25.     l = m[0:q]
  26.     c = o + _md5(o + l)
  27.     m = m[q:]
  28.     k = _base64_decode(m)
  29.     h = list(range(256))
  30.     b = [ord(c[g % len(c)]) for g in range(256)]

  31.     f = 0
  32.     for g in range(0, 256):
  33.         f = (f + h[g] + b[g]) % 256
  34.         tmp = h[g]
  35.         h[g] = h[f]
  36.         h[f] = tmp

  37.     t = ""
  38.     p, f = 0, 0
  39.     for g in range(0, len(k)):
  40.         p = (p + 1) % 256
  41.         f = (f + h[p]) % 256
  42.         tmp = h[p]
  43.         h[p] = h[f]
  44.         h[f] = tmp
  45.         t += chr(k[g] ^ (h[(h[p] + h[f]) % 256]))
  46.     t = t[26:]
  47.     return t


  48. def get_r(js_url):
  49.     '''获取关键字符串'''
  50.     js = requests.get(js_url).text
  51.     # _r = re.findall('c=f_[\w\d]+\(e,"(.*?)"\)', js)[0] 这个已经改了
  52.     _r = re.findall('c=[\w\d]+\(e,"(.*?)"\)', js)[0]
  53.     return _r


  54. def get_urls(url):
  55.     '''获取一个页面的所有图片的链接'''
  56.     headers = {
  57.         'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0',
  58.         'Host': 'jandan.net'
  59.     }
  60.     html = requests.get(url, headers=headers).text
  61.     js_url = 'http:' + re.findall('<script src="(//cdn.jandan.net/static/min/[\w\d]+\.\d+\.js)"></script>', html)[-1]
  62.     _r = get_r(js_url)
  63.     soup = BeautifulSoup(html, 'lxml')
  64.     tags = soup.select('.img-hash')
  65.     for tag in tags:
  66.         img_hash = tag.text
  67.         img_url = get_imgurl(img_hash,_r)
  68.         print(img_url)


  69. if __name__ == '__main__':
  70.     get_urls('http://jandan.net/ooxx/page-44')
复制代码


上面的代码运行的部分结果:
  1. //ww3.sinaimg.cn/mw600/0073ob6Pgy1fpet9wku7dj30hs0qljuz.jpg
  2. //ww3.sinaimg.cn/mw600/0073tLPGgy1fpet9mszjwj30hs0g1jsv.jpg
  3. //ww3.sinaimg.cn/mw600/0073ob6Pgy1fpesskkgobj31jk1jkk5b.jpg
  4. //wx3.sinaimg.cn/mw600/006XfbArly1fpesq2jn1vj30j60svaz3.jpg
  5. //wx3.sinaimg.cn/mw600/6967abd2gy1fpenoyobrcj20u03d0b2d.jpg
  6. //wx3.sinaimg.cn/mw600/6967abd2gy1fpenp38v9uj20u03zkhdy.jpg
复制代码


这里我打印了一个页面的全部图片链接,没有下载,下载的事情你们自己去写吧
具体的分析过程可以看我博客文章解析,论坛不支持markdown,贴过来是真的麻烦
http://www.tendcode.com/article/jiandan-meizi-spider/

评分

参与人数 4荣誉 +15 鱼币 +15 贡献 +9 收起 理由
小甲鱼 + 6 + 6 + 6 热爱鱼C^_^
ド゛゜范 + 1 + 1 感谢楼主无私奉献!
ba21 + 3 + 3 + 3 感谢楼主无私奉献!
°蓝鲤歌蓝 + 5 + 5 666

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-19 08:43:29 | 显示全部楼层

你这是emoji表情吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-3-20 15:18:04 | 显示全部楼层
捞一下妹子图爬虫。只有人看,没人评论,快要沉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 16:00:02 | 显示全部楼层
狂拽酷炫吊炸天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 23:32:36 | 显示全部楼层
厉害,加密的都破了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 08:56:19 | 显示全部楼层
payton24 发表于 2018-3-21 23:32
厉害,加密的都破了

希望鱼油不要再乱爬,免得又被煎蛋换了加密方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-23 21:55:14 | 显示全部楼层
报错了,楼主

Traceback (most recent call last):
  File "C:/Users/wxy/Desktop/python/jiandanmeizi_jiami.py", line 83, in <module>
    get_urls('http://jandan.net/ooxx/page-44')
  File "C:/Users/wxy/Desktop/python/jiandanmeizi_jiami.py", line 73, in get_urls
    _r = get_r(js_url)
  File "C:/Users/wxy/Desktop/python/jiandanmeizi_jiami.py", line 61, in get_r
    _r = re.findall('c=f_[\w\d]+\(e,"(.*?)"\)', js)[0]
IndexError: list index out of range
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-23 22:02:31 | 显示全部楼层
ghjghj2012 发表于 2018-3-23 21:55
报错了,楼主

Traceback (most recent call last):

煎蛋改了js了,我擦,改的也太快了吧,才过了几天啊

你把报错这句改成这样
  1. _r = re.findall('c=[\w\d]+\(e,"(.*?)"\)', js)[0]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-23 22:47:37 | 显示全部楼层
gopythoner 发表于 2018-3-23 22:02
煎蛋改了js了,我擦,改的也太快了吧,才过了几天啊

你把报错这句改成这样

果然理解才是王道,随便一改就不会弄了,强
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 11:30:23 | 显示全部楼层
gopythoner 发表于 2018-3-23 22:02
煎蛋改了js了,我擦,改的也太快了吧,才过了几天啊

你把报错这句改成这样

楼主,你能说一下这个爬虫的思路吧,萌新表示看不懂是什么思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 11:31:39 | 显示全部楼层
fan1993423 发表于 2018-3-28 11:30
楼主,你能说一下这个爬虫的思路吧,萌新表示看不懂是什么思路

看流程图啊,还有,你去看我博客的分析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 18:19:03 | 显示全部楼层
我看你用的是import requests我用说没有这个模块,我知道个urllib.request这个是干嘛用的,import requests
from bs4 import BeautifulSoup
import hashlib
import re
import base64
除了re我都没学过,这些模块是干嘛用的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 08:36:58 | 显示全部楼层
BeautifulSoup是用来提取信息的,hashlib和base64都是用来加密解密的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 22:05:58 | 显示全部楼层
我也是煎蛋用户,还是不要乱爬了吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-5 15:38:31 | 显示全部楼层
楼楼   现在打印出来是乱码了。。   先告诉楼楼一声 。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-5 16:00:52 | 显示全部楼层
abcygq456 发表于 2018-6-5 15:38
楼楼   现在打印出来是乱码了。。   先告诉楼楼一声 。。。

我把部分代码 改了  直接返回图片地址   
    t = ""
    p, f = 0, 0
   
    p = (p + 1) % 256
    f = (f + h[p]) % 256
    tmp = h[p]
    h[p] = h[f]
    h[f] = tmp

    t = 'http://w' + str(k)[2:len(str(k))-1]

    return t

这样做功能实现了,   但是感觉还会有问题   希望楼楼有时间看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-9 09:45:27 | 显示全部楼层
abcygq456 发表于 2018-6-5 16:00
我把部分代码 改了  直接返回图片地址   
    t = ""
    p, f = 0, 0

2018-8-9表示乱码已恢复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 18:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表