bs4介绍与使用,selenium基本使用

beautifulsoup4(bs4)介绍与使用

是一个从HTML或XML文件中提取数据的python库,可以使用他来解析爬取回来的xml。

安装模块

pip install beautifulsoup4

beautifulsoup4自带了一个解析库html.parser,还有一个lxml,如果需要使用需要下载

 pip install lxml

使用方法

导入模块
from bs4 import BeautifulSoup
soup=BeautifulSoup('要解析的内容str类型','html.parser/lxml')

bs4的遍历文档树

from bs4 import BeautifulSoup

以下列htrml为数据

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title">
lqz
<b>The Dormouse's story</b>
</p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1" name='lqz'>Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

美化并查看内容

soup = BeautifulSoup(html_doc,'lxml')
print(soup.prettify())  # 查看html内容

获取标签

# 通过 . 来遍历,遍历一层一层往里找
# 找到html里的body里的p标签, 找到一个就会停下
print(soup.html.body.p)
# 跨层找 只找一个
print(soup.p)

获取标签名

# 获取标签的名字
print(soup.a.name)

获取标签属性

# attrs会有一个属性字典
print(soup.a.attrs['href'])
print(soup.a.attrs['class'])
# 也可以get
print(soup.a.attrs.get('name'))

获取标签的内容

# text获取该标签内部所有子孙标签的文本内容
print(soup.p.text)
# string 该标签下的文本只有一个时能取到,否则为None
print(soup.p.string)
#strings 获取文本产生一个迭代器对象
print(soup.p.strings)

嵌套选择就是一直点

print(soup.html.body)

了解

# 了解
print(soup.p.contents) # 拿到p的所有子节点,自己的文本也算,换行符也算,子标签也算
print(soup.body.children) # 和上面的一样 是个迭代器
print(soup.body.descendants) # 迭代器 子子孙孙

# 父节点、祖先节点
print(soup.a.parent) #获取a标签的父节点 包含父节点里面的节点
print(list(soup.a.parents) )#找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...

# 兄弟节点
print(soup.a.next_sibling) #下一个兄弟 文本也算,同样的标签不算
print(soup.a.previous_sibling) #上一个兄弟 文本也算,同样的标签不算
#
print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
print(list(soup.a.previous_siblings)) #上面的兄弟们=>生成器对象

bs4搜索文档树

find 只找一个

find_all 找所有

含有五种过滤器 字符串,正则,列表,True,方法

字符串当条件

# 条件是字符串
res = soup.find_all(name='a')
print(res)
res1 = soup.find(name='a')
print(res1)

# 按类名
res2 = soup.find_all(class_='sister')
print(res2)

# 按id
res3 = soup.find_all(id='link1')
print(res3)
# 按文本内容 如果用find_all是个列表
res4 = soup.find(text='Elsie')
print(res4)
# 按文本内容是Elsie标签拿到其父标签
res5 = soup.find(text='Elsie').parent
print(res5)
另一种方式
arrts
res = soup.find_all(attrs={'class':'sister'})
print(res)
res1 = soup.find_all(attrs={'id':'link1'})
print(res1)

正则

import re
# id以L开头的
res = soup.find_all(id=re.compile('^l'))
print(res)
# class以s开头的
res1 = soup.find_all(class_=re.compile('^s'))
print(res1)

列表

# 找到link1或link2的
res = soup.find_all(id=['link1','link2'])
print(res)
# 找到A标签和b标签
res = soup.find_all(['a','b'])
print(res)
也可以class_ = []

True

# 找到所有有id的标签
res = soup.find_all(id=True)
print(res)
# 所有有href的标签
res = soup.find_all(href=True)
print(res)
或src

方法

def has_class_but_no_id(tag):
    # 有class没有id的
    return tag.has_attr('class') and not tag.has_attr('id')

print(soup.find_all(name=has_class_but_no_id))

find的其他参数

attrs   # 所有属性
name   # 标签名
class  # class属性
id    # id
text  # 文本
-----------------------------
limit:    # 限制条数,find_all用的    find本质是find_all  limit=1
    # 找含有href的标签只找2条
soup.find_all(href=True,limit =2)
recursive: # 查找的时候,是只找第一层还是子子孙孙都找,默认是True子子孙孙都找
# 建议遍历和搜索一起用
res=soup.html.body.p.find_all(name='b',recursive=False)
print(res)

css选择器

我们学了bs4,其他解析器一般都支持css选择器


from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,'lxml')

# select内写css选择器
# 类
print(soup.select('.sister'))
# id
print(soup.select('#link1'))
# id 空格 代表子孙
print(soup.select('#link1 span'))


# 终极大招---》如果不会写css选择器,可以去网页检查选择标签,复制copy selector

selenium基本使用

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

selenium本质是通过驱动浏览器,完全模拟人对浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

使用步骤

  1. 下载selenium
pip install selenium
  1. 不同浏览器需要下载不同浏览器的驱动

谷歌

# 跟谷歌浏览器版本要对应
https://registry.npmmirror.com/binary.html?path=chromedriver/
  1. 下载完的驱动,放在项目路径下

代码控制谷歌浏览器

from selenium import webdriver
import time
# 打开谷歌浏览器,指定驱动
bro = webdriver.Chrome(executable_path='chromedriver.exe')
# 地址栏输入网址
bro.get('https://www.baidu.com/s?wd=%E9%BB%91%E4%B8%9D')
time.sleep(5)
# 打印出来当前页面所有内容
print(bro.page_source)

# 可以存入html文件里,打开和访问的页面一样哟
with open('hs.html','w',encoding='utf8') as f:
    f.write(bro.page_source)
# 关闭浏览器
bro.close()

操作方法重点

方法 功能
bro = webdriver.Chrome(executable_path='chromedriver.exe') 打开浏览器指定驱动
bro.get('url') 在浏览器地址栏输入url
bro.page_source 打印出当前页面所有内容
bro.close() 关闭浏览器

无界面浏览器


from selenium.webdriver.chrome.options import Options
# 隐藏浏览器的图形化界面,但是数据还拿到
chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
# chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #手动指定使用的浏览器位置

from selenium import webdriver
import time
# 打开谷歌浏览器,指定驱动 指定配置
bro = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)
# 地址栏输入网址
bro.get('https://www.baidu.com/s?wd=%E9%BB%91%E4%B8%9D')
time.sleep(5)
# 打印出来当前页面所有内容
print(bro.page_source)
# 关闭浏览器
bro.close()

模拟百度自动登录

from selenium.webdriver.common.by import By
from selenium import webdriver
import time
# 打开谷歌浏览器,指定驱动
bro = webdriver.Chrome(executable_path='chromedriver.exe')
# 加入等待,找标签找不到就等待 x秒,找不到就报错
bro.implicitly_wait(10)
# 地址栏输入网址
bro.get('https://www.baidu.com/')
# 从页面找到登录标签,点击他
"""
bro.implicitly_wait(10)  找不到标签等待10秒还找不到就报错
find_element  找一个
find_elements 找所有
需要导入by  from selenium.webdriver.common.by import By
By.LINK_TEXT  按a标签文本内容找
By.ID         按标签id找
value         查找值
send_keys     输入内容
"""
btn = bro.find_element(by=By.LINK_TEXT,value='登录')
# 点击登录
btn.click()
time.sleep(2)
# 找到按账号登录的标签,优先用id找,因为唯一。
btn_1 = bro.find_element(by=By.ID,value='TANGRAM__PSP_11__changePwdCodeItem')
# 点击
btn_1.click()
time.sleep(2)
# 找到输入用户名与密码标签
username = bro.find_element(by=By.ID,value='TANGRAM__PSP_11__userName')
password = bro.find_element(by=By.ID,value='TANGRAM__PSP_11__password')
# 输入用户名密码
username.send_keys('18019877316')
password.send_keys('11111')
time.sleep(2)
# 点击登录
submit = bro.find_element(by=By.ID,value='TANGRAM__PSP_11__submit')
submit.click()
time.sleep(3)
# 关闭浏览器
bro.close()

selenium其他用法

查找标签

两个方法重点
功能
find_element() 找一个
find_elements() 找所有
查找条件重点
关键字配合value使用 功能 用法
By.ID 按id查找 bro.find_element(by=By.ID,value='id值')
By.LINK_TEXT 按a标签内容查找 btn = bro.find_element(by=By.LINK_TEXT,value='a标签内容')
By.NAME 按标签name属性 bro.find_element(by=By.NAME, value='name属性')
By.TAG_NAME 按表签名 bro.find_element(by=By.TAG_NAME,value='input')
By.CLASS_NAME 按类名 bro.find_element(by=By.CLASS_NAME,value='s_ipt')
By.PARTIAL_LINK_TEXT 按a标签内容模糊匹配 bro.find_element(by=By.PARTIAL_LINK_TEXT,value='录')
By.CSS_SELECTOR CSS查找 bro.find_element(by=By.CSS_SELECTOR, value='#su')

获取位置属性大小,文本

get_attribute() 拿到属性

from selenium.webdriver.common.by import By
from selenium import webdriver
import time
# 打开谷歌浏览器,指定驱动
bro = webdriver.Chrome(executable_path='chromedriver.exe')
# 加入等待,找标签找不到就等待 x秒,找不到就报错
bro.implicitly_wait(10)
# 地址栏输入网址
bro.get('https://kyfw.12306.cn/otn/resources/login.html')
# 找到扫码登录按钮
btn = bro.find_element(by=By.LINK_TEXT,value='扫码登录')
btn.click()
time.sleep(2)
# 找到二维码标签
img = bro.find_element(by=By.ID,value='J-qrImg')
time.sleep(1)
# 拿到img属性src 二维码
res = img.get_attribute('src')
print(res)

bro.close()


btn.text  # 标签文本内容


#获取标签ID,位置,名称,大小(了解)
print(img.id)      # selenium生成的id
print(img.location)  # 拿到x轴y轴坐标位置
print(img.tag_name)   # 标签名字
print(img.size)      # 标签大小(宽高),用于坐标位置+大小自动截取页面数据

等待元素被加载

我们使用selenuum操作浏览器的时候编写的代码执行的很快,有的标签还没加载完代码就执行完了,查找标签代码会直接报错,可以设置等待时间

1.隐士等待

查找标签时,找不到就会遵循该规则

bro.implicitly_wait(10)  # 等待10秒

2.显示等待:需要给每个标签绑定一个等待,麻烦不用。

标签操作注意

# 点击
tag.click()
# 输入内容
tag.send_keys()
# 清空内容
tag.clear()

# 浏览器对象 最大化
bro.maximize_window() 
#浏览器对象  截全屏并以main.png文件保存
bro.save_screenshot('main.png') 

执行JS代码

bro.excute_script('alert("美女")')
window.location # 获取当前地址
# 打开一个浏览器标签页
bro.excute_script('window.open()')
# 滑动页面
"""
document.documentElement.scrollHeight 滑动到页面底部
"""
bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)')
# 获取cookie 可以获取定义的全局变量

切换标签页

import time
from selenium import webdriver

browser=webdriver.Chrome(executable_path='chromedriver.exe')
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')  # 打开标签页

print(browser.window_handles) #获取所有的签页


browser.switch_to.window(browser.window_handles[1])  # 切换到第二个标签页
browser.get('https://www.taobao.com')  # 在第二个选项页输入淘宝
time.sleep(2)
browser.switch_to.window(browser.window_handles[0])  # 打开第一个选项页
browser.get('https://www.sina.com.cn')
browser.close()

浏览器前进后退

import time
from selenium import webdriver

browser=webdriver.Chrome(executable_path='chromedriver.exe')
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('http://www.sina.com.cn/')

browser.back()  # 后退
time.sleep(2)
browser.forward() #前进
browser.close()

异常处理

import time
from selenium import webdriver

browser=webdriver.Chrome(executable_path='chromedriver.exe')
try:
except Exception as e:
    print(e)
    
finally:
    browser.close()
posted @ 2023-03-17 19:24  李阿鸡  阅读(87)  评论(0编辑  收藏  举报
Title