名词集锦

  • 课程简介

    • urllib
    • 正则

网络资源

urllib.request 模块

urllib.request.Request

高级方法

Handler 与 OpenerDirector
  • 关系

    • OpenerDirector 就是 Opener
    • opener 来自 build_opener(opener)
    • 自定义 opener:install_opener(opener)方法
  • 得到全局的 OpenerDirector 对象

    • urllib.request.BaseHandler 基类

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      
      import urllib.request
      
      url = "http://tieba.baidu.com/"
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
      }
      
      proxy_handler = urllib.request.ProxyHandler({
          'http': 'web-proxy.oa.com:8080',
          'https': 'web-proxy.oa.com:8080'
      })
      opener = urllib.request.build_opener(proxy_handler)
      urllib.request.install_opener(opener)
      
      request = urllib.request.Request(url=url, headers=headers)
      response = urllib.request.urlopen(request)
      print(response.read().decode('utf-8'))
      • 注意:此处使用 opener.open(url)代替了 urllib.request.urlopen(url)方法。

urllib.error 模块

urllib.error.URLError 与 urllib.error.HTTPError

  • HTTPErro 是 URLError 的子类

URLError 只有一个属性 reason

HTTPError 三个属性,reason,code, headers(HTTP 请求返回的响应头信息)

http.cookiejar 模块

用于爬虫的 cookie 处理

  • 在 python2 中名称为:cookielib

正则表达式

scrapy 架构

scrapy shell

  • xpath 选择器

    • response.xpath()
    • response.css()

xpath 插件

  • xpath helper
  • xpath helper wizard

sina news https://finance.sina.com.cn/stock/hkstock/ggscyd/2019-03-18/doc-ihrfqzkc4719941.shtml

  • xpath items

    1
    2
    3
    4
    5
    6
    7
    8
    
    * for content
      title //title/text()
      keywords //div[@class='keywords']//a/text()
      date  //div[@class='date-source']/span[@class='date']/text()
      source //div[@class='date-source']/a/text()
    
    * for link page
      url_L1

scrapy.loader.processors

  • ItemLoader 处理
  • 包含函数,Join(),MapCompose()

    • 见《Learn Scrapy》中文版,Page38
    • MapCompose(): 返回的是一个类似函数的东西
    • Example:

      1
      
      load.add_xpath('keywords', "//div[@class='keywords']//a/text()", MapCompose(str.strip), Join())
    • 关于 loader

      1
      2
      3
      4
      5
      6
      
      def parse(self,respond):
          load=ItemLoader(item=YourItems(), response=response)
      
          load.add_xpath('datefield','your xpath',MapCompose(str.strip,str.title), Join())
          load.add_value('calculatedField', computeFunctions()...)
          return load.load_item()
      • 注:

        • 对 python2,使用 unicode.strip, unicode.title
        • 对 python3,使用 str.strip, str.title

scrapy.Request(link, callback=self.parse_next)

  • callback 的作用

    • 把从 “link” 上面下载的数据,传给 callback 调用的函数 self.parse_next 来解析
    • 即:用 self.parse_next <—– 解析 link
  • python2 是直接 Request, 这是区别

python2 <—> python3

scrapy

Python2Python3
Requesturllib.request.Request实际使用的是下面一个,scrapy.http.Request
urlparse.urljoinurllib.parse.urljoin
urlopenurllib.request.urlopen
Requestfrom scrapy.http import RequestRequest(url=link,callback=self.parse)

调试命令

编程基本语句

  • fromproperties.itemsimportPropertiesItem

TODO 学习内容

  • pyquery
  • Ajax
  • pyside2
  • scrapy 陈磊的 git 上的代码
  • nrp
  • Pandas

    • Numpy , 不紧要
  • 数据库
  • Katalon Studio
  • 陈雷的 git

json

  • 注意:

    • 对于 python 中的 json 模块

      • 内部的键要用双引号,不能使用单引号
      • eg:

         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        
        import json
        
        str='''
        [{
        "good":"yes",
        "name":"Bob"
        },{
        "good":"no",
        "name":"Zhou Hang"
        }
        ]
        
        '''
        data=json.loads(str)

pyquery

  • 导入模块

    • import pyquery as pq
  • 构建 pyquery 对象

    • str=‘a html or xml 格式字符串’
    • 对象 doc

      • doc=pq(html)
      • doc=pq(filename=“”)

jQuery

  • 注意:

    • jQuery在文档全部加载之后才能正确运行

      • 所以有ready方法
1
2
3
4
5
$(document).ready(function(){

    // 开始写 jQuery 代码...

});

特别语法

1
2
$"p".remove(".italic") //类似css选择器, 删除id=”italic“的p元素
$"#div01".remove() //删除class=”div01“的元素

选择器

  • $("p").parentsUntil("div")

    • 选择<p>与<div>之间的所有元素element,但是"不包括" <p>和<div>
  • $("h2").nextUntil("h6")

    • 与上面的Until一个意思
    • next sibling下一个同胞元素
  • $("p").children()

    • 所有的第一级子元素
    • eg:

      1
      2
      3
      
      $("div").children("p.1");
      //相当于div>p.1 (css selector)
      //class=1 的紧挨着div的子元素
      

索引

  • eq

    • $("p").eq(1);
    • 返回第几个元素
    • 注意:

      • 以0开始索引
  • filter

    • $("p").filter(".url")
  • not

    • $("p").not(".url");

Selectors 选择器

  • http://www.runoob.com/jquery/jquery-ref-selectors.html

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    
    // * 基本选择器
    $("#id")            //ID选择器
    $("div")            //元素选择器
    $(".classname")     //类选择器
    $(".classname,.classname1,#id1")     //组合选择器
    
    // * 层次选择器
    $("#id>.classname ")    //子元素选择器
    $("#id .classname ")    //后代元素选择器
    $("#id + .classname ")    //紧邻下一个元素选择器
    $("#id ~ .classname ")    //兄弟元素选择器
    
    // * 过滤选择器(重点)
    $("li:first")    //第一个li
    $("li:last")     //最后一个li
    $("li:even")     //挑选下标为偶数的li
    $("li:odd")      //挑选下标为奇数的li
    $("li:eq(4)")    //下标等于 4 的li(第五个 li 元素)
    $("li:gt(2)")    //下标大于 2 的li
    $("li:lt(2)")    //下标小于 2 的li
    $("li:not(#runoob)") //挑选除 id="runoob" 以外的所有li
    
    // * 内容过滤选择器
    $("div:contains('Runob')")    // 包含 Runob文本的元素
    $("td:empty")                 //不包含子元素或者文本的空元素
    $("div:has(selector)")        //含有选择器所匹配的元素
    $("td:parent")                //含有子元素或者文本的元素
    
    // * 可见性过滤选择器
    $("li:hidden")       //匹配所有不可见元素,或type为hidden的元素
    $("li:visible")      //匹配所有可见元素
    
    // * 属性过滤选择器
    $("div[id]")        //所有含有 id 属性的 div 元素
    $("div[id='123']")        // id属性值为123的div 元素
    $("div[id!='123']")        // id属性值不等于123的div 元素
    $("div[id^='qq']")        // id属性值以qq开头的div 元素
    $("div[id$='zz']")        // id属性值以zz结尾的div 元素
    $("div[id*='bb']")        // id属性值包含bb的div 元素
    $("input[id][name$='man']") //多属性选过滤,同时满足两个属性的条件的元素
    
    // * 状态过滤选择器
    $("input:enabled")    // 匹配可用的 input
    $("input:disabled")   // 匹配不可用的 input
    $("input:checked")    // 匹配选中的 input
    $("option:selected")  // 匹配选中的 option
    
    // * 表单选择器
    $(":input")      //匹配所有 input, textarea, select 和 button 元素
    $(":text")       //所有的单行文本框,$(":text") 等价于$("[type=text]"),推荐使用$("input:text")效率更高,下同
    $(":password")   //所有密码框
    $(":radio")      //所有单选按钮
    $(":checkbox")   //所有复选框
    $(":submit")     //所有提交按钮
    $(":reset")      //所有重置按钮
    $(":button")     //所有button按钮
    $(":file")       //所有文件域
    
  • 基本选择器

    1
    2
    3
    4
    
    $("#id")            //ID选择器
    $("div")            //元素选择器
    $(".classname")     //类选择器
    $(".classname,.classname1,#id1")     //组合选择器
    
  • 层次选择器

    1
    2
    3
    4
    
    $("#id>.classname ")    //子元素选择器
    $("#id .classname ")    //后代元素选择器
    $("#id + .classname ")    //紧邻下一个元素选择器
    $("#id ~ .classname ")    //兄弟元素选择器
    
  • 过滤选择器(重点)

    1
    2
    3
    4
    5
    6
    7
    8
    
    $("li:first")    //第一个li
    $("li:last")     //最后一个li
    $("li:even")     //挑选下标为偶数的li
    $("li:odd")      //挑选下标为奇数的li
    $("li:eq(4)")    //下标等于 4 的li(第五个 li 元素)
    $("li:gt(2)")    //下标大于 2 的li
    $("li:lt(2)")    //下标小于 2 的li
    $("li:not(#runoob)") //挑选除 id="runoob" 以外的所有li
    
    • 内容过滤选择器

      1
      2
      3
      4
      
      $("div:contains('Runob')")    // 包含 Runob文本的元素
      $("td:empty")                 //不包含子元素或者文本的空元素
      $("div:has(selector)")        //含有选择器所匹配的元素
      $("td:parent")                //含有子元素或者文本的元素
      
    • 可见性过滤选择器

      1
      2
      
      $("li:hidden")       //匹配所有不可见元素,或type为hidden的元素
      $("li:visible")      //匹配所有可见元素
      
    • 属性过滤选择器

      1
      2
      3
      4
      5
      6
      7
      
      $("div[id]")        //所有含有 id 属性的 div 元素
      $("div[id='123']")        // id属性值为123的div 元素
      $("div[id!='123']")        // id属性值不等于123的div 元素
      $("div[id^='qq']")        // id属性值以qq开头的div 元素
      $("div[id$='zz']")        // id属性值以zz结尾的div 元素
      $("div[id*='bb']")        // id属性值包含bb的div 元素
      $("input[id][name$='man']") //多属性选过滤,同时满足两个属性的条件的元素
      
    • 状态过滤选择器

      1
      2
      3
      4
      
      $("input:enabled")    // 匹配可用的 input
      $("input:disabled")   // 匹配不可用的 input
      $("input:checked")    // 匹配选中的 input
      $("option:selected")  // 匹配选中的 option
      
  • 表单选择器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    $(":input")      //匹配所有 input, textarea, select 和 button 元素
    $(":text")       //所有的单行文本框,$(":text") 等价于$("[type=text]"),推荐使用$("input:text")效率更高,下同
    $(":password")   //所有密码框
    $(":radio")      //所有单选按钮
    $(":checkbox")   //所有复选框
    $(":submit")     //所有提交按钮
    $(":reset")      //所有重置按钮
    $(":button")     //所有button按钮
    $(":file")       //所有文件域