美文网首页
虚拟环境

虚拟环境

作者: 月夜星空下 | 来源:发表于2021-01-13 17:49 被阅读0次

    为什么需要虚拟环境:

    到目前位置,我们所有的第三方包安装都是直接通过pip install xx的方式进行安装的,这样安装会将那个包安装到你的系统级的Python环境中。但是这样有一个问题,就是如果你现在用Django 1.10.x写了个网站,然后你的领导跟你说,之前有一个旧项目是用Django 0.9开发的,让你来维护,但是Django 1.10不再兼容Django 0.9的一些语法了。这时候就会碰到一个问题,我如何在我的电脑中同时拥有Django 1.10Django 0.9两套环境呢?这时候我们就可以通过虚拟环境来解决这个问题。

    虚拟环境原理介绍:

    虚拟环境相当于一个抽屉,在这个抽屉中安装的任何软件包都不会影响到其他抽屉。并且在项目中,我可以指定这个项目的虚拟环境来配合我的项目。比如我们现在有一个项目是基于Django 1.10.x版本,又有一个项目是基于Django 0.9.x的版本,那么这时候就可以创建两个虚拟环境,在这两个虚拟环境中分别安装Django 1.10.xDjango 0.9.x来适配我们的项目。

    安装virtualenv

    virtualenv是用来创建虚拟环境的软件工具,我们可以通过pip或者pip3来安装:

    <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n9" mdtype="fences" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;"> pip install virtualenv
    pip3 install virtualenv</pre>

    <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n12" mdtype="fences" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;"> virtualenv [虚拟环境的名字]</pre>

    <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n25" mdtype="fences" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;"> virtualenv -p C:\Python36\python.exe [virutalenv name]</pre>

    1. 创建虚拟环境:

      <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n39" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">mkvirtualenv my_env</pre>

      那么会在你当前用户下创建一个Env的文件夹,然后将这个虚拟环境安装到这个目录下。 如果你电脑中安装了python2python3,并且两个版本中都安装了virtualenvwrapper,那么将会使用环境变量中第一个出现的Python版本来作为这个虚拟环境的Python解释器。

    2. 切换到某个虚拟环境:

      <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n43" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">workon my_env</pre>

    3. 退出当前虚拟环境:

      <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n46" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">deactivate</pre>

    4. 删除某个虚拟环境:

      <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n49" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">rmvirtualenv my_env</pre>

    5. 列出所有虚拟环境:

      <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n52" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">lsvirtualenv</pre>

    6. 进入到虚拟环境所在的目录:

      <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="shell" cid="n55" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">cdvirtualenv</pre>

      <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n60" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;"> mkvirtualenv --python==C:\Python36\python.exe qf_env</pre>

      这是一个库 python用来操作url的模块 https://docs.python.org/2.7/library/urllib2.html

      • urllib2 python2.7自带 不需要安装 导入即可
      • urllib2 在 python3中升级到了 urllib.request

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="python" cid="n267" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;"># -- coding:utf-8 --
      import urllib2

      url = 'http://www.baidu.com/'

      urlopen需要三个参数

      url 你要抓取的url

      data 默认为None 为none说明get 请求 如果你data不为none 就认为是post请求

      timeout 超时时间

      res = urllib2.urlopen(url, data=None)

      print res

      print res.read() #返回所有的内容

      print res.readline() #按照行返回

      print res.readlines() #返回所有的行

      print res.getcode() #获取客户端请求的状态

      print res.geturl() #获取请求的url

      print res.code

      print res.read().decode('utf-8')

      encode</pre>

      第一个反反爬

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="python" cid="n270" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">User-Agent 伪造请求头 http://www.jsons.cn/useragent/ User-Agent在线解析

      -- coding:utf-8 --

      import urllib2

      headers = {
      "User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
      }

      url后边要加上/

      url = "http://www.baidu.com/"

      创建请求对象

      res = urllib2.Request(url,headers=headers)

      print res.get_full_url() #获取完整的url
      print res.get_method() #获取请求方法
      print res.get_header("User-agent") #获取 浏览器的名称
      print res.get_host() #host名称
      print res.get_type() #协议名称
      res.add_header("Connection","keep-alive") #wang header头中添加请求信息

      print res.get_header("Connection")
      </pre>

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="python" cid="n272" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">模拟百度搜索

      -- coding:utf-8 --

      import os
      import urllib
      import urllib2

      urllib 和 urllib2 的区别:

      urllib仅仅接收url 能用urlencode 进行编码 urllib.urlencode()

      urllib2 可以接收设置了 headers 的 Request类

      以上 就让我们经常两个搭配来使用

      https://www.baidu.com/s?wd=美女

      def baidu_search(params):

      headers = {
          "User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
      }
      
      url = "http://www.baidu.com/s?"+params
      
      requests = urllib2.Request(url,headers=headers) #创建请求对象
      #print requests
      response = urllib2.urlopen(requests)  #把请求对象传给 requests
      #print response
      print response.read()  #读取内容  
      
      dir = './'
      os.chdir(dir)
      file = urllib2.urlopen(url).read()
      open('baidu.html',"wb").write(file)   #保存页面  
      print "OK"
      

      if name == "main":
      kw = raw_input("请输入要查找的内容")
      params = {
      'wd':kw #拼接参数
      }
      params = urllib.urlencode(params) #将字典传承字符串参数
      baidu_search(params)

      </pre>

      python3 爬虫

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n275" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">import urllib
      from urllib import request

      headers = {
      "User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
      }

      url

      url = "http://www.baidu.com/"

      创建请求对象

      req =urllib.request.Request(url,headers=headers)

      发送请求 获取响应

      responses = urllib.request.urlopen(req)

      print(responses)#二进制

      print(""30)

      print(responses.read())

      print(""30)

      print(responses.read().decode('utf-8'))#解码

      字符串->字节 encode

      字节-> 字符串 decode </pre>

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n277" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">python3模拟百度搜索
      from urllib import request
      import urllib.parse
      headers = {
      "User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
      }

      /s?wd=

      kw = input("请输入关键字:")
      params = {
      'wd':kw
      }

      将字典解析成参数字符串

      params=urllib.parse.urlencode(params)
      print(params)

      创建url

      url = 'http://www.baidu.com/s?'+params

      创建请求对象

      requests= urllib.request.Request(url,headers=headers)
      responses = urllib.request.urlopen(requests)

      print(responses.read().decode('utf-8'))

      print(responses.status)

      print(responses.dict)
      </pre>

      python3 urllib 下载

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n280" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">import urllib.request

      第一个参数 要下载的url

      第二个参数 文件存放的路径

      request.urlretrieve("http://www.so.com/",r"baidu.html")

      http://www.baidu.com/?username=中文&password=afdsf

      url中只能写 -_.a-z 如果中文需要转义 urllib.parse.quote 解码 urllib.parse.unquote

      urllib.request.urlretrieve("http://p1.so.qhimgs1.com/bdr/576__/t01ff3c9aedf92d7281.jpg",r"苍老师.jpg")

      strings = 'http://www.baidu.com/?username=中文&password=afdsf'

      print(urllib.parse.quote(strings))

      strings = 'http%3A//www.baidu.com/%3Fusername%3D%E4%B8%AD%E6%96%87%26password%3Dafdsf'
      print(urllib.parse.unquote(strings))</pre>

      抓取前程无忧

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n283" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">import re
      import urllib.request

      headers = {
      "User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
      }

      获取前程无忧的接口

      url = "https://search.51job.com/list/040000%252C010000,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="

      抓取数据 创建请求对象

      req = urllib.request.Request(url,headers=headers)

      获取服务器响应数据

      response = urllib.request.urlopen(req)

      print(response)

      解码

      html = response.read().decode('gbk')

      print(html)

      print(type(html))

      处理数据 拿到标签中间所有的内容

      jobnum_re = '<div class="rt">(.*?)</div>'
      coms = re.compile(jobnum_re,re.S)
      strs = coms.findall(html)[0]

      print(strs)

      贪婪模式 非贪婪模式

      非贪婪模式加上 ? 变成了 贪婪模式

      取出 纯数字

      num_re = '.?(\d+).'
      num = re.findall(num_re,strs)

      print(num)

      print(int(num[0]))

      获取第一个岗位信息

      jobname_re = '<div class="el">(.*?)</div>'
      joblist = re.findall(jobname_re,html,re.S)

      #print(joblist[0]) #这是第一个岗位的信息 多个标签

      #匹配岗位内容

      jobnameone_re = 'onmousedown="">(.*?)</a>'

      jobnameone_list = re.findall(jobnameone_re,joblist[1],re.S)

      print(jobnameone_list[0].strip())

      for job in joblist:
      jobnameone_re = 'onmousedown="">(.*?)</a>'
      jobnameone_list = re.findall(jobnameone_re, job, re.S)
      print(jobnameone_list)
      #print("岗位名称:",jobnameone_list[0].strip())

      </pre>

      网易云音乐

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n286" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">import json
      import urllib.request
      import urllib.parse

      headers = {
      "User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
      }
      url = 'https://music.163.com/weapi/v1/resource/comments/A_PL_0_2386637465?csrf_token='
      data = {
      "params": "IMMh0aWzreEhrbqaIjYKCkSvKIarMpJsMTcQ92b4lDOnlOZ6bNlkE/rAPDWDjIIOcdLHuLvuWk6tOvAe8r0JU93bUs1peT2w5Zc1zoiUVTAXXJaJOI9ZUp02VLLA/aqPh3ugCeE9T/oXYMknnASO25t8lhFcRpM3TAPArQsYhYqBCp0lBsifqnxktlMfN8jhBwXXxJzq2v2dtXIb9K7oMLeySbFgz4Rx+sC3olkP4fQ=",
      "encSecKey": "0afc0ae61575480fd9bc168ef82df0d0ed2c699657f91000baf019f14600d19882d1334bb2f5703c658f6300c57935bd8278183765a5aeaa773c25673b24a125584cefee6d30cebc6fb3f40891a8e047b1626e091dfaf0279de90104af64eec23411f560d14278fe69b28bb292a883b58747ae5a03357ea243d3832f1c64b9a6"
      }

      将post请求传入二进制参数

      data = urllib.parse.urlencode(data).encode()

      print(data)

      创建请求对象 加上data 就变成了post请求

      req = urllib.request.Request(url,headers=headers,data=data)

      获取返回数据

      response = urllib.request.urlopen(req)
      content = response.read().decode()
      print(content)

      comments_list = json.loads(content)
      host_comments = comments_list['hotComments']
      for contents in host_comments:
      nickname = contents['user']['nickname']
      content = contents['content']
      print(nickname,":",content)

      </pre>

      豆瓣

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n289" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">import json
      import urllib.request

      headers = {
      "User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
      }
      for i in range(100):
      url = "https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=%d"%(im
      requests = urllib.request.Request(url,headers=headers)
      responses = urllib.request.urlopen(requests)
      content = responses.read().decode()
      #print(content) #json 数据

      data = json.loads(content)
      print(data)
      data_list = data.get('data')
      for movie in data_list:
          title = movie['title']
          casts = movie['casts']
          print("电影名:%s 主演:%s" %(title,casts))
      

      </pre>

      作业 抓取 阿里招聘

      https://job.alibaba.com/zhaopin/positionList.htm 抓取前10页 并写入页面

      学历、部门、岗位要求、工作经验

      urllib 库

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n255" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">请求 (Request) 部分详解
      1. Headers —— 显示客户端发送到服务器的 HTTP 请求的 header, 显示为一个分级视图,包含了 Web 客户端信息、Cookie、传输状 态等。
      2. Textview——显示POST请求的body部分为文本。
      3. WebForms——显示请求的GET参数和POSTbody内容。
      4. HexView——用十六进制数据显示请求。
      5. Auth——显示响应header中的Proxy-Authorization(代理身份验
      证) 和 Authorization(授权) 信息.
      6. Raw——将整个请求显示为纯文本。
      7. JSON-显示JSON格式文件。
      8. XML——如果请求的body是XML格式,就是用分级的XML树来
      显示它。

      响应 (Response) 部分详解

      1. Transformer——显示响应的编码信息。
      2. Headers——用分级视图显示响应的header。
      3. TextView——使用文本显示相应的body。
      4. ImageVies——如果请求是图片资源,显示响应的图片。
      5. HexView——用十六进制数据显示响应。
      6. WebView——响应在Web浏览器中的预览效果。
      7. Auth——显示响应header中的Proxy-Authorization(代理身份验
      证) 和 Authorization(授权) 信息。
      8. Caching——显示此请求的缓存信息。
      9. Privacy——显示此请求的私密(P3P)信息。
      10. Raw —— 将整个响应显示为纯文本。
      11. JSON-显示JSON格式文件。
      12. XML —— 如果响应的 body 是 XML 格式,就是用分级的 XML 树
      来显示它 。
      </pre>

      fidder

      Chrome浏览器是一个非常亲近开发者的浏览器。可以方便的查看网络请求以及发送的参数。对着网页右键->检查。然后就可以打开开发者选项。

      Chrome抓包工具:

      503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

      502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

      501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。

      500:服务器内部错误。可能是服务器出现bug了。 重点

      404:没有找到 处理方式:丢弃重点

      403:服务器拒绝访问,权限不够。重点

      401:未授权 处理方式:丢弃

      400:请求的url在服务器上找不到。换句话说就是请求url错误。重点

      304:请求的资源未更新 处理方式:丢弃,使用本地缓存文件

      302:临时重定向。比如在访问一个需要登录的页面的时候,而此时没有登录,那么就会重定向到登录页面。 重点

      300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃 301:永久重定向。比如在访问www.360buy.com的时候会重定向到www.jd.com。 重点

      204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃

      202:请求被接受,但处理尚未完成 处理方式:阻塞等待

      201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到

      200:请求成功 处理方式:获得响应的内容,进行处理. 重点

      102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。

      101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。

      100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。

      常见的http状态码

      常见响应状态码:

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n229" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;">常⽤的请求报头

      1. Host
        Host:对应⽹址 URL 中的 Web 名称和端⼝号,⽤于指定被请求资源的
        Internet 主机和端⼝号,它通常从 HTTP URL 中提取出来的

      2. Connection
        Connection:表示客户端与服务连接类型
        1.Client 发起⼀个包含 Connection:keep-alive 的请求,HTTP/1.1 使⽤keep-alive为默认值。
        2.Server 收到请求后:
        如果 Server ⽀持 keep-alive,回复⼀个包含 Connection:keep-alive的响应,不关闭连接;
        如果 Server 不⽀持 keep-alive,回复⼀个包含 Connection:close 的响应,关闭连接。
        3.如果 client 收到包含 Connection:keep-alive 的响应,向同⼀个连接发送下⼀个请求,直到⼀⽅主动关闭连接。keep-alive 在很多情况下能够重⽤连接,减少资源消耗,缩短响应时间,⽐如当浏览器需要多个⽂件时(⽐如⼀个 HTML⽂件和相关的图形⽂件),不需要每次都去请求建⽴连接。

      3.Upgrade-Insecure-Requests
      Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资 源时⾃动替换成 https 请求,让浏览器不再显示 https⻚⾯中的 http 请求警报。
      HTTPS 是以安全为⽬标的 HTTP 通道,所以在 HTTPS 承载的⻚⾯上不允许出现 HTTP 请求,⼀旦出现就是提示或报错,但是很多⽹站对 https 没有技术概念,在填⼊的数据中不免出现 http 的资源

      4.User-Agent User-Agent:是客户浏览器的名称,以后会详细讲。

      5.Accept
      Accept:指浏览器或其他客户端可以接受的 MIME(Multipurpose Internet Mail Extensions(多⽤ 途互联⽹邮件扩展))⽂件类型,服务器可以根据它判断并返回适当的⽂件格式。
      举例:
      Accept: / :表示什么都可以接收。
      Accept:image/gif :表明客户端希望接受 GIF 图像格式的资源;
      Accept:text/html :表明客户端希望接受 html⽂本。
      Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8 :表示
      浏览器⽀持的 MIME 类型分别是 html⽂本、xhtml 和 xml⽂档、所有的图像格式资源。
      q 是权重系数,范围 0 =< q <= 1,q 值越⼤,请求越倾向于获得其“;”之前的类型表示的内容。若没有指 定 q 值,则默认为 1,按从左到右排序顺序;若被 赋值为 0,则⽤于表示浏览器不接受此内容类型。
      Text:⽤于标准化地表示的⽂本信息,⽂本消息可以是多种字符集和或者多种格式的;Application:⽤于传 输应⽤程序数据或者⼆进制数据。详细请点击

      6.Referer
      Referer:表明产⽣请求的⽹⻚来⾃于哪个 URL,⽤户是从该 Referer⻚⾯访问到当前请求的⻚⾯。这个属 性可以⽤来跟踪 Web 请求来⾃哪个⻚⾯,是从 什么⽹站来的等。

      7.Accept-Encoding
      Accept-Encoding:指出浏览器可以接受的编码⽅式。编码⽅式不同于⽂件格式,它是为了压缩⽂件并加速⽂ 件传递速度。浏览器在接收到 Web 响应之后先解码,然后再检查⽂件格式,许多情形下这可以减少⼤量的下 载时间。
      举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
      如果有多个 Encoding 同时匹配, 按照 q 值顺序排列,本例中按顺序⽀持 gzip,
      identity 压缩编码,⽀持 gzip 的浏览器会返回经过 gzip 编码的 HTML⻚⾯。如 果请求消息中没有设置 这个域服务器假定客户端对各种内容编码都可以接受。

      8.Accept-Language
      Accept-Langeuage:指出浏览器可以接受的语⾔种类,如 en 或 en-us 指英语,zh 或者 zh-cn 指中 ⽂,当服务器能够提供⼀种以上的语⾔版本时要⽤到。

      9.Accept-Charset
      Accept-Charset:指出浏览器可以接受的字符编码。
      举例:Accept-Charset:iso-8859-1,gb2312,utf-8
      ISO8859-1:通常叫做 Latin-1。Latin-1 包括了书写所有⻄⽅欧洲语⾔不可缺少的附加字符,英⽂浏览器的默认值是 ISO-8859-1. gb2312:标准简体中⽂字符集;
      utf-8:UNICODE 的⼀种变⻓字符编码,可以解决多种语⾔⽂本显示问题,从⽽实现应⽤国际化和本地化。
      如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

      10.Cookie
      Cookie:浏览器⽤这个属性向服务器发送 Cookie。Cookie 是在浏览器中寄存 的⼩型数据体,它可以记载和服 务器相关的⽤户信息,也可以⽤来实现会话 功能。

      11.Content-Type
      Content-Type:POST 请求⾥⽤来表示的内容类型。
      举例:Content-Type = Text/XML; charset=gb2312:
      指明该请求的消息体中包含的是纯⽂本的 XML 类型的数据,字符编码采⽤“gb2312”。

      服务端 HTTP响应 HTTP 响应也由四个部分组成,分别是: 状态⾏ 、 消息报头 、 正⽂ 、 响 应

      常⽤的响应报头(了解)
      理论上所有的响应头信息都应该是回应请求头的。但是服务端为了效率,安全,还有其他⽅⾯的考虑,会添加相对应的响应头信息,从上图可以看到:

      1. Cache-Control:must-revalidate, no-cache,
        private。

        这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要从新请求服务器,不能从缓存副本中获取资源。
        Cache-Control 是响应头中很重要的信息,当客户端请求头中包含 Cache- Control:max-age=0 请求,明确表示不会缓存服务器资源时,Cache-
        Control 作为作为回应信息,通常会返回 no-cache,意思就是说,"那就不 缓存呗"。
        当客户端在请求头中没有包含 Cache-Control 时,服务端往往会定,不同的资源不同的缓存策略,⽐如说 oschina 在缓存图⽚资源的策略就是Cache-Control:max-age=86400,这个意思是,从当前时间开始,在
        86400 秒的时间内,客户端可以直接从缓存副本中读取资源,⽽不需要向服务器请求。

      2. Connection:keep-alive
        这个字段作为回应客户端的 Connection:keep-alive,告诉客户端服务器的
        tcp 连接也是⼀个⻓连接,客户端可以继续使⽤这个 tcp 连接发送 http 请求。

      3. Content-Encoding:gzip
        告诉客户端,服务端发送的资源是采⽤gzip 编码的,客户端看到这个信息后,应该采⽤gzip 对资源进⾏解码。

      4. Content-Type:text/html;charset=UTF-8
        告诉客户端,资源⽂件的类型,还有字符编码,客户端通过 utf-8 对资源进
        ⾏ 解码,然后对资源进⾏html 解析。通常我们会看到有些⽹站是乱码的, 往往 就是服务器端没有返回正确的编码。
        5. Date:Sun, 21 Sep 2014 06:18:21 GMT

      这个是服务端发送资源时的服务器时间,GMT 是格林尼治所在地的标准时间。http 协议中发送的时间都是 GMT 的,这主要是解决在互联⽹上,不同时区在相互请求资源的时候,时间混乱问题。

      1. Expires:Sun, 1 Jan 2000 01:00:00 GMT
        这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不⼀定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有 Cache- Control:max-age=*这个响应头准确的,因为 max-age=date 中的 date 是个相 对时间,不仅更好理解,也更准确。

      2. Pragma:no-cache 这 个含义与 Cache-Control 等同。

      3. Server:Tengine/1.4.6
        这个是服务器和相对应的版本,只是告诉客户端服务器的信息。

      4. Transfer-Encoding:chunked
        这个响应头告诉客户端,服务器发送的资源的⽅式是分块发送的。⼀般分块发送的资源都是服务器动态⽣成的,在发送时还不知道发送资源的⼤⼩,所以采⽤分块发送,每⼀块都是独⽴的,独⽴的块都能标示⾃⼰的⻓度,最后
        ⼀块是 0⻓度的,当客户端读到这个 0⻓度的块时,就可以确定资源已经传输完了。

      5. Vary: Accept-Encoding
        告诉缓存服务器,缓存压缩⽂件和⾮压缩⽂件两个版本,现在这个字段⽤处并不⼤,因为现在的浏览器都是⽀持压缩的。
        </pre>

      6. User-Agent:浏览器名称。这个在网络爬虫中经常会被使用到。请求一个网页的时候,服务器通过这个参数就可以知道这个请求是由哪种浏览器发送的。如果我们是通过爬虫发送请求,那么我们的User-Agent就是Python,这对于那些有反爬虫机制的网站来说,可以轻易的判断你这个请求是爬虫。因此我们要经常设置这个值为一些浏览器的值,来伪装我们的爬虫。

      7. Referer:表明当前这个请求是从哪个url过来的。这个一般也可以用来做反爬虫技术。如果不是从指定页面过来的,那么就不做相关的响应。

      8. Cookiehttp协议是无状态的。也就是同一个人发送了两次请求,服务器没有能力知道这两个请求是否来自同一个人。因此这时候就用cookie来做标识。一般如果想要做登录后才能访问的网站,那么就需要发送cookie信息了。

      http协议中,向服务器发送一个请求,数据分为三部分,第一个是把数据放在url中,第二个是把数据放在body中(在post请求中),第三个就是把数据放在head中。这里介绍在网络爬虫中经常会用到的一些请求头参数:

      请求头常见参数:

      1. get请求:一般情况下,只从服务器获取数据下来,并不会对服务器资源产生任何影响的时候会使用get请求。

      2. post请求:向服务器发送数据(登录)、上传文件等,会对服务器资源产生影响的时候会使用post请求。 以上是在网站开发中常用的两种方法。并且一般情况下都会遵循使用的原则。但是有的网站和服务器为了做反爬虫机制,也经常会不按常理出牌,有可能一个应该使用get方法的请求就一定要改成post请求,这个要视情况而定。

      Http协议中,定义了八种请求方法。这里介绍两种常用的请求方法,分别是get请求和post请求。

      get、post、delete 、put 、patch

      常用的请求方法:

      在浏览器中请求一个url,浏览器会对这个url进行一个编码。除英文字母,数字和部分符号外,其他的全部使用百分号+十六进制码值进行编码。

      • scheme:代表的是访问的协议,一般为http或者https以及ftp等。

      • host:主机名,域名,比如www.baidu.com

      • port:端口号。当你访问一个网站的时候,浏览器默认使用80端口。

      • path:查找路径。比如:www.jianshu.com/trending/now,后面的trending/now就是path

      • query-string:查询字符串,比如:www.baidu.com/s?wd=python,后面的wd=python就是查询字符串。

      • anchor:锚点,后台一般不用管,前端用来做页面定位的。

      <pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n197" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;"> scheme://host:port/path/?query-string=xxx#anchor</pre>

      URLUniform Resource Locator的简写,统一资源定位符。 一个URL由以下几部分组成:

      url详解:

      1. 当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。

      2. 当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。

      3. 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。

      4. 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。

      在浏览器中发送一个http请求的过程:

      自定义端口号 :1024以前的 需要root权限

      0~127 都被系统占用了

      ftp:21 smtp:25 redis:6379

      https 443 scp: 22 mysql:3306 mongodb:27017

      http:80 ssh:22 pop3:110 memcached:11211

      HTTP协议:全称是HyperText Transfer Protocol,中文意思是超文本传输协议,是一种发布和接收HTML页面的方法。服务器端口号是80端口。 HTTPS协议:是HTTP协议的加密版本,在HTTP下加入了SSL层。服务器端口号是443端口

      什么是http和https协议: 基于TCP/IP协议

      1. 配置允许远程连接 tools-》options-》connections 左边倒数三个选中 右边第一列三个选中

      5.抓取https tools-》options-》https 选择左边前三个 右边 actions 添加证书到信任机构

      4.清空会话 点击X号 remove all 即可

      3.禁止抓包 file 第一个 取消对号即可

      select json /javascript/image

      select html

      2.左下角黑色框 输入指令

      下面是响应 response

      上面是请求 request

      右边分为上下:

      左边 会话窗口

      1.页面分为左右

      fiddler简单用法:

      http协议和Chrome抓包工具

      1. Python3.6开发环境。

      2. Pycharm 2017 professional版。

      3. 虚拟环境。virtualenv/virtualenvwrapper

      准备工具:

      2.用代理

      1.伪造用代理 user-agent

      反反爬虫:

      4.将get 改为post

      3.动态加载数据 替代静态页面

      2.js压缩混淆加密

      反爬虫:(面子、竞争对手) 1.验证码

      爬虫:最后赢的人 最后不是页面结构复杂、数据量大 而是 反爬虫人员

      爬虫 、反爬虫、反反爬虫 博弈最后赢家 必定是爬虫

      5.twisted 异步网络框架

      4.构建分布式 scrapy+redis

      3.动态模拟浏览器的行为 selenium 模拟浏览器 加载 js 等 获取验证码这些

      2.re\XPATH \beautifulsoup4(提取html、xml的库)\jsonpath\pyquery (网页解析库) 用来解析服务器的响应内容

      1.HTML

      爬虫需要掌握什么?

      django、flask、tornado

      1. PHP:PHP是世界是最好的语言,但他天生不是做这个的,而且对多线程、异步支持不是很好,并发处理能力弱。爬虫是工具性程序,对速度和效率要求比较高。

      2. Java:生态圈很完善,是Python爬虫最大的竞争对手。但是Java语言本身很笨重,代码量很大。重构成本比较高,任何修改会导致代码大量改动。爬虫经常要修改采集代码。

      3. C/C++:运行效率是无敌的。但是学习和开发成本高。写个小爬虫程序可能要大半天时间。

      4. Python:语法优美、代码简洁、开发效率高、支持的模块多。相关的HTTP请求模块和HTML解析模块非常丰富。还有Scrapy和Scrapy-redis框架让我们开发爬虫变得异常简单。

      为什么用Python写爬虫程序:

      1. 通用爬虫:通用爬虫是搜索引擎抓取系统(百度、谷歌、搜狗等)的重要组成部分。主要是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。

        百度、360、搜狗 抓取网页 、数据存储、数据处理、提供检索服务 (提供接口)

        robots 协议 :可以限制 百度、360等 可以爬什么 不可以爬哪些

        淘宝 不允许百度爬取

        仅仅是一个协议 完全可以不遵守

        如何让百度等爬取你的网站 需要提交robots协议

        SEO:

        pagerank值 (流量、点击率)值越高 排名越靠前

        百度、360竞价排名

        通用爬虫的缺点:

        1.抓取的数据太多了 好多没用的

        2.不会根据用户的需求 爬取数据

      2. 聚焦爬虫: 也叫专业爬虫 主题爬虫 是面向特定需求的一种网络爬虫程序,他与通用爬虫的区别在于:聚焦爬虫在实施网页抓取的时候会对内容进行筛选和处理,尽量保证只抓取与需求相关的网页信息。

        1. 根据自己的需求 设计爬取程序 然后抓取对应的数据即可

          通过聚焦爬虫如何抓取到数据?

        1.每个网页都有一个 统一资源定位符 URL

        2.网页都是有标签 组成

        3.遵循http、https协议

      通用爬虫和聚焦爬虫:

      4.如果页面中还有其它的url 那么我们再执行第二步

      3.提取有用的数据 进行存储

      2.通过http\https 协议获取对应的页面

      1 .确定爬取的url地址 放到队列中

      爬虫设计思路

      1. 项目需要 获取更多的数据 并且进行分析 形成分析报告 提供战略 分析

      2. 进行seo优化 搜索引擎喜欢爬经常更新的网站 爬取数据让网站内容每天更新

      为什么要学习爬虫

      1. 通俗理解:爬虫是一个模拟人类请求网站行为的程序。可以自动请求网页、并数据抓取下来,然后使用一定的规则提取有价值的数据。

      2. 专业介绍:百度百科

        蜘蛛网:

        搜索引擎 蜘蛛

        往:互联网

      什么是网络爬虫:

      1. 搜索引擎(百度、谷歌、360搜索等)。

      2. 伯乐在线。

      3. 惠惠购物助手。

      4. 数据分析与研究(数据冰山知乎专栏)。

      5. 抢票软件等。

      爬虫的实际例子:

      爬虫前奏

      在使用mkvirtualenv的时候,可以指定--python的参数来指定具体的python路径:

      创建虚拟环境的时候指定Python版本: 重点

      我的电脑->右键->属性->高级系统设置->环境变量->系统变量中添加一个参数WORKON_HOME,将这个参数的值设置为你需要的路径。 重点

      修改mkvirtualenv的默认路径:

    virtualenvwrapper基本使用:

    1. *nix:pip install virtualenvwrapper

    2. windows:pip install virtualenvwrapper-win

    安装virtualenvwrapper

    virtualenvwrapper这个软件包可以让我们管理虚拟环境变得更加简单。不用再跑到某个目录下通过virtualenv来创建虚拟环境,并且激活的时候也要跑到具体的目录下去激活。

    virtualenvwrapper:


    在电脑的环境变量中,一般是不会去更改一些环境变量的顺序的。也就是说比如你的Python2/ScriptsPython3/Scripts的前面,那么你不会经常去更改他们的位置。但是这时候我确实是想在创建虚拟环境的时候用Python3这个版本,这时候可以通过-p参数来指定具体的Python解释器:

    创建虚拟环境的时候指定Python解释器:

    退出虚拟环境很简单,通过一个命令就可以完成:deactivate

    退出虚拟环境:

    1. windows进入虚拟环境:进入到虚拟环境的Scripts文件夹中,然后执行activate

    2. *nix进入虚拟环境:source /path/to/virtualenv/bin/activate 一旦你进入到了这个虚拟环境中,你安装包,卸载包都是在这个虚拟环境中,不会影响到外面的环境。

    虚拟环境创建好了以后,那么可以进入到这个虚拟环境中,然后安装一些第三方包,进入虚拟环境在不同的操作系统中有不同的方式,一般分为两种,第一种是Windows,第二种是*nix

    进入环境:

    如果你当前的Python3/Scripts的查找路径在Python2/Scripts的前面,那么将会使用python3作为这个虚拟环境的解释器。如果python2/Scriptspython3/Scripts前面,那么将会使用Python2来作为这个虚拟环境的解释器。

    创建虚拟环境非常简单,通过以下命令就可以创建了:

    创建虚拟环境:

    port)

    相关文章

      网友评论

          本文标题:虚拟环境

          本文链接:https://www.haomeiwen.com/subject/vwhpaktx.html