大数据—爬虫基础

2024-06-13 10:53:42 浏览数 (2)

目录

  • 爬虫是什么?
  • 发送网络请求
  • 解析数据
  • 正则表达式
  • 正则表达式元字符
  • 常用函数
  • Beautiful Soup
  • find_all()函数
  • find()函数
  • select()
  • xpath库:

爬虫是什么?

  • 爬虫(Crawler),也被称为网络爬虫、网页蜘蛛或网络机器人,是一种按照既定规则在网络上自动爬取信息的程序或脚本。它模拟人类操作客户端(如浏览器或APP)向服务器发起网络请求,以抓取数据。爬虫可以用于网站数据采集内容监测等多种用途。

爬虫的工作流程:

  1. 选取目标数据源:确定要爬取的网站或网页。
  2. 发起网络请求:模拟浏览器向目标网站发送请求。
  3. 获取响应数据:接收目标网站返回的响应数据,通常是HTML、XML或JSON格式的数据。
  4. 解析数据:使用解析器(如BeautifulSoup、lxml等)解析响应数据,提取出所需的信息。
  5. 存储数据:将提取的信息存储到数据库、文件或其他存储介质中。

发送网络请求

使用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)

0 人点赞