Python基础+爬虫基础

假如想象 提交于 2020-02-01 02:05:09

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!