type
status
date
slug
summary
tags
category
icon
password

1) 爬虫第一步网络请求

一.urllbi库

1.urlopen

将返回一个类文件句柄对象,解析网页

2.urlretrieve

将页面保存到本地中,名字叫’baidu.html’

3.urlencode

将字典数据转换为URL编码数据
若网址上是中文的话,浏览器是会将中文编码成%+十六进制数,浏览器发送给服务器,服务器是收不了中文的

4.parse_qs

可以将经过编码后的url参数进行解码

5.urlparse & urlsplit

urlparse & urlsplit 对url进行分割,分成若干个部分,返回这些部分
urlparse多返回了一个参数params,其他和urlsplit一样

6.request.Request类

用于进行添加请求头的时候,增加一些数据(为了防止反爬虫),比如增加User-Agent

7.ProxyHandler处理器(代理设置)

代理的原理:在请求目的服务器之前,先请求代理服务器,然后让代理服务器去请求目的服务器网站,代理服务器拿到目的网站的数据后,在转发给我们的代码
常用的代理请求:
1.西刺免费代理ip(免费的代理不太可行,容易失败)
2.快代理
3.代理云

8.Cookie

将数据给服务器,然后用户的数据再返回给浏览器,让浏览器知道这个用户的身份(大小一般4KB)
Set-Cookie:NAME=VALUE;Expires/max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
参数意义:
NAME: cookie的名字
VALUE: cookie的值
Expires: cookie过期的时间
Path: cookie作用的路径
Domain: cookie作用的域名 (作用的范围)
SECURE: 是否旨在https协议下起作用
使用Cookie:

9.http.CookieJar模块

  1. CookieJar
    1. 管理储存cookie对象,将其中都存放到内存当中
  1. FileCookieJar(filename, delayload=None, policy=None)
    1. 从CookieJar派生而来,用来创建一个文件以来储存cookie,dalayload是表示可以支持延迟访问文件(有需要的时候才去访问文件)
  1. MozillaCookieJar(filename, delayload=None, policy=None)
    1. 从FileCookieJar派生而来,创建与Mozilla浏览器cookies.

二. requests库

爬虫第一步
网络爬虫的请求之requests库
import requests

1. 发送get请求:

  1. 无参数
  1. 带参数
  1. response.text & response.content
      • response.content: 这个是直接从网络上面抓取到的数据,没有经过任何的解码,所以是bytes类型,在硬盘和网络上传输的字符串都是bytes类型- -
      • response.text: 这个是requests将response.content进行解码的字符串。解码现需要制定一种编码方式,requests会根据自己的猜测来判断编码的方式。所以有时候可能会猜测错误,就会导致解码产生乱码。这时候就应该使用response.content.decode(‘utf-8’)进行手动解码
  1. other
    1. ​ 1.print(response.encoding)
      ​ #查看响应头部的字符编码
      ​ 2.print(response.status_code)
      ​ #查看其中响应头部的响应码

2. 发送post请求:

post是要带参数

3. 加入代理机制:

4. 关于session

(这个session不是web开发那个session):
如果想要在多次请求中共享cookie,那么应该使用session

5. 处理不信任的SSL证书

(有一些网站的证书是不会被信任的)网址会有红色的不安全,对于已经信任的证书就可以直接进行request的访问就行了

2)爬虫第二步数据解析

解析工具
解析速度
使用难度
BeautifulSoup
最慢
最简单
lxml
简单
正则
最快
最难
xpath可以将其xml和html的文档中查找所需要的信息
安装驱动:
xpath helper(chrome)

XPath语法:

1. 选取节点:

  1. nodename(选取此节点的所有子节点)
    1. ​ eg:bookstore 就会选取bookstore下所有的子节点
  1. / (如果在最前面,代表从根节点选区。否则选择某节点下的某个节点)局部
    1. eg:/bookstore 就选取到了根元素下所有的bookstore节点
      eg: 在网页上/div 是找不到的,因为这个是在根节点上找的,而在根节点html上面是没有div的
      div是在其中的孙节点body中,/html是可以找到的,但是/html/div 就是找不到的
  1. // (从全局节点中选择节点,随便在哪个位置)全局
    1. eg: //book 从全局节点中找到所有的book节点
      eg: //head/script 从head中选中局部的script就是单单是head中的script
      eg: //script 从全局当中选中script,不单单是局限与head中的script,也有可以能是body当中的script
  1. @(选区某个节点的属性) 有点类似面向对象的类的属性

2. 谓点

用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中
  1. eg:/bookstore/book[1] 选取bookstore下的第一个子元素
    1. eg://body/div[1] 获取body当中的第一个div元素
  1. eg:/bookstore/book[last()] 选取bookstore下的倒数第二个book元素
3. eg:bookstore/book[position()❤️] 选取bookstore下前面两个子元素
eg://body/div[position()❤️]选取body元素的div下的前两个position元素
  1. eg://book[@price] 选取拥有price属性的book元素
  1. eg://book[@price=10] 选取所有属性price等于10的book元素节点
    1. eg://div[@class=‘s_position_list’] 可以获取div下的有s_position_list的class节点
模糊匹配contains:

3.通配符

(*表示通配符)
  1. * 匹配任意节点
    1. ​ eg:/bookstore/* 选取bookstore下的所有子元素
  1. @* 匹配节点中的任何属性
    1. ​ eg://book[@*] 选取所有带有属性的book元素

4.选取多个路径

(通过 | 运算符来选取多个路径)
  1. eg: //bookstore/book | //book/title: 选取所有bookstore元素下的book元素以及book元素下的所有所有title元素
  1. eg: //dd[@class=“job_bt”] | //dd[@class=“job-advantage”]: 选取所有dd下的class的job_bt和job-advantage的所有属性
还有其他运算符 and or之类的

summary:

  1. 使用//获取整个页面当中的元素,然后写标签名,然后在写谓词进行提取。
    1. eg: //div[@class=‘abc’]
  1. /只是直接获取子节点,而//是获取子孙节点
  1. contains: 有时候某个属性中包含了多个值,那么可以使用contains函数
    1. eg: //div[contains(@class,‘xxx’)]

lxml库

1. 基本使用:

  1. 解析html字符串:使用lxml.etree.HTML进行解析

2. 解析html文件

使用 lxml.etree.parse继续解析
​ 效果是和上面的一样的
​ 这个方法是默认使用XML解析器,所以如果碰到一些不规范的HTML代码的时候就会解析错误,这时候就要自己创建HTML解析器

3.xpath实战之豆瓣

4.xpath实战之电影天堂

BeautifulSoup4

和lxml一样,BeautifulSoup也是一个html和xml的解析器,主要功能也是如何提取其中的数据
lxml只是会局部遍历,而BeautifulSoup是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要比lxml低
BS用来解析HTML比较简单,API非常人性化,支持CSS选择器,python标准库中的HTML解析器,也支持lxml的XML解析器。
但是BeautifulSoup的底层还是lxml,就像python的底层还是C,所以解析还是要依照第三方的解析器
解析器
使用方法
优势
劣势
python标准库
BeautifulSoup(markup,“html.parser”)
python内置标准库 执行速度快 容错能力强
python3.3之前的版本的效果比较差
lxml HTML解析器
BeautifulSoup(markup,“lxml”)
速度快,容错能力强
需要安装C语言,就是pip install
lxml XML解析器
BeautifulSoup(markup,[“lxml”,“xml”]) BeautifulSoup(markup,“xml”)
速度快,唯一支持XML解析器
需要安装C语言,就是pip install
html5lib
BeautifulSoup(markup,“html5lib”)
最好的容错性 以浏览器的方式解析文本,生成HTML5格式的文档
速度慢 不依赖外部扩展
如果是比较奇葩的网页,建议就用html5lib来进行解析网页,防止报错,他是会自动修复错误的存在的
简单使用:

1. 四个常用的对象:

BeautifulSoup将复杂的HTML文档换成一个复杂的树形节点,每个节点都是Python对象,所有对象都可以归结为4种:
  1. Tag # Tag就是HTML的一个个的标签
  1. NavigatebleString
  1. BeautifulSoup
  1. Comme

2. find & find_all

find: 只能提取第一个的标签,只是找到一个就返回了
find_all:
  • 可以提取所有的标签,以列表的形式返回多个元素
  • 在提取标签的时候,第一个参数就是标签的名字。然后如果在提取标签的时候想要使用属性进行过滤,那么可以在这个方法中通过关键字参数的形式,将属性的名字以及对应的值传进去。或者是使用’attrs’属性,将所有的属性以及对应的值放在一个字典中传给’attrs’属性
  • 有些时候,在提取标签的时候,不想提取那么多,那么可以使用’limit’ 限制提取多少个

3.string,strings,stripped_strings,get_test

string:
  • 获取某个标签下的非标签字符串,只是一个,以普通字符串的形式返回
strings:
  • 获取某个标签下的所有子孙非标签字符串,返回生成器,可以加上list变成列表形式
stripped_strings:
  • 获取某个标签下的所有子孙标签的字符串并且去掉空格,返回生成器,方法上同
get_text:
  • 获取某个标签下的所有子孙非标签字符串,但是不是以列表返回,以普通字符串返回

CssSelect方法

有时候选择css选择器会可以更加的方便。
  1. 通过标签名查找
    1. soup.select(‘a’) #寻找a标签
  1. 通过类名查找
    1. 通过类名就是要加上一个.。比如要查找class=‘sister’
soup.select(’.sister’)
  1. 通过id查找
    1. 通过id查找就是要加上一个#。比如要查找id=‘link’
      soup.select(’#link’)
  1. 组合查找
    1. soup.select(“p #link1”) #这里会找到p中所有的含有link1属性的id标签
      soup.select(“head>titile”)#这里就是会将其中的head下的直接子元素获取到,而不会获取到孙元素
  1. 通过属性查找
    1. 查找时还可以加入属性元素,属性需要用中括号括起来。
      soup.select(‘a[href=“http://www.baidu.com”]’)
  1. soup+select
    1. 在使用css选择器的时候就是要用到soup中的select中的soup.select

正则表达式 python re

关于正则表达式: 按照一定规则,从某个字符串中匹配到想要的数据。

匹配单个字符

点(.)匹配任意的字符:
但是(.)不能匹配到换行符 text="\n" 就是会报错
\d匹配到任意的数字:
\D匹配任意的非数字
\s 匹配到是空白字符(\n,\t,\r,空格)
这里是有匹配到的,只是匹配到了空的字符
\w匹配到的是a-z和A-Z以及数字和下划线
而如果是要匹配到一个其他字符,那么就匹配不到
\W匹配的是和\w是相反
[] 组合的方式,只要满足中括号里面的字符就可以匹配到

匹配多个字符

*可以匹配0或是任意多个字符,没有不会报错
+可以匹配1或是任意多个字符 至少要一个,不然报错
匹配一个或者0个(要么没有,要么就只有一个)
{m}匹配到m个
{m,n}:匹配m-n个字符

小案例

1.验证手机号码:
2.验证邮箱:
3.验证url:
4.验证身份证

零碎知识

^脱字号: 表示以…开始
如果是在中括号当中就是取反的意思
$ 表示以***结尾
| 匹配多个字符串或是表达式
贪婪模式与非贪婪模式
匹配到0-100之间的数字
原生字符串与转义字符
r’\n’ raw 原生
打印出\n
group()分组
findall
找到所有满足条件的一个列表
sub
可以将<h1>xxx</h1>就可以将标签替换成空格
split()函数
comlie():
如果要经常用到可以使其保存下来,以后用

正则实战爬取古诗网

3)爬虫第三步数据储存

json文件处理

json是一个轻量级的数据交换格式。
支持对象(字典),数组(列表),整形字符串,字符串要用双引号,不能用单引号
如果是json变成列表就是
persons=json.load(xxxx)

CSV文件处理

逗号分隔
1.读取csv文件
2.写入csv文件:
deepspeed训练显存消耗Notion Next 嵌入网易云音乐
Loading...
SimonSun
SimonSun
Internet Malou, LLM Rookie, Bug Maker🤧
最新发布
相机入门记录(1)购物篇
2025-3-14
实用网站-工作提速大礼包
2025-3-14
conda poetry 全面迁移到 uv
2025-3-14
郁闷记
2025-3-13
LLM训练数据格式
2025-3-13
PPO(1)算法详解
2025-3-13
公告
🙌README🙌
🤯There is nothing left
in my right brain,
🤯and there is nothing right
in my left brain...
⭐I wish you every success⭐