爬虫初识
Posted hwtky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫初识相关的知识,希望对你有一定的参考价值。
两个常用库
确定自己要访问的页面和构建请求头:
url="http://www.xxx.com"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
query_string = form_data = {} 两者都是 字典类型(json)
1. urllib
urllib.requst 用于发送请求
1. 构建请求对象 my_request = urllib.requst.Request(url=url, headers=headers)
2. 获取响应: response = urllib.request.urlopen(url=url)
urllib.parse 用于解析请求数据
1. 当用户使用get方式请求数据:
new_url= url + "?" + urllib.parse.urlencode(data=data) 传入一个 字典类型数据,将数据拼接在url末尾
2. 当用户使用post 方式请求数据:
new_data = urllib.parse.urlencode(data=data)
resp = urllib.request.urlopen(url, data) 通过 urlopen 方法中的data参数来达到使用post 方式访问
2. requests
1. 通过不同的方法进行不同类型的请求:
GET方式: requests.get(url, headers, params)
POST方式: requests.post(url, headers, params)
此外还有 PUT / DELETE / OPTION / HEAD 等多种请求方式
2. 获取响应
response.text # 以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
response.content # 以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
response.json() # Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
三种数据提取方式
正则
正则表达式:匹配一类具有相同规则的字符串 (想获取那个,那个加括号就可以了)
匹配规则: import re
单字符: . 除换行以外的所有字符 (使用re.S 可以是 . 匹配换行符)
[] 其中包含的任意字符
d 所有数字 [0-9] # D 非数字
w 数字、字母、下划线、中文(不匹配换行符) # W 非w
s 所有空白字符 # S 非空白字符
数量修饰: * 任意多次 >= 0
+ 至少1 次 >= 1
? 可有可无 0 或者 1 次
{m, n} m 到 n 次
边界: ^ 以 XXX 开头
$ 以 xxx 结尾
分组: () 视为一个整体, {“(ab){3}”:"对ab 判定3次"}
(?<name>d) 使用<..> 来为后面的匹配规则起别名
非贪婪: .*? 和 .+?
re.I: 不区分大小写 re.M 多行模式 re.S: 单行模式,改变 '.' 的行为 re.X:详细模式
match search findall
re.sub(正则表达式, 替换内容, 匹配内容)
bs4
beautifulSoup 4
# 设置为国内源
1. 进入 C盘 C:/USERS/XXX/ 文件夹
或者:文件夹导航栏输入 %appdata% 进入 C 盘 roaming文件夹
2. 新建文件夹 pip, 创建一个 pip.ini 文件
3. 输入
[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
truste-host = pypi.tuna.tsinghua.edu.cn
# 简单使用:选择器/jquery
from bs4 import BeautifulSoup
# 可以将 html 文件转换成指定的对象,然后通过对象的属性和方法来查找指定内容
1. 转化本地文件
soup = BeautifulSoup(open('本地文件'), 'lxml')
2. 转化网络文件
soup = BeautifulSoup("字符串类型或字节类型", "lxml")
# soup 对象的属性
1.soup.a 返回查询到的第一个a 标签, 也可以 soup.div, soup.img等
soup.a.attrs: 使用字典形式返回 a 标签的所有属性
print(soup.a.attrs) >>> {'href':'http://www.xx.com', 'title':'title', 'target':'target', 'alt':'alt'}
soup.a['href'] == soup.a.attrs['href'] >>> 'http://www.xx.com'
soup.a['title'] == soup.a.attrs['title'] >>> 'title'
2. soup.div.string
soup.div.text
soup.div.get_text()
# 如果 a 标签内部还有其他标签时, a.string 的返回值为 None, text和get_text()方法提取纯文本,并且获取换行
3. find 方法 soup.find(标签名, 限定条件)
# 如果是 class 属性的时候 使用 class_ 加下划线
print(soup.find(a, href="www.xx.com"))
print(soup.find(a, title="xxx"))
print(soup.find(a, class_ = "xxx"))
找到第一个符合条件的标签,不仅soup 对象可以使用,普通的div对象也可以使用,查找制定 div内部的标签
获取标签后使用上述的方法:attrs 来获取属性
4. find_all() 返回一个列表,里面是所有符合方法的对象
find_all("a")
find_all("a", class_ ="xxx")
find_all("a", re.compile(r"xxx"))
find_all("a", limit=2) # 限定取 前两条
find_all(["a", "b", "i"]) # 可以传入一个裂变,返回所有符合要求的标签
5. select 使用css 中的选择器
# 常见选择器: 标签/类/id/组合/层级/伪类/属性选择起
a
.dudu
#lala
a, .dudu, #lala .meme
div .dudu #lala .meme 只要是子级 就可以查找,孙子类
div > p > a > .dudu # 只能是下一级
返回值 还是一个列表,只有一个返回值对象也是列表包裹
支持子对象调用select方法,那么就是从这个子对象里面去找符合这个选择器的标签
xpath
用来在 XML 文档中查找信息,通过XML 文档中的元素和属性进行导航。 HTML 可以归结为 XML 的子类,通过路径选择内容
七种节点: 元素(div/a/p),属性(href/title),文本,命名空间,处理指令,注释,文档节点(根节点)
常用的路径表达式:
// : 不考虑位置的查找
./ : 从当前节点开始往下找
@ : 选取属性
实例:
/body/div : 选取 body 下的所有 div 元素,不包含div 内部的div元素(不包含孙子元素)
//div : 查找所有的div 元素
/body//div : 选取body 内的所有 div 元素,包含孙子节点
/body/div[1] :body中的 第一个 div 元素
/body/div[last()] : body 中的 最后一个 div 元素
//div[@class] : 选取所有拥有 class 属性的div 元素
//div[@class="xx"] : 选取所有 class 属性值为 xx 的 div 元素
/body/div[@id="x"]/a : 选取 id 属性为 x 的div 元素下面的 所有 a 标签
定位方式:
1. 属性定位 //div/a[@id='xxx']
2. 层级定位 //div/div/div[@id='xx']/a
3. 索引定位 //div/div/div[1]//a
# 索引从 1 开始, // a 表示所有的 a 节点,不管位置
4. 逻辑运算 //input[@class="xxx" and name="xxx"]
5. 模糊匹配 contains: // input[contains(@class, "xx")] # 所有由 class 属性的 input, 并且class 属性中包含 xx
starts-with: //input[starts-with(@class, "xx")] # 所有有 class 属性的 input,并且class属性以 xx 开头
6. 取文本 //div[@id='u1']/a[contains(@href, "tieba")]/text()
//div//text() # 获取div 下的所有文本内容
7. 取属性 //div/a[3]/@href
使用方式: from lxml import etree
将html 文档变成一个对象,然后调用对象的属性和方法
1. 本地文件 : tree = etree.parse("文件名")
2. 网络文件 : hteml_tree = etree.HTML("网络字符串")
# 不论有多少返回值,xpath 都返回一个 列表
以上是关于爬虫初识的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段