笔记

时间:2019-04-19
本文章向大家介绍笔记,主要包括笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

print(5//10)
地板除,功能类似于数据模块中的floor()函数,向下取整操作
可以用来得到数字的十位数字(除以10),百位数字(除以100)

num.isdigit()

input 输入返回的类型是str

ascii码转数字
ord()
数字转ascii码
chr()

Ubuntu(乌班图)是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的"ubuntu"一词,意思是"人性"、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的"仁爱"思想。Ubuntu基于Debian发行版和GNOME桌面环境,而从11.04版起,Ubuntu发行版放弃了Gnome桌面环境,改为Unity,与Debian的不同在于它每6个月会发布一个新版本。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。2013年1月3日,Ubuntu正式发布面向智能手机的移动操作系统。

ubuntu基于linux的免费开源桌面PC操作系统,十分契合英特尔的超极本定位,支持x86、64位和ppc架构

学习使用headers request实例
post get 请求

ProxyHandler处理(代理服务器)

使用代理IP,是爬虫的常用手段
获取代理服务器的地址:
www.xicidaili.com
www.goubanjia.com
代理用来隐藏真实访问中,代理也不允许频繁访问某一个固定网站,所以,代理一定要很多很多
基本使用步骤:
设置代理地址
创建ProxyHandler
创建Opener
安装Opener
案例v10

cookie是凭证,在客户那里 session也是凭证,在服务器那端,关于机密的东西放在服务器那边。类似于古代的虎符,一人一半,合上就OK
拿出一张纸,撕成两半,对上了就是你的。
由于http协议的无记忆性,cookie发给用户的一段信息,记录的就是你的信息。session就是保存在服务器上的另一半。

cookie和session的区别
cookie存放不安全
存放位置不同
session会放在服务器上一段时间,之后会过期。
----为了保证信息安全,定期删除
----为了让服务器任务减轻

单个cookie的大小不超过4k,很多浏览器限制一个站点最多保存20个,不属于http的协议内容,是浏览器厂家的作为。

session是放在内存中或者数据库中,由框架自动处理。

cookie登录
CSDN实例

手动使用cookie

自动爬取cookie
http模块,python自带
CookieJar

利用cookieJar访问人人网
----自动使用cookie登录,大致流程是

其中handler是处理器,是真正干活的

生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
创建http请求管理器
http_handler = request.HTTPHandler()

#生成https管理器
https_handler = request.HTTPSHandler()

SSL----
证书就是指遵守ssl安全套阶层协议的服务器·数字证书(sercuersocketlayer)
美国网警公司开发
服务商恶心 截取我们的信息,造成我们信息的不安全泄露,于是百度等公司就开始采用SSL协议来保证我们信息的安全
https就是使用的SSL协议
怎样保证安全?
有一个第三方机构发出来-----CA机构 (CertifacateAuthority)证明我们彼此都是干净的。
需要向CA申请证书,但是需要钱
流氓 360 证书是自己发布的
12306据说是自己做的证明,没有经过认证

怎样忽略不受信任的证书?

--------js加密
反爬虫策略 MD5值
密文的加密是在浏览器上进行的
唬人的,没有什么秘密可言,非常好破解
加密函数或者过程一定是在浏览器上完成的
发送dict内容

明文经过一定的不可逆算法生成一个不可解读的密文
-----暴力破解
虽然密文不可解读,但是黑客可以将明文所有生成密文的可能性全部都列出来,意思就是你有一个函数,我不管你的明文是多少,我在事先都根据你的加密算法全部都跑一边,加密算法是可知的,但是是不可逆的,就是你知道加密算法你也不可能通过密文推出明文。
黑客手中的字典
但是为了防止破解,就有这样的一个方法
salt加盐方法,在你的明文后面,在加上一串很长很长的字符串,造成制作字典几乎是不可能,这样就不能够进行破解了。

为了防止别人暴力破解反推,一般都需要加盐处理

JS如何进行加密的?(加密方法的寻求)

寻找fanyi.min.js ---->response js代码

美化js代码的网站,允许我们把加密之后的代码格式化,然后反馈回来
tool.oschina,net/codeformat/js

然后在格式化后的代码中搜寻salt和sign

找到salt之后,加盐:
直接将salt复制粘贴上去

sait: r=“" (当然r只是给盐随意取的一个名称)
sign i="
*”

md5一共需要四个字符串,第一、四个是固定的字符串,由js代码给出(就是服务商给出)第三个是所谓的salt,第二个参数就是输入(在这里就是要查找的单词)

使用MD5,sign需要:
导入hashlib包 负责加密的 在jiongo上会讲
import hashlib
md5=hashlib.mb5()
md5.update(v,encoding=“utf-8”)
sign=md5.hexdigest()

ajax是一段JS代码,通过这个代码我们可以让网页异步请求
异步请求
一定会有url请求方法,可能有数据
一般使用json格式

页面一直往下拉一直有更新,那是因为有ajax请求

以post发送时 是form形式,是加密的
以get形式发送是不加密的

比较出名的模块 (前面我学习了urllib模块)
Requests模块 HTTP for human,更简洁,友好
继承了urllib所有的特征

中文文档: http://docs.python-requests.org/zh_CN/latest/index.html
开源地址: https://github.com/requests/requests

安装
souece activate spider
conda install requests 安装过程大约需要5分钟

get请求
request.get(url)
requests.request(“get”,url)

两种请求方式
可以带有 headers和parmas参数

post请求
rsp=requests.post(url,data=data,headers=headers)

proxy代理

proxies={
‘http’=‘www.xxxx.com
}
rsp=reuqests.request(‘get’, ‘http:xxxxxx’,proxies=proxies)

私人代理 花钱 给你用户名 密码
proxy={
“http”:“china:123456@192.168.1.123:231”
}
格式:用户名:密码@地址:端口地址
rsp=reuqests.get(‘http://www.baidu.com’,proxies=proxy)

web客户端验证
auth=(用户名,密码)
auth=(‘text’,12345)
rsp=requests.get(‘http://www.baidu.com’,auth=auth)

cookie
reuqests可以自动处理cookie信息

cookiejar=rsp.cookies
可以将cookiejar转化成字典
cookiedict=reuqests.utils.dict_from_cookiejar(cookiejar)

session
模拟一次对话
从客户端链接到服务器开始到结束
能够让我们跨请求的时候保持某些参数

https请求验证ssl证书
—如果需要验证参数vertify负责是否需要验证ssl证书,默认是需要的 True
—如果不需要验证,设置成False

rsp=requests.get(url,vertify=False)

页面解析和数据提取

假定数据在页面上
– - - 结构数据 先有结构在谈数据
处理起来简单一些
–JSON 文件
–JSON Path
–转换成python类型
–XML文件
—转换成python类型(xmltodict)
—XPATH
—正则
—css选择器

    • –非结构化数据 先有数据,再谈结构
  • -文本
  • -电话号码
  • -邮箱地址
  • -使用正则表达式
  • -html文件
    –正则
    –xpath
    –css选择器

正则表达式
一套规则,可以在文本文件中搜查替换符合要求的内容
re的基本使用流程 v23
match的基本使用 主要是对group的使用,一般需要对字符串分组 v24
import re
s=r’([a-z]+) ([a-z]+)’
pattern=re.compile(s,re.I)
m=pattern.match(‘hello world good morning’)
s=m.group(0)
s=m.span(0)
s=m.group(1)
print(s)

match从开始位置查找,一次匹配
search从任意位置查找,一次匹配
findall查找所有的结果
finditer 查找所有结果, 返回结果可迭代
split分割字符串,返回列表
sub替换

匹配中文
中文unicode范围主要在[u4e00-u9fa5]

import re
hello=u’你好,世界’
pattern=re.compile(r’[\u4e00-\u9fa5]+’)
m=pattern.findall(hello)
print(m)

贪婪与非贪婪模式

XML
查找资料: w3school

<?xml version="1.0" encoding="utf-8"?>

节点概念

Xpath (xml Path language)
是一门在xml文档中查找信息的语言
XPath开发工具
开源的xpath表达公式-XMLquire
chrome xpath helper
Firefox插件 xpath Checker

常用路径表达式
nodename
/表示从根节点开始
//从当前节点开始 选取元素,而不考虑节点的位置
.当前节点
booksotre:选取bookstore下的所有子节点
/booksotre:选取根元素
//book选取所有的book元素
//@lang:选取名称为lang的属性

谓语(predicates)
–谓语用来查找某个特定的节点,被镶嵌在括号中
例如:/booksotre/book[1]选取booksorte下的第一个名称为book的子元素

通配符
‘*’任何元素节点

选取多个路径
//book/tile | //book/author : 选取book元素中的title和author元素
//tile | //price: 选取文档中所有的title和price元素

作业 利用w3school学习xml和xpath (计划时间5小时)

Lxml
python的HTML/XML的解析器 跟正则差不多,都是使用C语言实现的
官方文档: http://lxml.de/index.html

需要先安装
1.打开虚拟环境 source activate spider
2.conda install lxml
导入
from lxml import etree

解析成html文档
利用
html=etree.HTML(text)
s=etree.tostring(html)

文件读取 只能读取xml文件
html=etree.parse(“要读取的html文件”)
s=rtree.tostring(html,pretty_print=True)
print(s)

etree和xpath配合使用
html=etree.parse(“要读取的html文件”)
print(type(html))
s=html.xpath(’//book’)
print(type(s))
print(s)
s=html.xpath(’//book/@[category=“sport”]’)
print(s)
s=html.xpath(’//book/@[category=“sport”]/year’)
s=s[0]
print(s. tag)
print(s.text)

css选择器 beautifulSoup4 数据提取,很重要的一个工作
安装
coada env list
source activate spider
conda install beautifulSoup4(等一会儿,可能比较慢)
http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
比较好用,一般都推荐使用beautifulSoup4

正则:很快,不好用,不能安装
beautifulsoup:慢,使用简单,安装简单
lxml: 比较快,使用简单,安装一般
from bs4 import beautifulSoup
from urllib import request
url=“http://www.baidu.com
rsp=request.urlopen(url)
content=rsp.read()
soup=BeautifulSoup(content,‘lxml’) 创建实例 lxml是引擎
content=soup.prettify() bs自动转码
print(content)
四大对象:
-Tag 标签 soup.tag_name
—soup.head soup.meta soup.link
两个重要属性
– name soup.link.name 可以修改 soup.link.name[‘type’]=‘hahahahahah’
string表示包含的值,内容
– atttrs属性
-NavigableString
–对应内容值
-Beatifulsoup
–表示一个文档的内容
-Comment
-特殊的NavigableString对象
-对其输出,内容不包括注释符号
遍历文档对象
- contents:tag的子节点以列表的方式给出
- for node in soup.head.contents:
print(node)
- children:子节点以迭代器的形式返回
- descendants:子孙节点 \

搜索文档对象

  • find_all(name,attrs,recusive,text,**kwargs)
    • name 可传入的内容为:
      • 字符串
      • 正则表达式
      • 列表
        -keyword参数,可以用来表示属性
        -text 用来表示tag对应的文本值
        ^me在正则中表示以me开头的

beautifulSoup4 中的css选择器 使用css选择器
使用soup.select,返回一个列表
通过标签名 soup.select(‘title’)
通过类名
id查找
组合查找
属性查找 soup.select(‘meta[content=‘always’]’)
获取tag内容

正则表达式
按照规则挑选内容,可以在字符串中搜查替换等

程序员最重要的是会使用百度,谷歌
作业:百度查找了解正则表达式、

动态HTML

爬虫跟反爬虫
**爬取的时候要遵循基本道德
**不论是爬虫还是反爬虫都是成本的问题
**技术本身就是相互的
动态HTML介绍
分类:Javascrapt
Jquery
Ajax
Dhtml
对付能够动的东西

爬虫爬取的是数据

python采集动态数据
-----从Javascript代码入手采集
-----python第三方库运行Javascript,直接采集在浏览器看到的页面

Selenium+phantomjs
selenium:web自动化测试工具
-自动加载页面
-获取数据
-截屏
浏览器
phantomjs
-基于webkit的无界面的浏览器 我们可以理解为这是一个虚拟的浏览器—一个爬虫,只是在后台运行我们人类的操作,但是不显示出来,只是根据我们的需要输出数据
-官网:http://www.phantomjs.org/download.html

安装 pip install selenium==2.48.0 使用pip 一般如果pip和conda都不能安装,我们就需要自己去官网进行安装工具

Selenium 库有一个Webdriver的API
Webdriver可以和页面上的各种1元素进行各种交互,用它可以来进行爬取

from selenium import webdriver
import time
from selenium.webdriver.common.keys import__Keys 通过Key模拟键盘
driver=webdriver.phantomJS()操作哪个浏览器就对哪个浏览器建立一个实例,自动按照环境变量进行查找
driver.get(“http://www.baidu.com”)

由于浏览器在将html上的内容展现出来时进行渲染非常消耗资源,于是我们仅仅使用幽灵(phontomJs)浏览器

由于谷歌之后也支持了不将html进行渲染的功能,所以phantomjs很快就没落了

使用谷歌:
chrome+chromdriver

selenium主要分为两大操作
-得到UI元素
-find_element_by_id
-find_elements_by_name
-find_element_by_xpath
-find_elements_by_link_text
-find_elements_by_partial_link_text
-find_elements_by_tag_name
-find_elements_by_class_name
-find_elements_by_css_selector
-基于UI元素的操作模拟
-单机
-右键
-拖拽
-输入
可以通过导入ActionsChains类来做到
from selenium import webdriver
from time
from slement.webdriver.common.keys import Keys
driver=webdriver.Chrome()
url=“http://www.baidu.com
driver.get(url)
text=driver.find_element_by_id(‘wrapper’).text
print(text)
print(driver.title)
driver._save_screenshot(‘index.png’)
driver.find_element_by_id(‘kw’).send_keys(u’大熊猫’) #输入框的id为’kw’
driver.find_element_by_id(‘su’).click()
time.sleep(5)
driver._save_screenshot(‘pandan.png’)
得到页面的cookie
print(driver.get_cookies())
模拟输入ctrl+A
driver.findelement_by_id(‘kw’).send_keys(Keys.CONTRLI,‘a’)
driver.findelement_by_id(‘kw’).send_keys(Keys.CONTRLI,‘x’)
driver.findelement_by_id(‘kw’).send_keys(u’航空母舰’)
driver.save_screenshot(‘hangmu.png’)
driver.findelement_by_id(‘kw’).send_keys(Keys.RETURN)
time.sleep(4)
driver.save_screenshot(‘hangmu2.png’)
driver.findelement_by_id(‘kw’).clear() #清空输入框
driver.quit()

____------------------------------------------------------------
pip和conda到底有什么不一样?

今天看到我的foreman开始报错去询问才发现。我们的python包管理工具已经从pip整体迁移到了conda。。最近的迁移真的非常多。。前端也在迁移打包