文档章节

python 爬虫的学习

嘻嘻哥
 嘻嘻哥
发布于 2015/06/14 21:53
字数 626
阅读 21
收藏 0

以下代码该有的注释都有了,所以就不再解释了

import urllib.request
import urllib.parse
import urllib.error
import os
import re
import shutil    #高层次的文件操作模块

def delete_dir(folder):
    """删除整个目录"""
    shutil.rmtree(folder)

def make_dir(folder):
    """创建并切换到对应的目录"""
    if not os.path.exists(folder):
        os.mkdir(folder)
    os.chdir(folder)

def url_open(url):
    """打开url地址,并返回二进制的字符串数据"""
    req = urllib.request.Request(url)
    req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36")
    try:
        response = urllib.request.urlopen(req)
    except urllib.error.HTTPError as e:
        print("open url failed!, error code = ", e.code)
    else:
        return response.read()

def get_element_value(url, pattern):
    """按正则表达式在打开的url里匹配满足pattern的所有数据,并返回对应的列表"""
    s = url_open(url).decode('utf-8')
    result_list = re.findall(pattern, s)
    return list(set(result_list)) #去重复

def save_picture(img_src_list):
    """将所有的图片保存到当前目录下"""
    for img_src in img_src_list:
        file_name = img_src.split('/')[-1]
        with open(file_name, 'wb') as f:
            f.write(url_open(img_src))

def download_jiandan_mm_picture(folder, page = 10):
    """下载煎蛋妹子的图片"""
    make_dir(folder)
    
    url = "http://jandan.net/ooxx/"
    page_num = get_element_value(url, r'class="current-comment-page">\[(\d+)\]')
    page_num = int(page_num[0])
    img_src_list = []
    for i in range(page):
        sub_url = url + 'page-' + str(page_num - i) + "#comments"
        s = url_open(sub_url).decode('utf-8')
        img_src_list = re.findall(r'img src="(.*\.jpg)"', s)
        save_picture(img_src_list)

def get_category(url):
    """获取豆瓣妹子主页的分类"""
    result_list = get_element_value(url, r'href="/category/(\d+)">(.*)<')
    dd = dict(result_list)#去掉重复的key
    result_list = [(int(x),dd[x]) for x in dd]
    result_list.sort()

    print("请选择对应的分类:")
    for result in result_list:
        print("%d.\t%s" % (result[0], result[1]))

    select = input("请输入您的选择:")
    return [(result[0], result[1]) for result in result_list if result[0] == int(select)]

def download_douban_meizi_picture(folder, page = 10):
    """下载豆瓣妹子的图片"""
    make_dir(folder)

    url = "http://www.dbmeizi.com/"
    category = get_category(url)
    make_dir(category[0][1])
    url += "category/" + str(category[0][0])
    page_num = get_element_value(url, r'cgidata.page_count=(\d+)')
    page_num = int(page_num[0])
    
    img_src_list = []
    page = page_num if page_num < page else page
    for i in range(page):
        sub_url = url + '?p=' + str(i)
        s = url_open(sub_url).decode('utf-8')
        img_src_list = re.findall(r'data-src="(.*?\.jpg)"', s)#注(.*?\.jpg)里面的?表示采用非贪婪模式
        save_picture(img_src_list)

def main():
    make_dir(r'C:\Users\fgwd\Desktop\妹子图')
    
    select = input("请选择1.抓取煎蛋妹子图,2.抓取豆瓣妹子图. >>>[2]")
    pages = input("请输入抓取的页数. >>>[10]")
    if select == "":
        select = "2"

    if pages == "":
        pages = "10"

    if select == "1":
        folder = r'C:\Users\fgwd\Desktop\妹子图\煎蛋'
        download_jiandan_mm_picture(folder, int(pages))
    elif select == "2":
        folder = r'C:\Users\fgwd\Desktop\妹子图\豆瓣'
        download_douban_meizi_picture(folder, int(pages))
    else:
        print("输入有误")
        return False
    return True
    
if __name__ == "__main__":
    if main():
        print("图片下载完成")



© 著作权归作者所有

共有 人打赏支持
嘻嘻哥
粉丝 0
博文 6
码字总数 8981
作品 0
厦门
高级程序员
私信 提问
想用 Python 找到一份好工作?这4种工作最热门!

身边有不少朋友最近都开始学习python,大多都在学了一两个月之后来问小编,我现在已经入行了,能去找什么样的工作呢? 小编只能说: 入行!=找工作 那么,自学python的人,如何才能找到满意的工...

python达人
05/16
0
0
王者程序员整理的Python网络爬虫和web的系统学习路线图

最近很多小伙伴找小编咨询,如何系统的学习Python?相信这个论题应该困扰了许多想学习Python的人,今天小编给大家讲一下一个零根底的小白,应该如何体系化的学习Python编程语言,在学习的道路...

dcpeng
09/06
0
0
如何快速学习Python编程?可以做什么职业?

2018年Python热度不减,一直占据编程语言排行榜的前几位。人生苦短,让我们来学一学Pyhotn吧,找到一份满意的工作还是没有问题的。 Python语言本身所具有的优势,决定了从事Python学习的开发...

糖宝lsh
10/27
0
0
2个月精通Python爬虫——3大爬虫框架+6场实战+分布式爬虫,包教包会

阿里云大学在线工作坊上线,原理精讲+实操演练,让你真正掌握云计算、大数据技能。 在第一批上线的课程中,有一个Python爬虫的课程,畅销书《精通Python网络爬虫》作者韦玮,带你两个月从入门...

云木西
06/27
0
0
5个python爬虫教材,让小白也有爬虫可写,含视频教程!

认识爬虫   网络爬虫,如果互联网是一张蜘蛛网,网络爬虫既是一个在此网上爬行的蜘蛛,爬了多少路程即获取到多少数据。 python写爬虫的优势   其实以上功能很多语言和工具都能做,但是用...

柯西带你学编程
06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
3
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
6
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部