zoukankan      html  css  js  c++  java
  • Python基础+爬虫基础

    Python基础+爬虫基础

    一、python的安装:

    1、建议安装Anaconda,会自己安装一些Python的类库以及自动的配置环境变量,比较方便。

    二、基础介绍

    1、什么是命名空间:x=1,1存在内存中,x命名空间是存放名字x与1绑定关系的地方。
    2、命名空间的加载:python解释器先启动,先加载内置命名空间,然后以文件为基础,加载全局命名空间,在执行文件的过程中如果调用函数,则临时产生局部命名空间。
    3、名字的查找顺序:局部命名空间——全局命名空间——内置名称空间。 在全局无法查看局部,在局部可以查看全局。

    三、global与nonlocal关键字:

    1、什么是闭包:内部函数包对外部作用域而非全局作用域的引用。2、闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包了一层作用域,这使得,该函数无论在何处被调用,优先使用自己外层包裹的作用域。
    应用领域:延迟计算

    四、装饰器:

    定义:装饰他人的器具,本身可以是任意可调用对象,被修饰者也可以是任意可调用对象、
    强调装饰器原则:1、不修改被装饰对象的源代码。2、不修改被装饰对象的调用方式。3、装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能。

    五、迭代器:

    迭代的工具,是一个重复的过程,每次重复一次迭代,并且每次迭代的结果都是下次迭代的初始值。
    1、可迭代对象是指内置有 __iter__方法的对象和__next__方法的对象。
    2、迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象。
    3、迭代器对象的优点:提供一种统一的,不依赖于索引的迭代方式,惰性计算,节省空间。
    缺点:无法获取长度(只有在next完毕才知道到底有几个值)
    一次性,只能往后走,不能往前退。

    六、生成器:

    只要函数含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码。
    生成器就是迭代器。


    七、yield总结:

    把函数做成迭代器,对比return


    八、三元表达式:

    name=input('姓名:')
    res='SB' if name=='alex' else 'NB'


    九、匿名函数:

    匿名函数没有名字 ,与函数有相同的作用域,但是匿名函意味着引用计数为0,使用一次就释放,除非让其有名字。让其有名字就没有意义。

    有名字函数与没有名字函数对比:
    1、有名函数:循环使用,保留了名字,通过名字就可以重复引用函数功能。

    2、匿名函数:一次性使用,随时随地定义。


    十、eval()用来执行字符串表达式,


    十一、序列化:

    把对象从内存中变成可存储或传输的过程称之为序列化,在Python中叫picking,在其他语言中叫serialization,marshalling,flattening。
    1、为什么要序列化:持久保存状态。
    2、跨平台数据交互

    十二、面向对象高级

    1、isinstance(obj,cls)和issubclass(sub,super)
    isinstance(obj,cls)检查是否obj是否是类cls的对象。
    issubclass(obj,cls)检查sub类是否是super的派生类
    2、反射:主要是程序可以访问,检测和修改它本身状态或行为的一种能力。
    python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以用反射)
    #在cal_add函数前加上@property,使得该函数可直接调用,封装起来

    #在cal_info函数前加上@classmethon,则该函数变为类方法,该函数只能访问到类的数据属性,不能获取实例的数据属性
    #python自动传入位置参数cls就是类本身

    #cls.cal_name调用类自己的数据属性

    #静态方法 类或实例均可调用
    #改静态方法函数里不传入self 或 cls

    使用反射的好处:1、实现可插拔机制:事先定义好接口,接口只有在被完成后才会被真正的执行,即先把主要的逻辑写好,然后后期再实现接口功能。
    2、动态导入模块(基于反射房钱模块成员)。

    十三、 并发编程:

    1、并发与并行:无论是并发还是并行在用户看来都是同时运行的,不管是进程还是线程,都是一个任务,真正干活的是CPU,CPU来做这些任务,而CPU同一时刻只能执行一个任务。

    1、并发:伪并行:看起来是同时进行的,单个cpu+多道技术就可以实行并发(并行也属于并发)。
    2、并行:同时进行,只有具备多个CPU才能实现并行。
    单核下可以利用多道技术,多个核,每个核也可以用多道技术(多道技术主要针对的是单核)

    十四、爬虫的基本操作

    a.爬虫
    -定向
    -非定向
    b.
    1、请求网址
    2、下载页面
    3、筛选:正则表达式
    ===================开源模块======
    1、requests
    pip install requests

    respoonse= request.get('http://www.baudu.com')
    response.text

    总结:
    response= requests.get('URL')
    response.text
    response.content
    response.encoding
    response.aparent.encoding
    response.status.code 301永久重定向 302临时重定向

    2、beautisoup模块

    pip3 install beautisoup4

    from bs4 import beautisoup
    soup=beautisoup(response.text,parser='html.parser')
    soup.find(id='auto-channel-lazyload-article')

    总结:
    soup= beautisoup('<html>...</html>',features='html.parser')
    soup.find('div')
    soup.find(id='')
    soup.find('div',id='') 返回一个
    soup.find_all('div') 返回列表

    obj.text
    obj.attrs

    code:
    from bs4 import BeautifuSoup
    response=requests.get(
    url='http://www.autohome.com.cn/news'
    )
    response.encoding=response.apprent_encoding
    soup=BeautifySoup(response.text,features='html.parser')
    target=soup.find(id='auto-channel-lazyload-article')
    #print(target)
    target.find('li')
    print(obj)

    需求二::
    通过程序自动登录GitHub

    post_dict{
    "phone":"1111",
    "password":"xxx",
    ""oneMonth:"1",
    }

    response=request.post{
    url:'http://response.cookies.get_dict()'
    }
    c.模块的详细使用
    requests

    -参数:
    requests.get
    requests.post
    requests.delete
    requests.put

    requests.request(
    'POST'...
    )

    requests.request
    -method:提交方式
    -url:提交地址
    -params:在url中传递的参数,GET
    requests.request(
    method:'GET'
    url='http://www/oldboyedu.com'
    params-{'k1':'v1','k2':'v2'}
    )
    http://www.oldboyedu?k1=v1&k2=v2
    -data 在请求体里传递数据
    requests.request(
    method='POST'
    url='http://www.oldboyedu.com'
    json={'use':'alex','pwd':'123'}
    )

    请求头:
    content-type:application/url-form-encod...
    请求体:
    use=alex&pwd=123

    -json 在请求体中传递数据
    requests.request(
    methond='POST'
    url='http://www.oldboyedu.com'
    params-{'k1':'v1','k2':'v2'}
    json={'use':'alex','pwd':'123'}
    )
    PS:字典中嵌套字典时

    两种格式请求头和请求体的格式不同

    -headers 请求头:

    requests.request(
    methond='POST'
    url='http://www.oldboyedu.com'
    params-{'k1':'v1','k2':'v2'}
    json={'use':'alex','pwd':'123'}
    headers={
    'Referer':'' #登录前的访问地址
    'User-Agent':'' #使用什么浏览器访问的,可以伪造

    }
    )
    -cookies

  • 相关阅读:
    oracle锁---原理篇
    SML + NL + HJ
    Oracle中varchar,varchar2,nvarchar,nvarchar2的区别
    oracle 一致读原理
    commit 流程
    IMPDP NETWORK_LINK参数
    WINDOWS访问虚拟机RedHat搭配的Apache2服务器
    初识malloc函数
    好吧,又失眠
    休息一天
  • 原文地址:https://www.cnblogs.com/lsb123/p/11233541.html
Copyright © 2011-2022 走看看