python爬虫与web

本文介绍了Python在爬虫与Web开发中的应用,包括正则表达式的基本概念和常见用法,如在bugku上的题目分析,以及re库的findall和find方法。接着讲解了BeautifulSoup库,用于解析HTML,重点讨论了BeautifulSoup的常用方法和CSS选择器。最后,简述了Flask的Web应用基础,包括安装和创建简单应用,并提到了Python argparse模块用于命令行参数解析。
摘要由CSDN通过智能技术生成

正则匹配

正则表达式:是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配,
定义了一种规则,匹配出所有符合这个规则的字符。
常见的正则匹配字符:

^:匹配一行字符串的开头
. :	匹配任意字符,除了换行符
[...]:匹配括号中的任一个,[amk] 匹配 'a''m''k'
[^...]:	不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符
*:匹配0个或多个的表达式
+:匹配1个或多个的表达式
?:匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式

|:a| b,匹配a或b
{n}:精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
{n,}:匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。
"o{1,}" 等价于 "o+""o{0,}" 则等价于 "o*"{ n, m}:匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式


\w:匹配字母数字下划线
\W:匹配非字母数字下划线
\s:匹配任意空白字符
\S:匹配任意非空白字符
\d:匹配任意数字,等价于 [0-9]
\D:匹配任意非数字
.*?       0或者多次,加?之后就为 就少      非贪婪模式
.*        有多少匹配多少                  贪婪模式

一道bugku上的题,就是考察正则表达式的知识

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?> 

分析这个正则表达式 /key.*key.{4,7}key:/./(.*key)[a-z][[:punct:]]/i

定界符://(一般来说是这两个,其实除了\和字母数字其它的只要是成对出现都可以看做定界符,比如##、!!之类的);

. (一个点):表示可以匹配任何字符;

*   :前面的字符重复零次或多次;

{n,m} :前面的字符重复4~7次;

\ (反斜线):后面的字符被转义;

[a-z] :在a到z中匹配 ;

[[:punct:]] :匹配任何标点符号;

/i  :表示这个正则表达式对大小写不敏感;

. 代表匹配除\n外的任意单字符
{4,7}代表最少匹配4次,最多匹配7次
/代表匹配“/” (注意\是转义符号)
(.key)代表匹配任意单字符和key
[a-z]代表匹配任意一个小写字母
[[:punct:]]代表匹配任意一个标点符号
构造参数 id=/keykeyccccckey:/c/ckeyc’/i
然后在地址栏加上这个就能得到flag

re库:

re 模块使 Python 语言拥有全部的正则表达式功能
常用方法:
re.match :尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
第一个参数传入了正则表达式,第二个参数传入了要匹配的字符串。
//match:从字符串头开始匹配。只返回一个结果,一旦匹配成功就会返回
re.search:扫描整个字符串并返回第一个成功的匹配。
	       span():获取开始和结束位置;string:获取匹配的内容
	       group():获取子表达式匹配的内容
re.findall:在字符串中找到正则表达式所匹配的所有字符串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.sub(‘表达式’, ‘新字符’, ‘字符串’):用于替换字符串中的匹配项。
re.split:方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.compile:函数用于编译正则表达式,生成一个正则表达式对象

在这里插入图片描述
在这里插入图片描述
findall,从字符串中找到根据正则表达式所得到的符合要求的字符串。
\S是匹配任何非空字符。\d匹配任意数字

Beautifulsoup库

bs简介:简单来说,Beautiful Soup就是Python的一个HTML的解析库,可以用它来方便地从网页中提取数据。借助网页的结构和属性等特性来解析网页
解析器:Beautiful Soup在解析时实际上依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器(比如lxml)。BeautifulSoup是一个网页解析库,它支持很多解析器,不过最主流的有两个。一个是Python标准库,一个是lxml HTML 解析器。

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
tag:HTML 中的一个个标签,两个重要的属性,name 和 attrs :
NavigableString:得到了标签的内容用 .string 即可获取标签内部的文字,会输出注释
BeautifulSoup:BeautifulSoup 对象表示的是一个文档的全部内容,是一个特殊的 Tag
Comment:Comment 对象是一个特殊类型的 NavigableString 对象,不会输出注释

常见用法

方法选择器

find_all(name , attrs , recursive , text , **kwargs)与find
name:根据节点名查询元素
attrs:根据节点属性查询元素
text:用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象
除了find_all()方法,还有find()方法,只不过后者返回的是单个元素,也就是第一个匹配的元素,而前者返回的是所有匹配的元素组成的列表。
1.find_all()
find_all(name, attrs, recursive, text, **kwargs)可以根据标签,属性,内容查找文档。 find_all()其实和正则表达式的原理很相似,他能找出所有能满足匹配模式的结果,在把结果以列表的形式返回。

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
 
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
 
<p class="story">...</p>
"""
from bs4 import BeautifulSoup
 
soup = BeautifulSoup(html_doc, 'lxml')

2.find()
find_all()返回的是所有元素列表,find()返回单个元素。

find( name , attrs , recursive , string , **kwargs )

find_all()方法将返回文档中符合条件的所有 tag,尽管有时候我们只想得到一个结果。比如文档中只有一个标签,那么使用find_all() 方法来查找标签就不太合适, 使用find_all方法并设置limit=1参数不如直接使用find()方法。下面两行代码是等价的:


soup.find_all('title', limit=1)
# [The Dormouse's story]
soup.find('title')
#The Dormouse's story

CSS选择器

在 CSS中 ,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list。
通过标签名查找:
通过类名查找:
通过 id 名查找:
属性查找:
教程网址:https://blog.csdn.net/qq_21933615/article/details/81171951
Beautiful Soup支持大部分的 CSS选择器。在Tag或BeautifulSoup对象的.select()方法中传入字符串参数, 即可使用 CSS选择器的语法找到 tag。我们在写 css 时,标签 class类名加".",id属性加"#"。

soup.select("title")
# [The Dormouse's story]

通过 tag标签逐层查找:

soup.select("body a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie"  id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
 
soup.select("html head title")
# [<title>The Dormouse's story</title>]

找到某个 tag标签下的直接子标签:

soup.select("head > title")
# [<title>The Dormouse's story</title>]
 
soup.select("p > a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie"  id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
 
soup.select("p > #link1")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
 
soup.select("body > a")
# []

通过 CSS 的 class类名查找:

soup.select(".sister")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

通过 tag 的 id 查找:

soup.select("#link1")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
 
soup.select("a#link2")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

同时用多种 CSS选择器查询元素,使用逗号隔开:

soup.select("#link1,#link2")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

如果提取如tr标签下的第二个td标签,一般的css选择器选择是tr > td:ntn:child(2),

Flask的web应用

安装 Flask
在pychar左上角file进入setting
在这里插入图片描述
然后我们就能够看到我们所下载的包名及版本
在这里插入图片描述
一开始的话我们是没有下载flask包的,所以要手动去添加
在这里插入图片描述

经历这三步之后就添加了flask包。

测试一个简单的web应用
在这里插入图片描述
网页打开127.0.0.1:8080
在这里插入图片描述

分析:

第一行:所有Flask程序都需要进行创建一个实例。Web服务器会使用WSGI协议,将接受到的客户端请求转交给这个对象处理,可以理解为代码中的app
第三行:Flask需要一个参数,这个参数通常是主模块或是包的名字。所以通常会传入 name;Flask用这个参数来决定程序的根目录,以便以后找到资源文件,比如网页中的图片,视频,音频等

第五行、
M:Model ==> 数据库模型
V:Views ==> 可以理解为定义网页的地址,以及渲染网页等
C:Controller ==> 可以理解为 网页功能的逻辑,实现
第五行的V,就是路由。这里的代码的目的就是为我们来指定一个路由,也就是页面的地址。

第六行:使用app.route()装饰器会将URL和执行的**视图函数(函数 index )**的关系保存在app.url_map属性上。当你访问指定的URL时,就会调用这个函数。当遇到第一个return时,就会结束。其中的return就是你的response
第十二行: 执行app.run来启动服务器。默认的Flask会监听的地址是127.0.0.1:5000。我们指定host和port参数,就修改了监听地址。 服务启动后,会先判断参数host以及port是否为None,如果为None,就会将host和port修改为默认值。然后会判断debug。然后就会调用werkzeug.serving.run_simple来启动Web服务,默认会使用单进程的werkzeug.serving_BaseWSGIServer来处理客户端的请求
(这里的Werkzeug其实就是WSGI的实现和应用,从中可以发现,Flask是基于Werkzeug开发的。你或许可以去查查Werkzeug的文档,来自己实现一个Web服务框架)

关于flask的教程http://www.pythondoc.com/flask-mega-tutorial/index.html

python argparse模块

创建解析器

第一个程序,可以直接在桌面写个py文件
import argparse

import argparse

# 创建ArgumentParser对象
# 该对象将包含将命令行解析为python数据类型所需的所有信息
parser = argparse.ArgumentParser(description='This is a test', epilog='It is end')

# 解析参数
parser.parse_args()

在命令行中执行
在这里插入图片描述
添加参数

位置参数(positional arguments):默认,程序根据参数出现的位置确定
可选参数(optional arguments):程序已提前定义好的参数,不一定需要

ArgumentParser通过调用add_argument()方法来填充有关程序参数的信息;parse_args()调用时会存储和使用此信息;parse_args()运行时,会用’-‘来判断是否为可选参数

添加位置参数

import argparse

parser = argparse.ArgumentParser(description='Output what you input')

# 添加了位置参数Output
parser.add_argument('Output')
args = parser.parse_args()
print(args.Output)

在命令行中操作
在这里插入图片描述可以通过一个’-‘来指定短参数,如-h;还可通过’–’来指定的长参数,如–help;可同时指定短、长参数
在这里插入图片描述计算范围内数字的平方

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-square', '--square', type=int, choices=range(2, 4), help='Input X and Output X^2')
args = parser.parse_args()
print(args.square**2)

操作实现
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值