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:[email protected]: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选择器
正则表达式
一套规则,可以在文本文件中搜查替换符合要求的内容
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:子孙节点 \
搜索文档对象
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。。最近的迁移真的非常多。。前端也在迁移打包?。
跟着发的教程弄了半天总算搞定,但是我非常疑惑。
为什么疑惑。。因为既然都是关于python的包管理工具为什么有了pip 我们还需要conda?在stackoverflow上搜到了答案 所以。我只做中文搬运 不做过多的污染
Having been involved in the python world for so long, we are all aware of pip, easy_install, and virtualenv, but these tools did not meet all of our specific requirements. The main problem is that they are focused around Python, neglecting non-Python library dependencies, such as HDF5, MKL, LLVM, etc., which do not have a setup.py in their source code and also do not install files into Python’s site-packages directory.
So Conda is a packaging tool and installer that aims to do more than what pip does; handle library dependencies outside of the Python packages as well as the Python packages themselves. Conda also creates a virtual environment, like virtualenv does.
As such, Conda should be compared to Buildout perhaps, another tool that lets you handle both Python and non-Python installation tasks.
Because Conda introduces a new packaging format, you cannot use pip and Conda interchangeably; pip cannot install the Conda package format. You can use the two tools side by side but they do not interoperate either.
在python的世界里也浸淫多年了,我们早已习惯有 pip ,easy_install 和virtualenv的世界,但是这些?没有解决我们所有的需求哦。这其中主要的问题是他们全部都集中解决关于python相关问题而忽略了非python库的依赖关系。(这句我没他看明白),就像 HDF5, MKL LLVM,etc等,在他们的源码中并没有setup.py这种东西而且也没有安装文件在python的site-packages 目录中。
所有conda就是一个包管理?和安装?,他就是要做比pip更多的事情;在python-site-packages之外管理python 库依赖关系。 而且conda同样也像virtualenv一样创建一个虚拟环境。
conda可以让你同时管理安装处理你有关python的任务和跟python无关的任务
conda使用了一个新的包格式,你不能交替使用pip 和conda。因为pip不能安装和解析conda的包格式。你可以使用两个工具 但是他们是不能交互的。
______-----------------------------------------------
验证码问题
由于爬虫和反爬虫导致验证码越来越升级
作用:判断访问者是否是爬虫或者机器人
安装完成之后需要设置环境变量
…………………………
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
……………………………
如何使用:
有两个小图片
使用命令行:
将图片放到桌面
cd 桌面 (进入桌面目录下)
tesseract 图片名称 ha(?不知道有没有,可以试试)
继续输入:
cat ha.txt
利用代码调用:
import pytesseract as pt
from PIL import Image
生成图片实例
image=Image.open(“图片路径”)
调用pytesseract转换成文字
text=pt.image_to_string(image)
print(text)
scrapy
爬虫框架
–框架 有些框架不灵活不自由 提供辅助作用的一大推代码,对语言知识的提高非常有用的
–scrqpy
–pyspider
–crawley
scrapy
–官方网站
http://doc.scrapy.org/en/latest/
http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
安装:
–pip install Scrapy
scrapy概述
- - 包含各个部件
- - ScrapyEngine:神经中枢 引擎 核心 大脑
- -Scheduler调度器:引擎发来的request请求,调度器需处理,然后交换引擎
- -Downloader下载器 把引擎发来的request发出的请求,得到response
- -Spider爬虫:负责把下载得到的网页/结果进行分解,分解成数据+链接
- -ItemPipeline 管道 详细处理Item
- - DownloadMiddleware下载中间件 自定义下载的功能扩展组件
- -SpiderMiddleware爬虫中间件 对spider进行功能扩展
-
ItemPipeline
–对应pipelines文件
–爬虫提取出数据存入item之后,需要进一步处理,比如清洗,去重,存储等等
–pipeline需要处理process_item函数
-process_item
-spider提取出来的item作为参数传入,同时传入的还有spider 通过yield来返回
-此方法必须出现
-必须返回一个item对象,被丢弃的item对象不会被之后的pipeline处理
-init:构造函数
–进行一些必要的参数初始化
-open_spider(spider):
-spider对象被开启的时候调用
-close_spider(spider):
-关闭的时候调用
一个 pipeline
process_item(item,spider)
item进行处理
return item
spider
-对应的是文件夹spiders下的文件
-init:初始化爬名称,start_urls列表
-start_requests:生成Requests对象交给Scripy下载并返回response
-parse:根据返回的response解析出相应的item,item自动进入下一个pipeline,如果需要,解析出url,url自动交给requests模块,一直循环
-start_request:此方法仅能被调用一次,读取start_urls内容并启动循环过程
-name:设置爬虫名称
-start_urls:设置第一批爬取的url
-allow_domains:spider允许爬取的域名列表
-start_request(self):只调用一次
-parse
-log日志记录
- - 爬虫项目大概流程
- 新建项目:scrapy startproject xxx
- 明确需要目标/产出:编写item.py
- 制作爬虫:地址 spider/xxxspider.py
- 存储内容:pipelines.py
中间件(downloaderMiddlewares)
process_request
process_reponse
去重
-为了防止爬虫陷入死循环,需要去重
-即在spider中的parse函数中,返回request的时候加上dont_fliter=False参数
如何在scrapy中使用selenium
scrapy sheel
在linux下是source activate
window下是activate
启动
打开anacconda prompt
activate 环境
scrapy sheel url
启动后自动下载指定url的页面
下载完成后url的内容保存在response,如果需要,我们需要调用response
response–
–爬取到的内容保存在response
–response.body是网页的代码
–response.headers是返回http的头信息
–response.xpath()允许使用xpath语法选择内容
–response.css()允许使用css选择内容
selector
-选择器 允许用户通过选择器来选择内容
分布式爬虫
多爬虫问题
-数据共享
-在空间上不同的多台机器,可以成为分布式
需要做:
-共享队列
-去重
数据库Redis
-内存数据库
-同时可以落地保存到硬盘
-可以去重
-可以把它理解成dict,set,list集合体
-可以对保存的内容进行生命周期控制
settings中设置队列是远程的
内容保存数据库
-MongoDB
-Mysql等传统关系数据库
安装scrapy_redis
-pip install scrapy_redis
-github.com/rolando/scrapy-redis
-官方文档scrapy-redis.readthedocs.org
推荐书籍
——Python爬虫开发与项目实战,范传辉 机械工业出版社
——精通爬虫框架scrapy 李斌翻译 人民邮电出版社
——崔庆才
****************** 成为一个爬虫专家 这几本书必须要看
Scrapy提供了一种简便的方式来查看表达式是否正确、是否真的起作用。另起一个命令行窗口,在其中输入scrapy shell“http://www.cnblogs.com/qiyeboy/default.htmlpage=1”,记得后面的URL加上双引号,效果如图12-7所示。
urllib的parse模块
handler学习
re正则表达式中小括号的作用
使用chardet解决由于Requests猜测编码错误,导致解析文本出现了乱码的问题
也由此在使用xpath提取内容时需要使用etree.html将t.text转化为html格式
strip把找到内容去掉空格,完成基本清洗