笔记
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
节点概念
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开头的
- name 可传入的内容为:
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。。最近的迁移真的非常多。。前端也在迁移打包
- P1888 三角函数
- vue-cli打包之后的项目在nginx的部署
- datetimerangepicker配置及默认时间段展示
- EJS[1]-源码解析
- express项目创建步骤
- P2261 [CQOI2007]余数求和
- jquery animate动画持续运动
- 项目结构——JavaScript版本的2048实现[0]
- P3717 [AHOI2017初中组]cover
- P3742 umi的函数
- Tarjan中栈的分析与SLT栈的实现
- P2341 [HAOI2006]受欢迎的牛
- P2746 [USACO5.3]校园网Network of Schools
- P3369 【模板】普通平衡树(Treap/SBT)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- jdk1.7-HashMap原理分析
- osi七层网络模型及网络基础知识
- 【Nio】01--初始Nio组件
- 【Netty】01-服务端和客户端的搭建
- 【Netty】02-netty中不得不说的粘包与拆包
- 【不可思议的CANVAS】画一只会跟着鼠标走的小狗
- 【Netty】03-实战之序列化与反序列化协议
- JDK15正式发布,划时代的ZGC同时宣布转正
- 一文掌握开发利器:正则表达式
- 探讨iOS 图片解压缩到渲染过程
- iOS Abort 问题系统的解决方案
- 【jvm】01- java内存结构分析
- 【redis】01-redis简介
- 3000字详解四种常用的缺失值处理方法
- python学习笔记(7)——远程主机强迫关闭了一个现有的连接