Python爬虫之一

时间:2020-12-13 15:17:55

1. 爬虫的选取:scrapy和requests+beautifuisoup

  scrapy是框架,而requests和beautifulsoup是库。scrapy框架是可以加如requests和beautifulsoup库的,而scrapy是基于twisted,性能是最大的优势。scrapy方便扩展,提供很多内置的功能。scrapy内置的css和xpath selector非常方便,beautifulsoup就是有点慢。

2.常见网页分类

  静态网页,动态网页、webservice

3.爬虫能做什么

  1)搜索引擎---百度、google、垂直领域搜索引擎

  2)推荐引擎---今日头条

  3)机器学习的数据样本

  4)数据分析(如金融数据分析)、舆情分析等

4.正则表达式

  1)特殊字符(^)

代码:
      import re
      """
      1)^"必须是^后面的字符"
      2) .是除了\n的任意字符
      3) *是一个限定符,用来修饰前一个字符或分组,限定匹配重复的数量为任意数量。
      """
      #”^“、”.“、”ד测试
      test_str = "zzbaby"
      reg_str = "^b.*"
      if re.match(reg_str,test_str):
        print("yes")
      else:
        print("no")

结果:

    no 

  2)特殊字符($)

代码:

    """
    1)$"表示必须有以$前面的字符结尾"
    """
    reg_str_1 = ".*y$"
    if re.match(reg_str_1,test_str):
     print("yes")
    else:
     print("no")
结果:
     yes

  3)特殊字符(?)

代码:

"""
1)?表示非贪婪模式
"""
   test_str = "zbbbbbbzzbaby"
  reg_str_2 = ".*?(z.*?z).*"#?表示从左边开始匹配遇到第一个Z就开始进入匹配第二个?表示不要贪婪太多只需要匹配遇到第二个z就结束
  if re.match(reg_str_2,test_str):
   print(re.match(reg_str_2,test_str).group(1))#表示提取第一次符合reg_str_2的字符,正则表达式是反向匹配的
  else:
   print("error")
结果:
  zbbbbbbz
4)特殊字符+
代码:
  """
  1)+是一个限定符,用来修饰前一个字符或分组,限定匹配重复的数量至少为一次数量。
  """
  reg_str_3 = "(.+.*)"#正则表达式默认是贪婪模式
  if re.match(reg_str_3,test_str):
   print(re.match(reg_str_3,test_str).group(1))#表示提取第一次符合reg_str_2的字符,正则表达式是反向匹配的
  else:
   print("error")
结果:
  zbbbbbbzzbaby
5)特殊字符{}
代码:
  """
  1){2}表示大括号里面出现的数字是前面出现的次数
  2){2,}表示大括号数值以上的次数
  3){2,5}表示2次以上5次以下   """
  reg_str_4 ="(.{2}.)"#表示出现前两个字符
  reg_str_5= "(.+b{2,})"#表示b前面要至少有一个字符后匹配2个以上的b
  reg_str_6= "(.+b{1,6})"#表示b前面要至少有一个字符后匹配1个以上的b,6个以下的b
  print(re.match(reg_str_4,test_str).group(1))#表示打印前两个字符
  print(re.match(reg_str_5,test_str).group(1))#表示两次以上的字符,由于贪婪所以会打印最长
  print(re.match(reg_str_6,test_str).group(1))#打印的是在b之前至少存在1个字符而且b出现的次数在1次以上6次以下
 结果:

    zbb
   zbbbbbb
   zbbbbbb

6)特殊字符|

代码: 

  """
  1)表示或者的意思
  """
  reg_str_7 = "(zz|zb)"#提取zz或者zb优先左边打印
  print(re.match(reg_str_7,test_str).group(1))#group中的数字代表的是括号的层数,常常用于提取子字符串 结果:
  zb
7)特殊字符[]
代码:
  """
  1)[]相当于只能输入[]中的字符
  2)[]有一种使用方法[0-9]只能输入0-9之间的数据
  3)[]还有一种使用方法[^1]表示只能输入不是1的数据
  """
  #[]的前一种使用方式
  print("请输入一个电话号码:")
  #test_str = input()
  reg_str_1 ="1[3578][0-9]{9}"#表示第二位只能输入3、5、8、7的数值,[0-9]则表示输入1-9之间的数据
  if re.match(reg_str_1,test_str):
   print(test_str)
  else:
   print("error")
  #[^]的使用方法
  print("输入一个最后不为1的电话号码:")
  test_str = input()
  reg_str_1 ="1[3578][0-9]{8}[^1]{1}"#表示第二位只能输入3、5、8、7的数值,[0-9]则表示输入1-9之间的数据,最后一位不能为1
  if re.match(reg_str_1,test_str):
   print(test_str)
  else:
   print("error")
输出:
  请输入一个电话号码:
    error
  输入一个最后不为1的电话号码:
    15837140221
    error
8)特殊字符\s
代码:
  
  """
  1)\s表示匹配一个空格
  2)\S表示只要不是空格都可以
  3)\w表示任意一个字符都可以[A-Za-z0-9_]都可以
  4)\W表示与\w相反
  """
  #\s的作用
  test_str ="你 好"#汉字
  test_str_1 ="hh aa"#英文
  reg_str_8 ="你\s好"
  reg_str_9 = "hh\saa"
  if re.match(reg_str_8,test_str):
   print(test_str)
  if re.match(reg_str_9,test_str_1):
   print(test_str_1)
  else:
   print("error")
  #\S的作用与\s的作用相反
  test_str ="hhsaa"#英文
  reg_str_10 = "hh\Saa"
  if re.match(reg_str_10,test_str):
   print(test_str)
  else:
   print("error")
  #\w的使用方式
  test_str ="hh@aa"#英文
  reg_str_11 = "hh\waa"#\w相当于[a-zA-Z0-9_]
  if re.match(reg_str_11,test_str):
   print(test_str)
  else:
   print("error")
  #\W的使用方式与\W相反
  test_str ="hh@aa"#英文
  reg_str_12 = "hh\Waa"#\W相当于[a-zA-Z0-9_]相反
  if re.match(reg_str_12,test_str):
   print(test_str)
  else:
   print("error")
输出结果:
  

  你 好
  hh aa
  hhsaa
  error
  hh@aa

9)特殊字符[\u4E00-\9FA5]

代码:
  """
  1)[\u4E00-\u9FA5]只识别汉字
  """
  test_str ="你好"#汉字
  reg_str_13 = "[\u4E00-\u9FA5]+"
  if re.match(reg_str_13,test_str):
   print(test_str)
  else:
   print("error")
运行结果:
  你好
10)特殊字符\d
代码:
  """
  1)\d代表的数字
  """
  test_str = "aaaaaa123"
  reg_str_13 = ".*(.+[2]\d).*"#提起123
  if re.match(reg_str_13,test_str):
  print(re.match(reg_str_13,test_str).group(1))
  else:
   print("error")
结果:
  123