windows anaconda 移动位置 (windows10 从C盘移动到D盘)

windows anaconda 移动位置 (windows10 从C盘移动到D盘),再具体一些笔者的情况是:anaconda在window10的环境下,从C盘迁移到D盘,基本的操作跟大家搜索其它教程都差不多,而且笔者也是参考了其它很多的教程。只是,笔者有一些地方与其它教程有出入。特此记录

Anaconda的环境安装虚拟环境的创建,在本站以前的文章中有具体的说明,此处不再复述。

迁移

直接在C盘找到anaconda的安装目录,将整个文件剪切到D盘。如笔者直接把 anaconda3这个文件夹放在了D盘的根路径下,这样的路径就是 D:\anaconda3,笔者的整个文件夹总的容量已经达到40多G了….

后续问题

不修改环境变量

有很多博文到了这一步是让读者去修改环境变量,但是笔者并没有修改环境变量,因为在环境变量里压根就没有anaconda的任何信息

修改environments.txt

environments.txt 一般是存放虚拟环境路径的文件,它一般在C:\Users\usrname\.conda的路径下,笔者把它们都修改成了anaconda3移动到D盘后的位置。修改后如下

D:\anaconda3
D:\anaconda3\envs\python3.6
D:\anaconda3\envs\python3.5
...
D:\anaconda3\envs\spider
D:\anaconda3\envs\gpt2

修改电脑开始菜单快捷方式

电脑开始菜单的快捷方式在我们移动完anaconda3文件夹之后就已经完全失效,不能再打开了,点击的时候可能会出现如下的一些错误

  • 快捷方式已经失效是否删除
  • This application failed to start because no Qt platform plugin: 这是运行Anaconda Navigator报错
  • conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 这是运行Anaconda PowerShell Prompt报错。

以上三个问题是迁移后的主要问题,其它很多的附带问题都可以通过解决这几个问题来得到附带处理掉。而快捷方式失效是首要需要解决的问题

让快捷方式可以生效的解决方案,笔者参考了《windows下将Anaconda从C盘迁移至D盘(其他盘)》博文的内容,主要借鉴的是就是在新的anaconda目录下执行以下命令,来使得快捷方式能找到新的目录位置,操作如下:

  1. 进入D:\ananconda3。在此路径下打开cmd dos命令窗口–如果渎职无法在cmd命令窗口进入到D盘可以参考《win10如何做到在指定目录下打开cmd命令窗口》对cmd窗口权限进行修改。
  2. cmd命令窗口确定进入到D:\anaconda3路径后,输入以下命令,因为此时我们的环境已经混乱了,所以直接就用anaconda路径里存的python可执行脚本来执行命令
    python.exe .\Lib\_nsis.py mkmenus
    命令执行之后,快捷方式就可以点击了,且不再提示快捷方式失效的。此时开始报错…..

Anaconda Navigator 运行报错的处理方案笔者主要是参考了《运行Anaconda Navigator报错:This application failed to start because no Qt platform plugin》,其主要的处理思路就是:

把Anaconda路径下的 platforms 拷贝出来
.\Anaconda3\pkgs\qt-**\Library\plugins目录下的platforms文件夹复制黏贴到Anaconda的根路径下,例如笔者并没有完全按照参考把qt-5,9,7**的platforms拷贝出来,而是拷贝了最新的qt-5.12.9**里的,如何判断最新可以从时间上看,但是时间如果有些迷惑你的话就直接把qt后边数字大的platforms拷贝到anaconda根路径下,如笔者的拷贝完就是 D:\anaconda3\platforms

Anaconda Navigator 运行报错处理方案

到了这一步,电脑开始菜单里的 Anaconda Navigator快捷键就应该可以用了。

接下来是 电脑开始菜单 Anaconda PowerShell Prompt 快捷方式的处理,现在点击它应该还在报错。但是我们不要去点击,直接在快捷图标上 右键 –>(更多) –> 打开文件夹位置,一般会在类似路径下C:\Users\username\…\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit),看到如下文件;直接在文件上 右键–> 属性

anaconda开始菜单快捷方式文件

直接在文件 Anaconda Powershell Prompt文件上 右键–> 属性,弹出如下图,我们直接将快捷方式 -目标 的值拷贝出来, 就会看到这个目标要执行的命令, 而命令中涉及到的路径还是anaconda在C盘时的路径 ,我们要把它们修改成现在的anaconda路径地址。

Anaconda Powershell Prompt 属性
# 属性目标值修改前
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\Users\...\AppData\Local\Continuum\anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\Users\...\AppData\Local\Continuum\anaconda3' "

# 属性目标值修改后
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'D:\anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'D:\anaconda3' "

我们从上边修改的命令中可以看到一个叫做conda-hook.ps1的文件,这个文件的内容也是需要改的,不然依旧会报错。修改的内容依旧是路径,读者去自己的anaconda文件夹对应的目录下,找到这个文件打开它编辑就可以看到了,所有的路径都改。

至此,整个anaconda迁移工作就算是完成了,当然如果读者在别的IDE中有引用anaconda环境的话需要去对应的IDE做调整即可。笔者建议读者修改完后,把Anaconda Navigator打开,每个虚拟环境都点一点,让它自己刷新更新一下。

Jaccard similarity coefficient 杰卡德相似系数 基础闲话

Jaccard similarity coefficient(杰卡德相似系数)是一种计算相似度的基础算法 。Jaccard距离常用来处理仅包含非对称的二元(0-1)属性的对象. 计算的数据是二进制集合,集合中的元素只有0和1两个值,1表示元素存在,0是不存在该元素。因此,该算法适合一些特征相对稀疏的情况来使用,有限个的特征二进制集合作为输入得到不同事物(如文本相似、数据聚类等)。

基础概念

集合

若存在集合A = {1,2,3} ;B = {2, 3, 4};

并集: AB = {1, 2, 3, 4}

交集:AB = {2, 3}

集合基数

  • 集合论中刻画任意集合大小的一个概念, 数学概念中一般用card表示
  • 表示集合的元素个数, 如a =[1,3,4], card(a) = 3,即基数是3

二进制集合

  • 元素只有0和1两种,分别表示此位置的元素存在与不存在
  • 如果元素是0,则基数计算是不做统计。如card([1,0,0,1]) = 2

杰卡德距离

向量A:(0,0,1,1,1,0,1)

向量B:(1,0,1,0,1,0,0)

A∩B = 2 -- 对应位置都为1
A∪B = 5 -- 1 至少出现一次的位置
Jaccard distance

python实现

a = list('0011101')
b = list('1010100')
c = [1 if (i1 == i2 and i1=='1') else 0 for (i1, i2) in zip(a, b,)]
d = [1 if (i1 == '1' or i2=='1') else 0 for (i1, i2) in zip(a, b,)]

print(c, d)
jc = len([i for i in c if i==1]) / len([i for i in d if i ==1])
js = 1 - jc
print(js)

输出结果为: (c, d) = [0, 0, 1, 0, 1, 0, 0] [1, 0, 1, 1, 1, 0, 1]
js = 0.6

python 爬虫 闲话 基础入门

说在前面的话

  • python在自身历史版本中主要是python2和python3。我们不去表述各种的python实现,用C(CPython)\C++(Pyston)\Java(Jython)\C#(IronPython)\Ruby\JS都有, 我们只去说一下基于python3的最基础的使用和应用。当然很多的教程是以python2来写的,如果我们遇到其实并不影响我们去学习。
  • 浏览器主要是Chrome

一钱思路

  1. 拿到http://**.com/path/to/page 的地址, 将地址在浏览器(Chrome)中打开
  2. 在浏览器加载完地址且能看到你想看到的页面后,按F12 或者 直接在页面 右键=> 点击检查 ,页面会在某一个侧(默认是页面的右侧或者下侧)弹出如下图的 开发者工具, 图中的标红的箭头、 Elements、Network很关键,几乎是囊括了web爬虫所需的所有前置条件。
Chrome开发者工具
  1. 一般是箭头和Elements组合来使用,使用的目的是什么?就是确定你要爬取的数据在页面的什么地方。 步骤是:先点击Elements,它的紧下侧会有强调横线出现,同时整体下方出现的是html源码页面,看到<!DOCTYPE html> 就是了; 然后点击最左侧的箭头,箭头的颜色会变成蓝色或者颜色加重,随后把鼠标慢慢挪到真正的页面内容上,就会发现不一样了,这个时候html 源码页面的光标会随着你的鼠标在实际的可见页面移动而移动。而且点击一下实际可见页面的随意内容,html源码的光标就会立刻停在源码的位置, 实际页面不会发生变化。
  2. Elements + 箭头的 页面定位操作, 每一次定位 箭头都要从新点击一次。
  3. 对于Network点击后看到的是页面加载时的所有页面接口,如果说Elements + 箭头对应的静态页面内容的话,Network对应的就是动态加载的数据;明确哪些数据是有哪个接口提供的以及这个接口需要什么参数、cookie等关键性的请求依据都是从Network获取的
  4. 如果在浏览器中输入的地址没有得到具体的页面,而是一个登陆页面,此时就需要箭头+Elements+Network一起上了, 先用箭头+Elements明确登陆页面的需要输入的元素在哪里,在葱Network中确定登陆接口;如果登陆需要验证码还要从第三方的接口或者验证码的破解来辅助登陆。
  5. 以上都是基于浏览器可以直接看到数据的情况,如果页面是纯粹的动态加载,那么就要涉及到对页面js的逆向工程及更深层次的技术,此处不做深入谈论; 而如何确定页面是不是动态加载的呢?这个可以在Elements中找到答案, 去Elements的html页面查询真实页面的数据项,如果查不到基本上可以确定数据项是动态加载的, 这个时候需要去Network中找跟我们地址url对应到接口来确定页面数据是由哪个接口来动态提供的。如果只是简单需求可以用Selenium解决这个问题

二两概念

  1. request 和 response是什么?

request :可以通俗理解成对页面发起网络请求response: 可以通俗理解成对网页请求后,响应返回的数据request和response在很多类或者方法定义的主要关键字,又或者是约定成俗的写法; 在爬虫任务进行时的信息数据的两个不同的流向代表。

  1. 能抓取怎样的数据?

网页文本、图片、视频、二进制流

  1. 解析方式有哪些?

直接处理、json解析、正则表达式、beautifulsoup、pyquery 、 Xpath

  1. 怎样解决js渲染的问题?

分析Ajax请求、用selenium / webdriver、Splash、Pyv8

三分技术

  1. requests (请求页面)
  1. xpath (解析页面)
  • xpath是一门在 XML 文档中查找信息的语言,说的通俗点就是我们爬取的网页是一种有着基本款式和样式的本文信息, xpath就可以解析这些信息,从而取到我们想要的内容。
  • xpath是一种技术,在python中常用的库是 lxml
  • 为啥要用xpath先在页面搞一下? 因为我们不知道页面是什么样的,那么爬取到数据后我们也没有办法知道取哪里的信息为我所用,所有要运行所有的爬取程序之前先用浏览器目测一下具体哪些内容可以怎么接下下来。
  • xpath入门连接: https://www.runoob.com/xpath/xpath-tutorial.html
  • 实际使用中, 以chrome浏览器为例,chrome浏览器是有自己的插件的,这个插件叫做XPath Helper, 它的作用是直接从页面可以快速的获取页面中我们想要的内容的xpath路径。如果是其它浏览器的基本操作前边也都是一样的,只是需要人工来找到想要内容的xpath路径,这样就需要爬虫代码的编写者非常熟悉xpath语法了。
  • 无论是否是chrome浏览器,在看一个页面的元素xpath路径时都是有一个基本的步骤的
1、用浏览器(IE 和 chrome为例)打开想要爬取的页面地址
2、页面上任何位置 右键 --> 检查 (检查元素)  或者直接按 F12 (不同浏览器说辞可能不一样,但是含义是相同的),会看到浏览器的下方或者右侧弹出如下两张图的界面,最左侧的箭头+方块的图标选中后就可以在页面选择元素了,也可以直接在弹出的界面中的页面源码中选择元素
import requests
from lxml import etree
if __name__ == __main__:
    headers = {
        User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
    }
    url = https://anqiu.58.com/ershoufang/
    page_text = requests.get(url = url,headers = headers).text
    tree = etree.HTML(page_text)
    li_List = tree.xpath(//section【@class = list】/div)
    fp = open(58.txt,w,encoding=utf-8)
    for li in li_List:
        title = li.xpath(./a/div【2】//div/h3/text())【0】
        print(title)
        fp.write(title+\n)
  1. 正则表达式 (解析页面)
    1. 通过网页请求requests返回的数据取得text文本内容
    2. 通过python的re 正则库,可以对文本内容进行正则匹配从而解析到想要的数据内容
  1. BeautifulSoup4 (解析页面)
  • BeautifulSoup也是python的一个库,类似于xpath同样是对页面进行解析,实现原理有所不同,它是基于DOM的,解析后可以按照DOM树对页面进行提取数据,懂得css等前端技术的人用起来会更顺手,且相对于xpath要API非常人性化,支持css选择器
  • 灵活性和性能来说bs4没有xpath好用
  • 文档传送门: https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
  1. Selenium: 它本身是Web应用程序测试的工具,直接在浏览器中运行, 所以它可以做到像浏览器一样把数据全部都加载出来,这样一来哪怕是动态加载也是可以拿到加载后的数据的。它本身是专门针对测试的工具 ,所有还是测重测试方向,官网传送门: https://www.selenium.dev/;而python调用selenium的API文档可以在这里看到 https://selenium-python.readthedocs.io/ 网站中有详细的说明以及对Drivers的下载链接地址。
  2. Scrapy 分布式爬虫框架,

主要步骤: 创建工程、爬虫文件、执行

  • scrapy startproject xxxPro
  • 在项目目录下输入: scrapy genspider spiderName www.XXX.com 创建爬虫文件
  • 框架会自动创建所有需要的items pipline settings.py 中间件等默认文件,而开发者只需要去根据需求去修改对应的文件来完成整个爬虫任务的构建即可
  • 在项目目录下执行: scrapy crawl spiderName