鱼C论坛

 找回密码
 立即注册
查看: 4391|回复: 14

[技术交流] 关于小甲鱼56课XXOO内容,自己的理解~希望对大家有帮助~

[复制链接]
发表于 2016-8-13 22:35:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 waw1228@qq.com 于 2016-8-13 23:32 编辑

这是我对于这部分代码的理解,是看完了后面的正则表达式后写的
谢谢论坛内   http://bbs.fishc.com/thread-71036-1-1.html  的代码文件 帮助我更好的理解了内容
本来是可以运行的,但现在又不行了,应该是ip的问题,大家可以通过用代理,我成功过。。。
煎蛋网并没有完全禁止访问

下面每个代码我都有注释,大家从def download_mm开始看起,这是思路的第一步,往下看应该会清晰很多
如果能帮到大家,就算成功了...

我书写的时候遇到了一个问题 很脑残 但是折磨了我很久
我User-Agent 因为单词短,我是手打的结果打成了 User_Agent  尼玛!我用各种代理各种检查修改对比,弄了1个小时..才找到问题...
大家不要出问题了

  1. import re
  2. import urllib.request
  3. import os
  4. import random

  5. #11.将主函数写好后,开始对其中需要的几个方法定义
  6. #这里将open 和 get分开写 就是为了方便书写, 要不后面不停的要写open....
  7. #后面我用的是正则表达式,用的是简单的方法,只要把正则表达式视频内容看完,结合论坛里关于正则表达式的符合和特殊用法结合看就能明白
  8. #我也会相应的做出解释
  9. #先是定义函数如何去打开网页
  10. def url_open(url):
  11.     #12.通过模块功能打开链接(基础内容),用的是Requests实例化出来一个对象,而不是直接用urlopen是因为要在后面添加内容
  12.     #原因是为了让服务器认为我们是通过浏览器访问的,而不是通过代码形式访问
  13.     req =urllib.request.Request(url)
  14.     #13.添加User-Agent 这个内容可以通过审查元素获得
  15.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.933.400 QQBrowser/9.4.8699.400')
  16.     #14.再打开这个我们修改过后的对象(可以让服务器认为是通过浏览器访问的链接)
  17.     response=urllib.request.urlopen(req)
  18.     #15.将这个链接读取后 赋值给html对象,此时为二进制形式,并没有进行解码
  19.     html=response.read()
  20.     #16.返回这个值 这里不能解码,因为后面save_imgs 图片必须要是二进制代码的形式 不能用utf-8的形式
  21.     return html
  22.    


  23. #17.定义好如何打开网页后,开始获取内部第一个页面链接的地址。
  24. def get_page(url):
  25.     #18.<span class="current-comment-page">[2091]</span>通过审查元素可已获得这个页面链接信息
  26.     #通过正则表达式将2091 这个值 模块化的找出来
  27.     #   \[(解除其他功能,此时就为'[',正则里中括号是有特殊意义的)  同样的\] 也是']'的意思
  28.     #   \d(匹配任何数字,因为两个中括号间只有数字) ;  + 是{1,}的意思,意味着重复匹配的次数,最少为一次,最多为无限匹配。
  29.     #需要用正则来找的内容是上面通过ulr_open返回的链接名,此时需要转码(decode('utf-8') 因为需要变为字符串的形式方便我们寻找想要的内容
  30.     lastpath=re.search(r'<span class="current-comment-page">\[\d+\]</span>' ,url_open(url).decode('utf-8'))
  31.     #19.上一步出来的结果为<_sre.SRE_Match object; span=(6, 54), match='<span class="current-comment-page">[2091]</span>'>
  32.     #这里是我用别的测试的 我的Ip好像又被禁了 但是格式是这样的, 我们要的只是2091这个数,所以要对这个结果继续操作
  33.     lastpath=re.search(r'\d+' ,lastpath.group(0))
  34.     #20.这里的group(0)求出来的值 就是match的值,整个语句就相当于对'<span class="current-comment-page">[2091]</span>'用正则表达式匹配
  35.     #\d 匹配所有数字,+相当于{1,}就是重复1次或更多相当于匹配所有的数字
  36.     #21.上一步的结果为<_sre.SRE_Match object; span=(36, 40), match='2091'> 仍需要再操作求出match的值
  37.     #返回 用group(0)求到的值就可以
  38.     return lastpath.group(0)
  39.    

  40. #22.上一步返回的值放到第7步里就可以知道每一个页面的链接,剩下的就需要找到该页面内图片的链接了   
  41. def find_imgs(url):
  42.     #23.打开每个页面,将页面转码为字符串的形式,方便后面寻找匹配的链接
  43.     html=url_open(url).decode('utf-8')
  44.     #24.图片链接为<img src="http://ww1.sinaimg.cn/mw600/005vbOHfgw1f6r66my7q5j30m80etjs4.jpg" style="max-width: 480px; max-height: 750px;">
  45.     #通过观察规律可以发现,只有ww后面的数字在变 和  nw600/后面的图片名字是在变,后面的style max_height暂时不管,我们不需要通过大小来匹配
  46.     #通过正则表达式,找到所有匹配的内容
  47.     # \d 匹配所有的数字 . 匹配所有非换行符的字符  \. 是转义.  此时就是'.'的意思
  48.     img_addrs=re.findall(r'http://ww\d\.sinaimg.cn/mw600/.+\.jpg' ,html)
  49.     #25.返回图片的地址
  50.     return img_addrs



  51. #26.知道图片地址后,需要对每个图片进行保存到本机相应的文件夹
  52. def save_imgs(folder,img_addrs):
  53.     #27.http://ww1.sinaimg.cn/mw600/005vbOHfgw1f6r66my7q5j30m80etjs4.jpg 已经得到了图片的地址列表
  54.     #开始对列表中的地址遍历操作
  55.     for each in img_addrs:
  56.         #28.文件名字就是将图片地址这个字符串,用'/'分割后,取最后一个
  57.         filename = each.split('/')[-1]
  58.         #29.打印每一个文件名,让用户知道再下载哪一个文件
  59.         print(filename)
  60.         #30.将每一个地址打开,并将内容赋值给img 图片必须得通过二进制的形式进行写入,这也就是之前url_open函数最后不直接转好的原因
  61.         img = url_open(each)
  62.         #31.用二进制方式打开文件,因为是没有这个文件的,也就是用二进制的方式新建一个名为filename的文件
  63.         #32.然后将图片信息写入文件, 因为是用with的方式打开,所以会自动关闭文件,不需要f.close()这一步,也就是成功保存了这个文件了
  64.       
  65.         with open(filename, 'wb') as f:
  66.             f.write(img)

  67.         
  68.    



  69. #1,下载图片,首先定义一个下载图片的方法,需要两个参数,下载到哪里(folder),需要下载几页(pages)
  70. def download_mm(folder='OOXX',pages=30):
  71.     #2.用os模块 进行创建文件夹和将工作目录移到该文件夹中
  72.     os.mkdir(folder)
  73.     os.chdir(folder)

  74.     #3.将要访问的网页并以字符串的形式赋值给url
  75.     url='http://jiandan.net/ooxx/'
  76.     #4.由于该网站图片是分页显示,所以我们得需要一个方法去访问每一页,才能将每一页里的图片地址找到,
  77.     #此时,需要一个方法(get_page(url))能通过初始网页来寻找里面每页的网址,将这个方法的结果赋值给page_num
  78.     page_num=int(get_page(url))
  79.     #5.我们目标是访问10页,所以用遍历的方式 进行10次计算
  80.     for i in range (pages+1):
  81.         #6.页码肯定是连续的,不是相加就是相减,这里的是相减的形式,所以没访问一次,都要把页码减去1
  82.         #这里减去i的意思是  如果开始定义为100页,第1次访问为100-i(i为0)==100 第二次访问为100-i(i为1)==99  第三次访问为100-i(i为2)==98以此类推
  83.         page_num -=i
  84.         #7.每一页的地址为 http://jandan.net/ooxx/page-2091#comments (可通过审查元素发现规律),后面每一页的地址只有页数(page_num)在变化
  85.         #所以可以知道每一页地址的规律如下
  86.         page_url=url+'page-'+str(page_num)+'#comments'
  87.         #8.知道每一页面的地址后,就需要知道每一页内图片的地址,就和第4步一样,需要一个通过每个页面网址来获得内部所有图片地址的方法(find_imgs)值赋给img_addrs
  88.         #用列表的方式将每个图片地址添加进去,然后用for in 的方法逐个写入 这样的方法比较好
  89.         img_addrs=find_imgs(page_url)
  90.         #9.知道每一个图片的地址后,就需要一个方法写入每张图片,也就是把每张图片保存到本机
  91.         save_imgs(folder,img_addrs)
  92. #10.判断是导入还是运行该模块
  93. if __name__=='__main__':
  94.     download_mm()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-13 23:30:35 | 显示全部楼层
写这么多啊~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-13 23:33:22 | 显示全部楼层

额是啊  新手嘛 自己写了 说不定自己回来还要看的 怕忘记
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-1 22:16:10 | 显示全部楼层
我之前按照小甲鱼的写了一个,在find_imgs()方法中出现错误,返回404错误
我copy你的运行也是一样的错误,请问楼主有遇到过吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 22:50:21 | 显示全部楼层
吴芒果 发表于 2017-8-1 22:16
我之前按照小甲鱼的写了一个,在find_imgs()方法中出现错误,返回404错误
我copy你的运行也是一样的错误, ...

遇到了同样的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-31 15:18:18 | 显示全部楼层
求教:
for i in range (pages+1):
        #6.页码肯定是连续的,不是相加就是相减,这里的是相减的形式,所以没访问一次,都要把页码减去1
        #这里减去i的意思是  如果开始定义为100页,第1次访问为100-i(i为0)==100 第二次访问为100-i(i为1)==99  第三次访问为什么不是99-i(i为2)==97?
        page_num -=i
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-1 09:33:44 | 显示全部楼层
太好了,适合我这种新的不能再新的新手学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 17:04:53 | 显示全部楼层
Traceback (most recent call last):
  File "E:\pythonlx\py56.py", line 106, in <module>
    download_mm()
  File "E:\pythonlx\py56.py", line 83, in download_mm
    os.mkdir(folder)

老是报这样的错误 ,请问这是什么情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 17:26:55 | 显示全部楼层
这段代码能直接用不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-3-9 18:42:31 | 显示全部楼层
那么厉害,真仔细!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 18:43:00 | 显示全部楼层
2740710202 发表于 2017-9-1 09:33
太好了,适合我这种新的不能再新的新手学习了

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

使用道具 举报

发表于 2018-3-9 18:52:08 | 显示全部楼层
xyl168 发表于 2017-9-2 17:26
这段代码能直接用不

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

使用道具 举报

发表于 2018-3-9 18:53:28 | 显示全部楼层
mass 发表于 2017-8-31 15:18
求教:
for i in range (pages+1):
        #6.页码肯定是连续的,不是相加就是相减,这里的是相减的形式 ...

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

使用道具 举报

发表于 2018-4-10 21:41:11 | 显示全部楼层
直接复制
urllib.error.HTTPError: HTTP Error 404: Not Found
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-22 14:31:37 | 显示全部楼层
mass 发表于 2017-8-31 15:18
求教:
for i in range (pages+1):
        #6.页码肯定是连续的,不是相加就是相减,这里的是相减的形式 ...

m = 100
for i in range(50):
    m -= i
    print(m)

100
99
97
94
90
85
79
72
64
55
45
34
22
9
-5
-20

2.我认为这里是有问题的,还有一个地方不明白的是:找网站页面的时候,用正则表达式找出来页面的地址了,后面为什么还要用字符串拼接来拼出来页面的地址呢?难道前面找出来的只是那个【】里面的数字?本人小白,正则粗略看了一遍还不是很懂,如果是的话为什么不能直接用正则找出页面的地址呢?
3.我觉得楼主写的这个笔记非常牛批,很受用。楼主肯定是学霸啦!,在此献上膝盖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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