|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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个小时..才找到问题...
大家不要出问题了
- import re
- import urllib.request
- import os
- import random
- #11.将主函数写好后,开始对其中需要的几个方法定义
- #这里将open 和 get分开写 就是为了方便书写, 要不后面不停的要写open....
- #后面我用的是正则表达式,用的是简单的方法,只要把正则表达式视频内容看完,结合论坛里关于正则表达式的符合和特殊用法结合看就能明白
- #我也会相应的做出解释
- #先是定义函数如何去打开网页
- def url_open(url):
- #12.通过模块功能打开链接(基础内容),用的是Requests实例化出来一个对象,而不是直接用urlopen是因为要在后面添加内容
- #原因是为了让服务器认为我们是通过浏览器访问的,而不是通过代码形式访问
- req =urllib.request.Request(url)
- #13.添加User-Agent 这个内容可以通过审查元素获得
- 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')
- #14.再打开这个我们修改过后的对象(可以让服务器认为是通过浏览器访问的链接)
- response=urllib.request.urlopen(req)
- #15.将这个链接读取后 赋值给html对象,此时为二进制形式,并没有进行解码
- html=response.read()
- #16.返回这个值 这里不能解码,因为后面save_imgs 图片必须要是二进制代码的形式 不能用utf-8的形式
- return html
-
- #17.定义好如何打开网页后,开始获取内部第一个页面链接的地址。
- def get_page(url):
- #18.<span class="current-comment-page">[2091]</span>通过审查元素可已获得这个页面链接信息
- #通过正则表达式将2091 这个值 模块化的找出来
- # \[(解除其他功能,此时就为'[',正则里中括号是有特殊意义的) 同样的\] 也是']'的意思
- # \d(匹配任何数字,因为两个中括号间只有数字) ; + 是{1,}的意思,意味着重复匹配的次数,最少为一次,最多为无限匹配。
- #需要用正则来找的内容是上面通过ulr_open返回的链接名,此时需要转码(decode('utf-8') 因为需要变为字符串的形式方便我们寻找想要的内容
- lastpath=re.search(r'<span class="current-comment-page">\[\d+\]</span>' ,url_open(url).decode('utf-8'))
- #19.上一步出来的结果为<_sre.SRE_Match object; span=(6, 54), match='<span class="current-comment-page">[2091]</span>'>
- #这里是我用别的测试的 我的Ip好像又被禁了 但是格式是这样的, 我们要的只是2091这个数,所以要对这个结果继续操作
- lastpath=re.search(r'\d+' ,lastpath.group(0))
- #20.这里的group(0)求出来的值 就是match的值,整个语句就相当于对'<span class="current-comment-page">[2091]</span>'用正则表达式匹配
- #\d 匹配所有数字,+相当于{1,}就是重复1次或更多相当于匹配所有的数字
- #21.上一步的结果为<_sre.SRE_Match object; span=(36, 40), match='2091'> 仍需要再操作求出match的值
- #返回 用group(0)求到的值就可以
- return lastpath.group(0)
-
- #22.上一步返回的值放到第7步里就可以知道每一个页面的链接,剩下的就需要找到该页面内图片的链接了
- def find_imgs(url):
- #23.打开每个页面,将页面转码为字符串的形式,方便后面寻找匹配的链接
- html=url_open(url).decode('utf-8')
- #24.图片链接为<img src="http://ww1.sinaimg.cn/mw600/005vbOHfgw1f6r66my7q5j30m80etjs4.jpg" style="max-width: 480px; max-height: 750px;">
- #通过观察规律可以发现,只有ww后面的数字在变 和 nw600/后面的图片名字是在变,后面的style max_height暂时不管,我们不需要通过大小来匹配
- #通过正则表达式,找到所有匹配的内容
- # \d 匹配所有的数字 . 匹配所有非换行符的字符 \. 是转义. 此时就是'.'的意思
- img_addrs=re.findall(r'http://ww\d\.sinaimg.cn/mw600/.+\.jpg' ,html)
- #25.返回图片的地址
- return img_addrs
- #26.知道图片地址后,需要对每个图片进行保存到本机相应的文件夹
- def save_imgs(folder,img_addrs):
- #27.http://ww1.sinaimg.cn/mw600/005vbOHfgw1f6r66my7q5j30m80etjs4.jpg 已经得到了图片的地址列表
- #开始对列表中的地址遍历操作
- for each in img_addrs:
- #28.文件名字就是将图片地址这个字符串,用'/'分割后,取最后一个
- filename = each.split('/')[-1]
- #29.打印每一个文件名,让用户知道再下载哪一个文件
- print(filename)
- #30.将每一个地址打开,并将内容赋值给img 图片必须得通过二进制的形式进行写入,这也就是之前url_open函数最后不直接转好的原因
- img = url_open(each)
- #31.用二进制方式打开文件,因为是没有这个文件的,也就是用二进制的方式新建一个名为filename的文件
- #32.然后将图片信息写入文件, 因为是用with的方式打开,所以会自动关闭文件,不需要f.close()这一步,也就是成功保存了这个文件了
-
- with open(filename, 'wb') as f:
- f.write(img)
-
-
- #1,下载图片,首先定义一个下载图片的方法,需要两个参数,下载到哪里(folder),需要下载几页(pages)
- def download_mm(folder='OOXX',pages=30):
- #2.用os模块 进行创建文件夹和将工作目录移到该文件夹中
- os.mkdir(folder)
- os.chdir(folder)
- #3.将要访问的网页并以字符串的形式赋值给url
- url='http://jiandan.net/ooxx/'
- #4.由于该网站图片是分页显示,所以我们得需要一个方法去访问每一页,才能将每一页里的图片地址找到,
- #此时,需要一个方法(get_page(url))能通过初始网页来寻找里面每页的网址,将这个方法的结果赋值给page_num
- page_num=int(get_page(url))
- #5.我们目标是访问10页,所以用遍历的方式 进行10次计算
- for i in range (pages+1):
- #6.页码肯定是连续的,不是相加就是相减,这里的是相减的形式,所以没访问一次,都要把页码减去1
- #这里减去i的意思是 如果开始定义为100页,第1次访问为100-i(i为0)==100 第二次访问为100-i(i为1)==99 第三次访问为100-i(i为2)==98以此类推
- page_num -=i
- #7.每一页的地址为 http://jandan.net/ooxx/page-2091#comments (可通过审查元素发现规律),后面每一页的地址只有页数(page_num)在变化
- #所以可以知道每一页地址的规律如下
- page_url=url+'page-'+str(page_num)+'#comments'
- #8.知道每一页面的地址后,就需要知道每一页内图片的地址,就和第4步一样,需要一个通过每个页面网址来获得内部所有图片地址的方法(find_imgs)值赋给img_addrs
- #用列表的方式将每个图片地址添加进去,然后用for in 的方法逐个写入 这样的方法比较好
- img_addrs=find_imgs(page_url)
- #9.知道每一个图片的地址后,就需要一个方法写入每张图片,也就是把每张图片保存到本机
- save_imgs(folder,img_addrs)
- #10.判断是导入还是运行该模块
- if __name__=='__main__':
- download_mm()
复制代码 |
|