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