我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 从入门到爬虫极简教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 从入门到爬虫极简教程

你学的太多,练习太少。 -- 古典

授权说明:Anti 996 License
https://github.com/996icu/996...

抓取数据但不用 Python

不编码是第一选择

八爪鱼采集器 Octoparse

特点: 内嵌浏览器, 可视化定位, 可提取 JavaScript 生成内容, 提取数据用 xpath, 常用网站模板, 支持云采集, 支持多种数据格式输出和数据库导出
http://www.bazhuayu.com/
5分钟演示 https://v.youku.com/v_show/id...
支持部分验证码自动识别 http://www.bazhuayu.com/faq/c...
免费版同时2个线程, 最多10个任务

火车采集器

特点: 对接数据库, 可直接导入 cms
http://www.locoy.com/

很多 cms 自带文章采集工具

如 jeecms, phpCMS, dedeCMS, 帝国 cms
(略)

为什么要学 Python

数据分析需要多个阶段, 抓取数据仅是一个环节, 数据需要不断采集, 更新, 清洗, 分析, 可视会展示等多个阶段, 这些过程中 Python 都能应对自如. 属于性阶适中的工具.

vs C

对比 C 语言, 效率弱一些, 但仅是运行效率, 开发效率高很多, 多数项目恰是开发占比高, 一直开发, 偶尔运行成为常态

vs Java

无需编译, 省去很多麻烦, 更适合一次性应用, 或小团队使用, 更灵活.

Life Is Short, Use Python

AI与机器学习

Python 语言基础


版本的问题

区别

Python 2.x 和 3.x 有很大区别

2to3

使用 2to3 可以自动升级大部分代码

3.x 新特性

https://www.asmeurer.com/pyth...

版本隔离 virtualenv

$ pip3 install virtualenv
$ virtualenv --no-site-packages venv
$ source venv/bin/activate
(venv)$ 
(venv)$ deactivate
$



常用数据结构

{} 大字典   Dictionary  键值对, 键唯一, 按键可以很快随机查找
[] 方列表  List  元素存储紧凑, 顺序固定, 可排序
(1,) 圆元组 tuple
set() 设集合 set 集合中,元素唯一,无相同元素


输入输出, 文本处理, 数组处理

input 终端输入

读文件

open(), read() seek()

写文件

写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:

>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()

数组

面向对象基本概念与使用

如何轻松愉快地学 Python

游戏学编程,熟悉语法, 流程结构, 函数等 https://codecombat.com/
ide: pycharm, vs code, 断点调试

Python教程

练习题

猜随机数
成三角形概率
求质数的几种境界
质数概率
png 格式简析

图形格式介绍

png, gif, jpg, svg, webp

特色与难点

装饰器

decorator @

生成器

generator

yeild

lambda 表达式

一些常用函数

zip()

map()

filter()

网络协议与文件格式

URL

协议头://域名:端口/路径/文件?参数1=参数值1&参数2=参数值2#页面锚点

HTTP 协议

https://www.tutorialspoint.co...

无连接: 请求之间不需要保持连接
媒介无关: MIME 类型确定数据内容
无状态: 用 cookie 或参数跟踪状态

请求头

通过观察 浏览器 -> 开发者工具 学习

重点掌握

Cookie
Referer
User-Agent
Content-Type

请求方法

GET

最常见, 一般通过 url 传递参数, 幂等性

POST

提交操作, 大量数据时, 上传文件时用

响应状态码

200:请求成功 处理方式:获得响应的内容,进行处理

301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 查看头里的 Location
302:请求到的资源在一个不同的URL处临时保存 查看头里的 Location

400:非法请求
401:未授权
403:禁止

404:没有找到

500:服务器内部错误
502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

测试工具

curl

结合浏览器的使用, -o 参数,

wget

断点续传之 -c 参数, 批量下载时的通配符使用

chromium, telnet, netcat

HTML 格式

学习工具

w3cschool.com

json

格式
工具

JavaScript & CSS

适当了解

python常用抓取工具/类库介绍


urllib

import urllib2
 
response = urllib2.urlopen("http://www.baidu.com")
print response.read()
2to3 urllib.py
import urllib.request, urllib.error, urllib.parse
 
response = urllib.request.urlopen("http://example.com")
print(response.read())

练习指导:

  1. Python3 启动, 退出 Ctrl+D
  2. 2to3 --help 找出 -w 回写参数
  3. 两种执行方式, 命令行, 交互式

参考: https://cuiqingcai.com/947.html

Requests 库

Scrapy

$ pip install Scrapy lxml

PySpider

非常方便并且功能强大的爬虫框架,支持多线程爬取、JS动态解析,提供了可操作界面、出错重试、定时爬取等等的功能,使用非常人性化。

官网

安装

$ pip install pyspider

使用

$ pyspider all

然后浏览器访问 http://localhost:5000

Selenium & PhantomJS

$pip install selenium

用浏览器进行加载页面

    from selenium import webdriver     
    browser = webdriver.Chrome()
    browser.get('http://www.baidu.com/')

驱动浏览器进行搜索

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
 
class PythonOrgSearch(unittest.TestCase):
 
    def setUp(self):
        self.driver = webdriver.Chrome()
 
    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source
 
    def tearDown(self):
        self.driver.close()
 
if __name__ == "__main__":
    unittest.main()

用 PhantomJS 保存页面为图片

PhantomJS 相当于无界面浏览器, 可执行脚本和 CSS 内存渲染

phantomjs helloworld.js

var page = require('webpage').create();
page.open('http://cuiqingcai.com', function (status) {
    console.log("Status: " + status);
    if (status === "success") {
        page.render('example.png');
    }
    phantom.exit();
});    

数据提取工具

html, xml, xpath, selector, json

正则表达式

掌握起来, 有一定难度, 多数编辑器支持, 使用场景广, 但不适合结构化数据(xml, json, html)

Python Re模块提供

#返回pattern对象
re.compile(string[,flag])  
#以下为匹配所用函数
re.match(pattern, string[, flags])
re.search(pattern, string[, flags])
re.split(pattern, string[, maxsplit])
re.findall(pattern, string[, flags])
re.finditer(pattern, string[, flags])
re.sub(pattern, repl, string[, count])
re.subn(pattern, repl, string[, count])

参见: https://cuiqingcai.com/912.html

其于 Dom 模型的 jQuery selector

在 Selenium 中或浏览器中直接使用

基于查询语言的 XPath 标准

XPath语言是基于一个树形结构表示的XML 文档,提供的导航能力,通过多种属性选择节点的一个标准。
XPath 是提取 XML 的工具, 所以需要对 HTML正行校正

校正工具:

    • BeautifulSoup
    • ElementTidy
    • 使用 lxml 完成解析 HTML
    >>> from lxml import etree
    >>> doc = '<foo><bar></bar></foo>'
    >>> tree = etree.HTML(doc)
    
    >>> r = tree.xpath('/foo/bar')
    >>> len(r)
    1
    >>> r[0].tag
    'bar'
    
    >>> r = tree.xpath('bar')
    >>> r[0].tag
    'bar'

    最稳定的结果是使用 lxml.html 的 soupparser。你需要安装 python-lxml 和 python-beautifulsoup,然后你可以执行以下操作:

    from lxml.html.soupparser import fromstring
    tree = fromstring('<mal form="ed"><html/>here!')
    matches = tree.xpath("./mal[@form=ed]")

    XPath 文档

    维基 https://en.wikipedia.org/wiki...
    W3C https://www.w3.org/TR/xpath-30/

    入门教程

    https://www.w3schools.com/xml...

    XPath 在线测试工具

    https://codebeautify.org/Xpat...

    特点: 可以直接加载 url

    <root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
     <employees>
      <employee id="1">Johnny Dapp</employee>
      <employee id="2">Al Pacino</employee>
      <employee id="3">Robert De Niro</employee>
      <employee id="4">Kevin Spacey</employee>
      <employee id="5">Denzel Washington</employee>
      
     </employees>
     <foo:companies>
      <foo:company id="6">Tata Consultancy Services</foo:company>
      <foo:company id="7">Wipro</foo:company>
      <foo:company id="8">Infosys</foo:company>
      <foo:company id="9">Microsoft</foo:company>
      <foo:company id="10">IBM</foo:company>
      <foo:company id="11">Apple</foo:company>
      <foo:company id="12">Oracle</foo:company>
     </foo:companies>
    </root>

    示例:
    1.选择文档节点
    /
    2.选择“root”元素
    /root
    3.选择所有'employee'元素,它们是'employees'元素的直接子元素。
    /root/employees/employee
    4.选择所有“公司”元素,无论它们在文档中的位置如何。
    //foo:company
    5.选择“公司”元素的“id”属性,无论它们在文档中的位置如何。
    //foo:company/@id
    6.选择第一个“employee”元素的文本值。
    //employee[1]/text()
    7.选择最后一个'employee'元素。
    //employee[last()]
    8.使用其位置选择第一个和第二个“employee”元素。
    //employee[position() < 3]
    9.选择具有“id”属性的所有“employee”元素。
    //employee[@id]
    10.选择'id'属性值为'3'的'employee'元素。
    //employee[@id='3']
    11.选择“id”属性值小于或等于“3”的所有“employee”节点。
    //employee[@id<=3]
    12.选择“companies”节点的所有子项。
    /root/foo:companies/*
    13.选择文档中的所有元素。
    // *
    14.选择所有“员工”元素和“公司”元素。
    //employee|//foo:company
    15.选择文档中第一个元素的名称。
    name(//*[1])
    16.选择第一个“employee”元素的“id”属性的数值。
    number(//employee[1]/@id)
    17.选择第一个“employee”元素的“id”属性的字符串表示形式值。
    string(//employee[1]/@id)
    18.选择第一个“employee”元素的文本值的长度。
    string-length(//employee[1]/text())
    19.选择第一个“company”元素的本地名称,即没有命名空间。
    string-length(//employee[1]/text())
    20.选择“公司”元素的数量。
    count(//foo:company)
    21.选择'company'元素的'id'属性的总和。
    sum(//foo:company/@id)

    http://www.xpathtester.com/xpath

    使用示例: 用xpath怎么提取重复元素中的一个元素

    <div class="container">
      <div class="col-12 col-sm-3">
        <p class="title">序号</p>
        <p>001</p>
      </div>
      <div class="col-12 col-sm-3">
        <p class="title">编号</p>
        <p>999</p>
      </div>
      <div class="col-12 col-sm-3">
        <p class="title">列号</p>
        <p>321</p>
      </div>
    </div>

    //p[text()="编号"]/following-sibling::p[1]
    例如:Python+Selenium获取文本:
    driver.driver.find_element_by_xpath(//p[text()="编号"]/following-sibling::p[1]).text
    注: Selenium 支持 XPath 和类 jQuery Selector 等多种选择方式.

    Firefox 和 XPath

    2017之前的 firefox 版本 + Firebug
    2017后 Firefox Developer Edition + Chropath addon
    https://addons.mozilla.org/en...

    Chromium 和 XPath

    在Chrome/ Firefox浏览器中打开网站

    • 按Ctrl + Shift + I(将打开开发人员工具)Alt+CMD+I
    • 选择仪器窗口顶部的“元素”
    • 选择仪器窗口底部的放大镜
    • 在浏览器中选择所需的元素
    • 右键单击DOM树中的选定行,然后选择“复制XPath”

    Chrome Extension XPath Helper (需要科学上网)

    数据保存

    csv 及 excel 格式

    注意引号转义, 可用现成库

    MySQL 数据库

    安装MySQL驱动
    由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器。MySQL官方提供了mysql-connector-python驱动,但是安装的时候需要给pip命令加上参数--allow-external:

    $ pip install mysql-connector-python --allow-external mysql-connector-python
    

    如果上面的命令安装失败,可以试试另一个驱动:

    $ pip install mysql-connector
    

    我们演示如何连接到MySQL服务器的test数据库:

    # 导入MySQL驱动:
    >>> import mysql.connector
    # 注意把password设为你的root口令:
    >>> conn = mysql.connector.connect(user='root', password='password', database='test')
    >>> cursor = conn.cursor()
    # 创建user表:
    >>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
    # 插入一行记录,注意MySQL的占位符是%s:
    >>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
    >>> cursor.rowcount
    1
    # 提交事务:
    >>> conn.commit()
    >>> cursor.close()
    # 运行查询:
    >>> cursor = conn.cursor()
    >>> cursor.execute('select * from user where id = %s', ('1',))
    >>> values = cursor.fetchall()
    >>> values
    [('1', 'Michael')]
    # 关闭Cursor和Connection:
    >>> cursor.close()
    True
    >>> conn.close()

    爬虫常见问题


    常见反爬技术

    User-Agent

    新华网

     Referer

    频率

    36kr.com
    taobao.com

    用户点击才展示内容

    csdn.net 博客

    登录后可用内容

    taobao.com

    各种人机验证 Captcha

    封IP, 封ID

    编码问题 GB2312, GB18030, GKB, UTF-8, ISO8859-1

    GB18030 > GBK > GB2312 但相互兼容
    UTF-8与以上编码不兼容

    用代理隐藏 ip

    import requests
    from lxml import etree
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
        }
    url = 'https://ip.cn/'
    
    ## 下面的网站是用来获取代理ip的API
    ip_url = 'http://proxy.w2n1ck.com:9090/random'
    ip = {'http'  : 'http://'+requests.get(ip_url).text}
    print(ip)
    response = requests.get(url, headers=headers, proxies=ip, timeout=10).text
    html = etree.HTML(response)
    ## 提取页面显示的ip
    res = html.xpath('//*[@id="result"]/div/p[1]/code/text()')
    print(res)

    模拟登录

    图形验证码处量

    百度OCR 

    https://aip.baidubce.com/rest...

    Tesseract + openCV

    ML-OCR

    效果最好

    人工OCR

    手工录入

    数据可视化


    matplot

    echarts

    Tableau

    高级话题


    手机 APP 接口数据抓取

    Python3.x+Fiddler抓取APP数据
    思路是电脑共享 wifi, 手机连这个 wifi, 电脑wifi 的 IP做为代理, 手机上设置代理.
    手机信任电脑的代理证书. 中间人攻击完成了. 
    截获到网络请求再通过参数变换完成抓取
    https://segmentfault.com/a/11...

    分布式爬虫

    数据库或缓存为协调工具

    中文分词

    结巴分词

    自然言语分析

    hanlp
    tlp-cloud

    人脸识别

    阿里的接口

    图形识别

    有问题到哪里去问?


    Coursera

    stackoverflow.com

    思否


    (c) 2018 Yujiaao
    微信: yujiabuao

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Python 从入门到爬虫极简教程

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Python 从入门到爬虫极简教程

    你学的太多,练习太少。 -- 古典授权说明:Anti 996 Licensehttps://github.com/996icu/996...抓取数据但不用 Python不编码是第一选择八爪鱼采集器 Octoparse特点: 内嵌浏览器, 可
    2023-01-31

    Python爬虫入门教程 15-100

    石家庄政民互动数据爬取-写在前面今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的。网址为http://www.sjz.gov.cn/col/1490066682000/index.html首先声
    2023-01-30

    Python爬虫入门教程 19-100

    从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,如果时间充足的情况下,会对他们进行一些简单的分析,好了,平台大概有51CTO学院,CSDN学院,网易云课堂,慕课网等平台,数据统一抓取到mongodb里面,如果对上
    2023-01-30

    Python爬虫入门教程 29-100

    1. 手机APP数据----写在前面继续练习pyspider的使用,最近搜索了一些这个框架的一些使用技巧,发现文档竟然挺难理解的,不过使用起来暂时没有障碍,估摸着,要在写个5篇左右关于这个框架的教程。今天教程中增加了图片的处理,你可以重点学
    2023-01-30

    Python爬虫入门教程 32-100

    1. B站博人传评论数据爬取简介今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看。网址: https://www.bilibil
    2023-01-30

    Python爬虫入门教程 38-100

    爬前叨叨今天要爬取一下正规大学名单,这些名单是教育部公布具有招生资格的高校名单,除了这些学校以外,其他招生的单位,其所招学生的学籍、发放的毕业证书国家均不予承认,也就是俗称的野鸡大学!网址是 https://daxue.eol.cn/min
    2023-01-30

    Python爬虫入门教程 59-100

    图片比对昨天的博客已经将图片存储到了本地,今天要做的第一件事情,就是需要在两张图片中进行比对,将图片缺口定位出来缺口图片完整图片计算缺口坐标对比两张图片的所有RBG像素点,得到不一样像素点的x值,即要移动的距离 def get_dis
    2023-01-31

    Python爬虫入门教程 61-100

    python3爬虫遇到了反爬当你兴冲冲的打开一个网页,发现里面的资源好棒,能批量下载就好了,然后感谢写个爬虫down一下,结果,一顿操作之后,发现网站竟然有反爬措施,尴尬了。接下来的几篇文章,我们研究一下各种反爬虫套路,当然互联网没有100
    2023-01-31

    Python爬虫入门教程 10-100

    图虫网-写在前面经历了一顿噼里啪啦的操作之后,终于我把博客写到了第10篇,后面,慢慢的会涉及到更多的爬虫模块,有人问scrapy 啥时候开始用,这个我预计要在30篇以后了吧,后面的套路依旧慢节奏的,所以莫着急了,100篇呢,预计4~5个月写
    2023-01-30

    Python爬虫入门教程 18-100

    很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都有,当然网站本身在爬虫爱好者的不断进攻下,也在不断
    2023-01-30

    Python爬虫入门教程 20-100

    美好的一天又开始了,今天咱继续爬取IT在线教育类网站,慕课网,这个平台的数据量并不是很多,所以爬取起来还是比较简单的打开我们要爬取的页面,寻找分页点和查看是否是异步加载的数据。进行了一些相应的分析,发现并没有异步数据,只需要模拟翻页就,在进
    2023-01-30

    Python爬虫入门教程 36-100

    爬前叨叨2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我打算在50篇博客之后在写,所以现在就放一放
    2023-01-30

    Python爬虫入门教程 46-100

    1. 手机收音机-爬前叨叨今天选了一下,咱盘哪个APP呢,原计划是弄荔枝APP,结果发现竟然没有抓到数据,很遗憾,只能找个没那么圆润的了。搜了一下,找到一个手机收音机 下载量也是不错的。2. 爬虫套路爬虫基本套路抓包获取链接分析数据抓数据使
    2023-01-30

    Python爬虫入门教程: 27270图

    今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的地方跟我说说。 为了以后的网络请求操作方
    2023-01-31

    Python爬虫入门教程 21-100

    今天咱们抓取一下网易云课堂的课程数据,这个网站的数据量并不是很大,我们只需要使用requests就可以快速的抓取到这部分数据了。你第一步要做的是打开全部课程的地址,找出爬虫规律,地址如下:https://study.163.com/cour
    2023-01-30

    Python爬虫入门教程 26-100

    1. 知乎文章图片爬取器之二博客背景昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中去。首先,需要获取任意知乎的问题,只需要你
    2023-01-30

    Python爬虫入门教程 49-100

    爬前准备工作在开始安装Appium之前,你要先知道Appium是做什么的?Appium 是一个自动化测试开源工具,看到没,做测试用的,它有点类似Selenium,可以自动操作APP实现一系列的操作。标记重点,可以使用python对Appiu
    2023-01-30

    Python爬虫入门教程 52-100

    写在前面关于获取文章自动发送到邮箱,这类需求其实可以写好几个网站,弄完博客园,弄CSDN,弄掘金,弄其他的,网站多的是呢~哈哈先从博客园开始,基本需求,获取python板块下面的新文章,间隔60分钟发送一次,时间太短估摸着没有多少新博客产出
    2023-01-30

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录