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模块
- CookieJar
管理储存cookie对象,将其中都存放到内存当中
- FileCookieJar(filename, delayload=None, policy=None)
从CookieJar派生而来,用来创建一个文件以来储存cookie,dalayload是表示可以支持延迟访问文件(有需要的时候才去访问文件)
- MozillaCookieJar(filename, delayload=None, policy=None)
从FileCookieJar派生而来,创建与Mozilla浏览器cookies.
二. requests库
爬虫第一步
网络爬虫的请求之requests库
import requests
1. 发送get请求:
- 无参数
- 带参数
response.text & response.content
- response.content: 这个是直接从网络上面抓取到的数据,没有经过任何的解码,所以是bytes类型,在硬盘和网络上传输的字符串都是bytes类型- -
- response.text: 这个是requests将response.content进行解码的字符串。解码现需要制定一种编码方式,requests会根据自己的猜测来判断编码的方式。所以有时候可能会猜测错误,就会导致解码产生乱码。这时候就应该使用response.content.decode(‘utf-8’)进行手动解码
- other
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. 选取节点:
nodename
(选取此节点的所有子节点)
eg:bookstore 就会选取bookstore下所有的子节点
-
/
(如果在最前面,代表从根节点选区。否则选择某节点下的某个节点)局部
eg:
/bookstore
就选取到了根元素下所有的bookstore节点 eg: 在网页上
/div
是找不到的,因为这个是在根节点上找的,而在根节点html上面是没有div的div
是在其中的孙节点body中,/html
是可以找到的,但是/html/div
就是找不到的-
//
(从全局节点中选择节点,随便在哪个位置)全局
eg:
//book
从全局节点中找到所有的book节点 eg:
//head/script
从head中选中局部的script就是单单是head中的script eg:
//script
从全局当中选中script,不单单是局限与head中的script,也有可以能是body当中的script-
@
(选区某个节点的属性) 有点类似面向对象的类的属性
2. 谓点
用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中
- eg:
/bookstore/book[1]
选取bookstore下的第一个子元素
eg:
//body/div[1]
获取body当中的第一个div元素- eg:
/bookstore/book[last()]
选取bookstore下的倒数第二个book元素
3. eg:
bookstore/book[position()❤️]
选取bookstore下前面两个子元素 eg:
//body/div[position()❤️]
选取body元素的div下的前两个position元素- eg:
//book[@price]
选取拥有price属性的book元素
- eg:
//book[@price=10]
选取所有属性price等于10的book元素节点
eg:
//div[@class=‘s_position_list’]
可以获取div下的有s_position_list的class节点 模糊匹配contains:
3.通配符
(
*
表示通配符)*
匹配任意节点
eg:/bookstore/* 选取bookstore下的所有子元素
@*
匹配节点中的任何属性
eg://book[@*] 选取所有带有属性的book元素
4.选取多个路径
(通过 | 运算符来选取多个路径)
- eg:
//bookstore/book | //book/title
: 选取所有bookstore元素下的book元素以及book元素下的所有所有title元素
- eg:
//dd[@class=“job_bt”] | //dd[@class=“job-advantage”]
: 选取所有dd下的class的job_bt和job-advantage的所有属性
还有其他运算符
and
or
之类的summary:
- 使用
//
获取整个页面当中的元素,然后写标签名,然后在写谓词进行提取。
eg:
//div[@class=‘abc’]
/
只是直接获取子节点,而//
是获取子孙节点
contains
: 有时候某个属性中包含了多个值,那么可以使用contains
函数
eg:
//div[contains(@class,‘xxx’)]
lxml库
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种:
- Tag # Tag就是HTML的一个个的标签
- NavigatebleString
- BeautifulSoup
- 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选择器会可以更加的方便。
- 通过标签名查找
soup.select(‘a’) #寻找a标签
- 通过类名查找
通过类名就是要加上一个
.
。比如要查找class=‘sister’soup.select(’.sister’)
- 通过id查找
通过id查找就是要加上一个
#
。比如要查找id=‘link’soup.select(’#link’)
- 组合查找
soup.select(“p #link1”) #这里会找到p中所有的含有link1属性的id标签
soup.select(“head>titile”)#这里就是会将其中的head下的直接子元素获取到,而不会获取到孙元素
- 通过属性查找
查找时还可以加入属性元素,属性需要用中括号括起来。
soup.select(‘a[href=“http://www.baidu.com”]’)
- soup+select
在使用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文件:
- 作者:SimonSun
- 链接:https://simons-blog-eight.vercel.app//article/tech-2
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。