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