目录
- 爬虫是什么?
- 发送网络请求
- 解析数据
- 正则表达式
- 正则表达式元字符
- 常用函数
- Beautiful Soup
- find_all()函数
- find()函数
- select()
- xpath库:
爬虫是什么?
- 爬虫(Crawler),也被称为网络爬虫、网页蜘蛛或网络机器人,是一种按照既定规则在网络上自动爬取信息的程序或脚本。它模拟人类操作客户端(如浏览器或APP)向服务器发起网络请求,以抓取数据。爬虫可以用于网站数据采集、内容监测等多种用途。
爬虫的工作流程:
- 选取目标数据源:确定要爬取的网站或网页。
- 发起网络请求:模拟浏览器向目标网站发送请求。
- 获取响应数据:接收目标网站返回的响应数据,通常是HTML、XML或JSON格式的数据。
- 解析数据:使用解析器(如BeautifulSoup、lxml等)解析响应数据,提取出所需的信息。
- 存储数据:将提取的信息存储到数据库、文件或其他存储介质中。
发送网络请求
使用requests库:
导入库:
- import requests
请求类型:
get请求:
- ret = requests.get(url = url)
post请求:
- ret = requests.post(url = url)
UA伪装:
有的网站有反爬机制,这时候就要模拟成正常客户端的请求去访问。 添加请求头:UA伪装:
- ret = requests.get(url = url,headers = {"User-Agent": "xxx"}) “xxx”处省略
修改编码格式:
爬取数据时,如果返回的是乱码,则要修改编码格式
- ret.encoding='utf-8'
查看是否请求成功:
- print(ret)
返回200为成功,非200则请求失败。
解析数据
常用解析库:
- re 正则表达式
- Beautiful Soup库
- xpath库
正则表达式
导入库:
- import re
正则表达式元字符
- " . " 匹配任意字符 ( n除外 )
- " [ ] " 匹配[ ]中列举的字符
- " d " 匹配数字,即0-9
- " D " 匹配⾮数字
- " s " 匹配空⽩,即空格,tab键
- " S " 匹配⾮空⽩字符
- " w " 匹配单词字符,即a-z、A-Z、0-9
- " W " 匹配⾮单词字符
- " " 转义字符,用于匹配特殊字符,如
.
匹配点字符 - " ( ) " 提取括号内匹配的数据
- " ^ " 匹配字符串开始
- " $ " 匹配字符串结束
- " * " 匹配前面的子表达式零次或多次
- " " 匹配前面的子表达式一次或多次
- " ? " 匹配前面的子表达式零次或一次
- "{n}" 匹配前面的子表达式n次
- "{n, }" 匹配前面的子表达式n次或更多次
- "{n,m}" 匹配前面的子表达式n到m次
- " | " 或,匹配左右两边任意一个表达式
常用函数
函数 | 说明 |
---|---|
re.match( ) | 从字符串的起始位置匹配, 匹配成功, 返回一个匹配的对象, 否则返回None |
re.match( ) | 扫描整个字符串并返回第一个成功的匹配 |
re.findall( ) | 在字符串中找到正则表达式所匹配的所有子串, 并返回一个列表, 如果没有找到匹配的, 则返回空列表 |
re.split( ) | 将一个字符串按照正则表达式匹配结果进行分割, 返回列表类型 |
re.finditer( ) | 在字符串中找到正则表达式所匹配的所有子串, 并把它们作为一个迭代器返回 |
re.sub( ) | 把字符串中所有匹配正则表达式的地方替换成新的字符串 |
re.complie( ) | 将正则表达式传入, 返回一个匹配对象, 一般与其他方法组合使用 |
Beautiful Soup
导入库:
- from bs4 import BeautifulSoup
转成BeautifulSoup对象
- soup = BeautfiulSoup(ret.text)
find_all()函数
find_all()
方法用于查找文档中所有匹配的标签。它会返回一个包含所有匹配项的列表。
参数 : find_all(name, attrs, recursive, string, **kwargs)
name
:要查找的标签名。attrs
:一个字典,用于指定要查找的标签的属性。recursive
:是否递归搜索子标签。默认为 True。string
:要查找的文本内容。**kwargs
:其他关键字参数,如class_
(注意有一个下划线)用于查找具有特定类的标签。
find()函数
find()
方法与 find_all()
类似,但它只返回第一个匹配的标签(而不是一个列表)。如果没有找到匹配的标签,则返回 None。
用法:
- 与
find_all()
相同,但返回单个结果或 None。
查找第一个<p>标签
代码语言:javascript复制soup.find('p')
查找所有<p>标签
代码语言:javascript复制soup.find_all('p')
查找ID为'my-id'的元素
代码语言:javascript复制soup.find(id='my-id')
注意:类名作为参数时要使用'class_',因为class是Python的关键字
代码语言:javascript复制soup.find_all(class_='my-class')
select()
方法使用CSS选择器来定位元素。
查找所有<p>标签
代码语言:javascript复制soup.select('p')
查找ID为'my-id'的元素
代码语言:javascript复制soup.select('#my-id')
查找所有类名为'my-class'的元素
代码语言:javascript复制soup.select('.my-class')
查找所有类名为'my-class'的<p>标签
代码语言:javascript复制soup.select('p.my-class')
查找所有<div>标签下的直接子元素<p>
代码语言:javascript复制soup.select('div > p')
查找所有具有href属性的<a>标签
代码语言:javascript复制soup.select('a[href]')
查找href属性以'http://example.com'开头的<a>标签
代码语言:javascript复制soup.select('a[href^="http://example.com"]')
xpath库:
导入xpath库:
import xpath
常用参数:
" / " | 从根节点的所有节点 |
---|---|
" // " | 从匹配选择的当前节点选择文档中的节点,不考虑他们的位置(取子孙节点) |
" . " | 选取当前节点 |
" .. " | 选取当前节点的父节点 |
" @ " | 选取属性 |
" * " | 匹配任意节点 |
" /text () " | 获取Element对象的元素内容( 文本 ) |
" /@ " | 获取标签中的属性名的内容 |
" [ ] " | 筛选符合条件的节点 |
1. 选择所有节点: 使用双斜杠//选择文档中的所有节点,如://node() 2. 按属性选择节点: 使用方括号[]和@符号选择具有特定属性值的节点,例如://book[@category="children"] 3. 使用逻辑运算符选择节点: 使用and、or、not等逻辑运算符选择节点,例如://book[price<10 and @category="children"]
代码语言:javascript复制
# 导入xpath库
import xpath
# 解析XML字符串
html = ertee.HYML(ret .text)
# xxx为解析式
xp = html .xpath("xxx")
print(xp)