美文网首页自由世界iOS开发
Python3爬虫(妹子图)

Python3爬虫(妹子图)

作者: Vaayne | 来源:发表于2015-03-27 09:57 被阅读7935次

    前言

    最近在学习python爬虫,这是一个练手的小项目。
    参考资料:

    1. 深入Python3
    2. Python官方文档
    3. 正则表达式30分钟入门教程
    4. 谷歌各种教程

    简介

    目标网站:煎蛋妹子图

    妹子图网站
    主要功能:新建一个文件夹,然后爬取页面,下载妹子图,每页的图分别放进一个文件夹,效果如下:
    文件夹
    文件夹内图片

    代码

    __author__ = 'Wayne'
    import urllib.request
    import os
    import re
    
    def url_open(url):
        req = urllib.request.Request(url)
        req.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0')
        response = urllib.request.urlopen(req)
        return response.read()
    
    def get_page(url):
        html = url_open(url).decode('utf-8')
        pattern = r'<span class="current-comment-page">\[(\d{4})\]</span>' #正则表达式寻找页面地址
    
        page = int(re.findall(pattern,html)[0])
        return page
    
    
    
    def find_imgs(page_url):
        pattern = r'<img src="(.*?\.jpg)"'
        html = url_open(page_url).decode('utf-8')
        img_addrs = re.findall(pattern,html)
        return img_addrs
    
    
    def save_imgs(img_addrs,page_num,folder):
        os.mkdir(str(page_num))
        os.chdir(str(page_num))
        for i in img_addrs:
            pattern = r'sinaimg.cn/mw600/(.*?).jpg'
            filename = i.split('/')[-1]
            image = url_open(i)
            with open(filename,'wb') as f:
                f.write(image)
                f.close()
    
    
    def download_mm(folder='ooxx',pages=10):
        os.mkdir(folder) #新建文件夹
        os.chdir(folder) #跳转到文件夹
        folder_top = os.getcwd() #获取当前工作目录
        url = 'http://jandan.net/ooxx/'
        page_num = get_page(url) #获取网页最新的地址
        for i in range(pages):
            page_num -= i #递减下载几个网页
            page_url = url + 'page-' + str(page_num) + '#comments' #组合网页地址
            img_addrs = find_imgs(page_url) #获取图片地址
            save_imgs(img_addrs,page_num,folder) #保存图片
            os.chdir(folder_top)
    
    if __name__ == '__main__':
        folder = input("Please enter a folder(default is 'ooxx'): " )
        pages = input("How many pages do you wan to download(default is 10): ")
        download_mm(str(folder),int(pages))
    

    微信公众号:lyishaou


    微信公众号

    相关文章

      网友评论

      • 45ba564f605c:python3.5试验了下,发现几个问题:
        1、文件夹名和页数不输入的话会报错,并不能使用缺省值;
        2、def find_imgs(page_url)返回的图片地址只是一部分,缺少http:,直接运行会报403错误;
        3、def save_imgs(img_addrs,page_num,folder)里的folder参数应该没用,代码块内的pattern = r'sinaimg.cn/mw600/(.*?).jpg'也没有用到;
        4、 for i in range(pages):
        page_num -= i #递减下载几个网页
        这里并不能按顺序递减,比如 page_num=240,会依次下载240、239、237、234、230、225、219、212、204、195这10页,不知道你就是这样设计的,还是疏忽了?
        5、 with open(filename,'wb') as f:
        f.write(image)
        f.close()
        with语句会自己关闭文件,所以 f.close()多余了
      • a2997c6ea6b0:感谢分享。
        试验了一下,遇到几个问题,已解决。
        试验环境:Win10,Python3.5, Pycharm 社区版。
        问题一:
        如果在输入文件名的时候直接回车,那么程序报错,并没有启用缺省的参数,而是使用了一个空量作为folder名称导致程序无法新建文件夹。
        解决方法:手动输入文件名即可。
        问题二:
        会提示“ValueError: unknown url type: '//ww2.sinaimg.cn/mw600/马赛克.jpg'”。原因是urllib.request.request不支持这种格式的url,必须在开头加上“http:”。
        解决方法:在url_open函数开头加上“url = re.sub(r'^//*',"http://&quot;, url)”即可。
        问题三:
        在save_imgs函数下,Pycharm提示“ pattern = r'sinaimg.cn/mw600/(.*?).jpg'”是无用语句,我看了一下,好像确实没有用到。
        解决方法:不影响使用,可无视之。

        提到的解决方法都是治标不治本,不知博主可否有空指点一下如何修改更好?
        a2997c6ea6b0:写错了一个地方,应该是url = re.sub(r'^//*',"http://”, url)
      • 大大大大峰哥:可以 用这个网站可以增加学习的乐趣 :no_mouth:
        好想用贴吧的滑稽
      • Fretice:你好 请问如何解决出现403错误 服务器禁止访问的问题的呢 用您的源码去测试还是会出现403的错误
        Fretice:@Vaayne 加了Header 之后还是会遇到 后来听说了 网站应该是设置了反爬虫
        Vaayne:@听说名字叫逗比的都是帅逼 那估计是网站设置障碍了,一般加个header就可以了
      • 链球选手:正在学习爬虫,作为小例子很有用!请问可以转吗?
        链球选手:@Vaayne 谢谢 :stuck_out_tongue_closed_eyes:
        Vaayne:@Cescfangs 可以的,

      本文标题:Python3爬虫(妹子图)

      本文链接:https://www.haomeiwen.com/subject/ebhnxttx.html