鱼C论坛

 找回密码
 立即注册
查看: 3296|回复: 25

Python爬虫煎蛋网,无法获取妹子图。测试最后获取的是每页的站址。

[复制链接]
发表于 2018-11-27 14:30:09 | 显示全部楼层 |阅读模式

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

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

x
  1. import urllib.request
  2. import os

  3. def url_open(url):
  4.     req=urllib.request.Request(url)
  5.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36')
  6.     response=urllib.request.urlopen(url)
  7.     html=response.read()
  8.    
  9.     return html

  10. def get_page(url):
  11.     html=url_open(url).decode('utf-8')
  12.     a=html.find('current-comment-page')+23
  13.     b=html.find(']',a)
  14.    
  15.     return html[a:b]
  16.    
  17. def find_imgs(url):
  18.     html=url_open(url).decode('utf-8')
  19.     img_addrs=[]
  20.     a=html.find('img src=')
  21.     while a!=-1:
  22.         b=html.find('.jpg',a,a+255)
  23.         if b!=-1:
  24.             img_addrs.append(html[a+9:b+4])
  25.         else:
  26.             b=a+9
  27.         a=html.find('img src=',b)
  28.     return img_addrs
  29.    
  30.   

  31. def save_imgs(folder,img_addrs):
  32.     for each in img_addrs:
  33.         filename=each.split('/')[-1]
  34.         with open(filename,'wb') as f:
  35.             img=url_open(each)
  36.             f.write(img)

  37. def load_mm(folder='ooxx',pages=4):
  38.     os.mkdir(folder)
  39.     os.chdir(folder)

  40.     url='http://jandan.net/ooxx'  
  41.     page_num=int(get_page(url))
  42.     for i in range(pages):
  43.         page_num-=i
  44.         page_url=url+'/page-'+str(page_num)+'#comments'

  45.         img_addrs=find_imgs(page_url)

  46.         save_imgs(folder,img_addrs)


  47. if __name__=='__main__':
  48.     load_mm()
  49.    
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-27 14:53:05 | 显示全部楼层
煎蛋网,反爬了,小甲鱼的代码不能用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 15:29:47 | 显示全部楼层
wongyusing 发表于 2018-11-27 14:53
煎蛋网,反爬了,小甲鱼的代码不能用了

感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-27 18:53:44 | 显示全部楼层

你想爬什么内容,我给你上代码吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-29 15:08:35 | 显示全部楼层
fan1993423 发表于 2018-11-27 18:53
你想爬什么内容,我给你上代码吧

我做这节课的练习,想爬取煎蛋网前两页的妹子图。不知道该如何优化小甲鱼的代码,才能继续爬取。非常感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-29 17:00:09 | 显示全部楼层
W鱼蛋W 发表于 2018-11-29 15:08
我做这节课的练习,想爬取煎蛋网前两页的妹子图。不知道该如何优化小甲鱼的代码,才能继续爬取。非常感谢 ...

首先小甲鱼的代码已经过时了,而你用的是最先 b=html.find('.jpg',a,a+255),这种找页码的方式,已经不通用了,另外这个网站已经没有mm图了,你确定还要爬吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-11-29 20:16:15 | 显示全部楼层
fan1993423 发表于 2018-11-29 17:00
首先小甲鱼的代码已经过时了,而你用的是最先 b=html.find('.jpg',a,a+255),这种找页码的方式,已经不通 ...

你好,我现在学到后面的正则表达式了,这是爬取贴吧的图片代码,可是运行代码一直没有响应,不明白哪里出了问题,有时间的话,可以帮我看一下吗?
还有一个问题想请教一下,我现在是自学python,如果小甲鱼的代码过时了,还有推荐其他视频学习python吗?感谢!
  1. import urllib.request
  2. import re

  3. def open_url(url):
  4.     req=urllib.request.Request(url)
  5.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134')
  6.     page=urllib.request.urlopen(req)
  7.     html=page.read().decode('utf-8')

  8.     return html

  9. def get_img(html):
  10.     p=r'<img width="[^"]+" height="[^"]+" class="BDE_Image" style="cursor: url(http://tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur), pointer;" src="([^"]+\.jpg)"'
  11.     imglist=re.findall(p,html)

  12.     for each in imglist:
  13.         print(each)

  14.    

  15. if __name__=='__main__':
  16.     url='http://tieba.baidu.com/p/5960053459?da_from=ZGFfbGluZT1EVCZkYV9wYWdlPTEmZGFfbG9jYXRlPXAwMDY0JmRhX2xvY19wYXJhbT0xJmRhX3Rhc2s9dGJkYSZkYV9vYmpfaWQ9MjY5MzEmZGFfb2JqX2dvb2RfaWQ9NDcwNzAmZGFfdGltZT0xNTQzNDkxNjAy&da_sign=13f34f961bf46fae7bfc5bed2c99224c&tieba_from=tieba_da'
  17.     get_img(open_url(url))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2018-11-29 20:24:41 | 显示全部楼层
fan1993423 发表于 2018-11-29 17:00
首先小甲鱼的代码已经过时了,而你用的是最先 b=html.find('.jpg',a,a+255),这种找页码的方式,已经不通 ...

这是我要爬取的网页关于图片信息的源代码
  1. <img width="560" height="611" class="BDE_Image" style="cursor: url(http://tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur), pointer;" src="http://imgsrc.baidu.com/forum/w%3D580/sign=466d1ee054ee3d6d22c687c373176d41/d03d264e251f95cac6989ff1c4177f3e6709523a.jpg" pic_type="0">
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-29 20:28:21 | 显示全部楼层
  1. import urllib.request
  2. import re

  3. def open_url(url):
  4.     req=urllib.request.Request(url)
  5.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134')
  6.     page=urllib.request.urlopen(req)
  7.     html=page.read().decode('utf-8')

  8.     return html

  9. def get_img(html):
  10.     p=r'src="([^"]+.jpg)"'
  11.     imglist=re.findall(p,html)

  12.     for each in imglist:
  13.         print(each)

  14.    

  15. if __name__=='__main__':
  16.     url='http://tieba.baidu.com/p/5960053459?da_from=ZGFfbGluZT1EVCZkYV9wYWdlPTEmZGFfbG9jYXRlPXAwMDY0JmRhX2xvY19wYXJhbT0xJmRhX3Rhc2s9dGJkYSZkYV9vYmpfaWQ9MjY5MzEmZGFfb2JqX2dvb2RfaWQ9NDcwNzAmZGFfdGltZT0xNTQzNDkxNjAy&da_sign=13f34f961bf46fae7bfc5bed2c99224c&tieba_from=tieba_da'
  17.     get_img(open_url(url))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-29 20:30:28 | 显示全部楼层
W鱼蛋W 发表于 2018-11-29 20:16
你好,我现在学到后面的正则表达式了,这是爬取贴吧的图片代码,可是运行代码一直没有响应,不明白哪里出 ...

你就只是想爬取贴吧的图片嘛,文字其他的不要是吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 19:18:13 | 显示全部楼层
fan1993423 发表于 2018-11-29 20:30
你就只是想爬取贴吧的图片嘛,文字其他的不要是吧

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 19:27:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 00:42:20 | 显示全部楼层
本帖最后由 headache 于 2019-1-9 00:02 编辑
  1. import urllib.request
  2. import os
  3. import base64
  4. from bs4 import BeautifulSoup

  5. def url_open(url):
  6.     req = urllib.request.Request(url)
  7.     req.add_header('User-Agent', "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36")
  8.     response = urllib.request.urlopen(req)
  9.     html = response.read()
  10.     return html
  11.    
  12. def get_page(url):
  13.     html = url_open(url).decode()
  14.     soup = BeautifulSoup(html, 'lxml')
  15.     page = soup.find("span", class_='current-comment-page').string
  16.     return page[1:-1]

  17. def base64_decode1(s):
  18.     s = s.encode()
  19.     missing_padding = len(s) % 4
  20.     if missing_padding != 0:
  21.         s += b'=' * (4 - missing_padding)
  22.     return base64.decodestring(s)

  23. def find_imgs(url):
  24.     html = url_open(url).decode()
  25.     img_addrs = []
  26.     soup = BeautifulSoup(html, 'lxml')
  27.     img_hashs = soup.find_all(class_="img-hash")
  28.     for each in img_hashs:
  29.         img_addrs.append(base64_decode1(each.string).decode())
  30.     return img_addrs

  31. def save_imgs(folder, img_addrs):
  32.     for each in img_addrs:
  33.         filename = each.split("/")[-1]
  34.         with open(filename, "wb") as f:
  35.             img = url_open('http:'+each)
  36.             f.write(img)

  37. def download_mm(folder='pic', pages=10):
  38.     os.mkdir(folder)
  39.     os.chdir(folder)

  40.     url = "http://jandan.net/ooxx/"
  41.     page_num = int(get_page(url))

  42.     for i in range(pages):
  43.         page_url = url + "page-" +str(page_num-i) +"#comments"
  44.         img_addrs = find_imgs(page_url)
  45.         save_imgs(folder, img_addrs)

  46. if __name__ == "__main__":
  47.     download_mm()
复制代码


在小甲鱼的基础上修改了一下,刚刚写完,亲测可用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-8 16:35:44 | 显示全部楼层
本帖最后由 思想不惧子弹 于 2019-1-8 16:46 编辑
headache 发表于 2018-12-13 00:42
在小甲鱼的基础上修改了一下,刚刚写完,亲测可用


兄弟我是刚刚学习这一章知识的新手,为什么提示我
Traceback (most recent call last):
  File "E:\python学习\摸索.py", line 56, in <module>
    download_mm()
  File "E:\python学习\摸索.py", line 44, in download_mm
    os.mkdir(folder)
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'pic'

??

我知道为啥了,原来是已经有pic文件夹导致的,谢谢啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-11 15:17:31 | 显示全部楼层
headache 发表于 2018-12-13 00:42
在小甲鱼的基础上修改了一下,刚刚写完,亲测可用

兄弟请问一下有没有比较好的这种算法解析的地方
def base64_decode1(s):
    s = s.encode()
    missing_padding = len(s) % 4
    if missing_padding != 0:
        s += b'=' * (4 - missing_padding)
    return base64.decodestring(s)
这样子的很难看懂啊,上网也很难搜到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-12 00:12:59 | 显示全部楼层
思想不惧子弹 发表于 2019-1-11 15:17
兄弟请问一下有没有比较好的这种算法解析的地方
def base64_decode1(s):
    s = s.encode()

和这里最后那道习题中的代码一样 https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001399413803339f4bbda5c01fc479cbea98b1387390748000
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-12 21:12:29 | 显示全部楼层
我运行后什么都无法获取,在第24行后面,打印出b的值发现一直为-1,不知道为什么。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-14 09:00:33 | 显示全部楼层

自删

本帖最后由 思想不惧子弹 于 2019-1-14 09:12 编辑

自删
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-14 09:12:19 | 显示全部楼层
headache 发表于 2018-12-13 00:42
在小甲鱼的基础上修改了一下,刚刚写完,亲测可用

对了兄弟请问下,你是怎么看出这是用Base64就能解码的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-16 17:24:35 | 显示全部楼层
思想不惧子弹 发表于 2019-1-14 09:12
对了兄弟请问下,你是怎么看出这是用Base64就能解码的?

这个图片的地址是修改过的。那么查看网页源代码

  1. <div class="text"><span class="righttext"><a href="//jandan.net/ooxx/page-42#comment-4106156">4106156</a></span><p><img src="//img.jandan.net/img/blank.gif" onload="jandan_load_img(this)" /><span class="img-hash">Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczb2I2UGd5MWZ6OGk0aWxrdGlqMzB1MDExaDRxcC5qcGc=</span></p>
复制代码


可以看到图片标签的属性有一个函数onload=“jandan_load_img(this)”,网页加载完之后会触发这个函数。通过chrome开发者工具在Console获取这个函数的代码
  1. function jandan_load_img(b) {
  2.     var d = $(b);
  3.     var f = d.next("span.img-hash");
  4.     var e = f.text();
  5.     f.remove();
  6.     var c = jd30wjxzIcvDAKIlrdElNXVJnX2H4ZE0HI(e, "tcfn8yBGKYF3L0m8UG9hvd8bCAMtPCvi");
  7.     var a = $('<a href="' + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/, "$1large$3") + '" target="_blank" class="view_img_link">[查看原图]</a>');
  8.     d.before(a);
  9.     d.before("<br>");
  10.     d.removeAttr("onload");
  11.     d.attr("src", location.protocol + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.gif)/, "$1thumb180$3"));
  12.     if (/\.gif$/.test(c)) {
  13.         d.attr("org_src", location.protocol + c);
  14.         b.onload = function() {
  15.             add_img_loading_mask(this, load_sina_gif)
  16.         }
  17.     }
复制代码


注意到:
第4行 var e = "Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczb2I2UGd5MWZ6OGk0aWxrdGlqMzB1MDExaDRxcC5qcGc="
第6行jd30wjxzIcvDAKIlrdElNXVJnX2H4ZE0HI也是个函数,同样通过chrome开发者工具获取代码:

  1. var jd30wjxzIcvDAKIlrdElNXVJnX2H4ZE0HI = function(n, t, e) {
  2.     var f = "DECODE";
  3.     var t = t ? t: "";
  4.     var e = e ? e: 0;
  5.     var r = 4;
  6.     t = md5(t);
  7.     var d = n;
  8.     var p = md5(t.substr(0, 16));
  9.     var o = md5(t.substr(16, 16));
  10.     if (r) {
  11.         if (f == "DECODE") {
  12.             var m = n.substr(0, r)
  13.         }
  14.     } else {
  15.         var m = ""
  16.     }
  17.     var c = p + md5(p + m);
  18.     var l;
  19.     if (f == "DECODE") {
  20.         n = n.substr(r);
  21.         l = base64_decode(n)
  22.     }
  23.     var k = new Array(256);
  24.     for (var h = 0; h < 256; h++) {
  25.         k[h] = h
  26.     }
  27.     var b = new Array();
  28.     for (var h = 0; h < 256; h++) {
  29.         b[h] = c.charCodeAt(h % c.length)
  30.     }
  31.     for (var g = h = 0; h < 256; h++) {
  32.         g = (g + k[h] + b[h]) % 256;
  33.         tmp = k[h];
  34.         k[h] = k[g];
  35.         k[g] = tmp
  36.     }
  37.     var u = "";
  38.     l = l.split("");
  39.     for (var q = g = h = 0; h < l.length; h++) {
  40.         q = (q + 1) % 256;
  41.         g = (g + k[q]) % 256;
  42.         tmp = k[q];
  43.         k[q] = k[g];
  44.         k[g] = tmp;
  45.         u += chr(ord(l[h]) ^ (k[(k[q] + k[g]) % 256]))
  46.     }
  47.     if (f == "DECODE") {
  48.         if ((u.substr(0, 10) == 0 || u.substr(0, 10) - time() > 0) && u.substr(10, 16) == md5(u.substr(26) + o).substr(0, 16)) {
  49.             u = u.substr(26)
  50.         } else {
  51.             u = ""
  52.         }
  53.         u = base64_decode(d)
  54.     }
  55.     return u
  56. }
复制代码


传入的参数分别是:n="Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczb2I2UGd5MWZ6OGk0aWxrdGlqMzB1MDExaDRxcC5qcGc="
                             t="tcfn8yBGKYF3L0m8UG9hvd8bCAMtPCvi"
可以看到这个函数最后返回的是一个base64_decode(d),而d=n,所以返回的就是base64_decode(n)
base64_decode就是这帖子前面所说的那个函数,所以...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-10 09:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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