3-爬虫-搜索文档树(find和find_all)、bs4其它用法、css选择器、selenium基本使用以及其他、selenium(无头浏览器、搜索标签)

1 搜索文档树
1.1 find和find_all
1.2 爬取美女图片
2 bs4其它用法
3 css选择器

4 selenium基本使用
4.1 模拟登录

5 selenium其它用法
5.1 无头浏览器
5.2 搜索标签

遍历文档树

-1 request 使用代理proxies = {'https': 192.168.1.12:8090,}-2 代理的使用-高匿 透明-免费---》爬取免费代理--》开源-https://www.zdaye.com/free/  ---》验证-收费-3 django 获取访问者ip---》公网-django如果在内网---》局域网内访问没问题-如果到了公网,再回就回不来了-使用内网穿透技术实现-公网  内网-4 爬取视频网站-1 获取一条条视频--》分析出一个地址--》正则-2 解析出视频id,视频地址-3 携带referer-4 视频不能播放--》能播的和不能播的有什么区别-5 爬新闻    -requests+bs4-find_all-find-6 bs介绍和使用-解析库---》xml-指定解析器  lxml   html.parser-7 遍历文档树-soup=BeautifulSoup()-soup.body.title  返回的对象 也有这些方法和属性 Tag ,BeautifulSoup继承了Tag-BeautifulSoup类继承了Tag,所以以后拿到的任意一个标签都是Tag类的对象,所有的遍历文档,获取属性,文本---》跟BeautifulSoup的对象一样用    - . 找标签   只能找到第一个- .标签.标签- 获取标签名  soup.body.name- 获取标签属性:soup.标签.attrs.get('属性名')  类 :class标签 列表- 获取标签文本内容:-text:子子孙孙的内容拼到一起-string:该标签有且只有它自己 有内容-strings:子子孙孙放到生成器中-子节点-兄弟节点-父亲节点

1 搜索文档树

# 1 find_all :找所有  列表
# 2 find  找一个 Tag类的对象

1.1 find和find_all

from bs4 import BeautifulSouphtml_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b><span>lqz</span></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">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, 'html.parser')
# 1、五种过滤器: 字符串、正则表达式、列表、True、方法####  字符串
# -可以按标签名,可以按属性,可以按文本内容
# - 无论按标签名,按属性,按文本内容 都是按字符串形式查找# p=soup.find('p')
# 找到类名叫 story的p标签
# p=soup.find(name='p',class_='story')
#### 可以按标签名,可以按属性,可以按文本内容
# obj=soup.find(name='span',text='lqz')
# obj=soup.find(href='http://example.com/tillie')# 属性可以写成这样
# obj=soup.find(attrs={'class':'title'})
# print(obj)#### 正则  无论按标签名,按属性,按文本内容 都是按正则形式查找
# 找到所有名字以b开头的所有标签
import re# obj=soup.find_all(name=re.compile('^b'))
# obj=soup.find_all(name=re.compile('y$'))
# obj=soup.find_all(href=re.compile('^http:'))
# obj=soup.find_all(text=re.compile('i'))
# print(obj)### 列表  无论按标签名,按属性,按文本内容 都是按列表形式查找
# obj=soup.find_all(name=['p','a'])
# obj = soup.find_all(class_=['sister', 'title'])
# print(obj)#  True无论按标签名,按属性,按文本内容 都是按布尔形式查找
# obj=soup.find_all(id=True)
# obj=soup.find_all(href=True)
# obj=soup.find_all(name='img',src=True)
# print(obj)### 方法 无论按标签名,按属性,按文本内容 都是按方法形式查找
def has_class_but_no_id(tag):return tag.has_attr('class') and not tag.has_attr('id')print(soup.find_all(name=has_class_but_no_id))

1.2 爬取图片

import requests
from bs4 import BeautifulSoupres = requests.get('https://pic.netbian.com/tupian/32518.html')
res.encoding = 'gbk'
# print(res.text)soup = BeautifulSoup(res.text, 'html.parser')
ul = soup.find('ul', class_='clearfix')
img_list = ul.find_all(name='img', src=True)
for img in img_list:try:url = img.attrs.get('src')if not url.startswith('http'):url = 'https://pic.netbian.com' + urlprint(url)res1=requests.get(url)name=url.split('-')[-1]with open('./img/%s'%name,'wb') as f:for line in res1.iter_content():f.write(line)except Exception as e:continue

2 bs4其它用法

# 1 遍历,搜索文档树---》bs4还可以修改xml-java的配置文件一般喜欢用xml写-.conf-.ini-.yaml-.xml# 2 find_all 其他参数-limit=数字   找几条 ,如果写1 ,就是一条-recursive# 3 搜索文档树和遍历文档树可以混用,找属性,找文本跟之前学的一样

< h1 id=“css”>3 css选择器

# id选择器#id号
# 标签选择器标签名
# 类选择器.类名# 记住的:#id.sisterheaddiv>a  # div下直接子节点adiv a  # div下子子孙孙节点a# 一旦会了css选择器的用法---》以后所有的解析库都可以使用css选择器去找
import requests
from bs4 import BeautifulSoupres = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')
# print(res.text)
soup = BeautifulSoup(res.text, 'html.parser')
# a=soup.find(name='a',title='下载哔哩哔哩视频')
# print(a.attrs.get('href'))# p=soup.select('#cnblogs_post_body p:nth-child(2) a:nth-child(5)')[0].attrs.get('href')
# p=soup.select('#cnblogs_post_body > p:nth-child(2) > a:nth-child(5)')[0].attrs.get('href')  # 以后直接复制即可
p=soup.select('a[title="下载哔哩哔哩视频"]')[0].attrs.get('href')  # 以后直接复制即可
print(p)

4 selenium基本使用

# 这个模块:既能发请求,又能解析,还能执行js
# selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题# selenium 会做web方向的自动化测试
# appnium 会做 app方向的自动化测试# selenium 可以操作浏览器,模拟人的 行为# 如何使用1 下载浏览器驱动:https://registry.npmmirror.com/binary.html?path=chromedriver/https://googlechromelabs.github.io/chrome-for-testing/https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.105/win64/chromedriver-win64.zip跟浏览器型号和版本一一对应的ie,火狐,谷歌:谷歌为例谷歌浏览器有很多版本:跟版本一一对应2 安装 selenium3 写python代码,操作浏览器import timefrom selenium import webdriver# 跟人操作浏览器一样,打开了谷歌浏览器,拿到浏览器对象bro=webdriver.Chrome()# 在地址栏中输入地址bro.get('https://www.baidu.com')time.sleep(5)bro.close()

4.1 模拟登录

import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bybro = webdriver.Chrome()
bro.get('https://www.baidu.com')
bro.implicitly_wait(10)  # 设置等待---》从页面中找标签,如果找不到,就等待
# 最大化
bro.maximize_window()
# print(bro.page_source) # 当前页面的html内容
# 找到登录按钮--》选择器---》css选择器
# a_login=bro.find_element(by=By.NAME,value='tj_login')
# a_login=bro.find_element(by=By.ID,value='s-top-loginbtn')
a_login = bro.find_element(by=By.LINK_TEXT, value='登录')  # a 标签连接文字
time.sleep(2)
# 点击
a_login.click()# 找到短信登录 点击
sms_login = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__changeSmsCodeItem')
sms_login.click()
time.sleep(1)
user_login = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__changePwdCodeItem')
user_login.click()
time.sleep(1)
username = bro.find_element(by=By.NAME, value='userName')
# 往输入框中写文字
username.send_keys('lqz@qq.com')
password = bro.find_element(by=By.ID, value='TANGRAM__PSP_11__password')
# 往输入框中写文字
password.send_keys('lqz@qq.com')agree = bro.find_element(By.ID, 'TANGRAM__PSP_11__isAgree')
agree.click()
time.sleep(1)submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__submit')
submit.click()time.sleep(3)
bro.close()

5 selenium其它用法

5.1 无头浏览器

# 如果我们做爬虫,我们只是为了获取数据,不需要非有浏览器在显示---》隐藏浏览器图形化界面import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
bro = webdriver.Chrome(options=chrome_options)bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')print(bro.page_source)
time.sleep(3)
bro.close()

5.2 搜索标签

1 搜索标签
By.ID  # 根据id号查找标签
By.NAME  # 根据name属性查找标签
By.TAG_NAME  # # 根据标签查找标签
By.CLASS_NAME # 按类名找
By.LINK_TEXT # a标签文字
By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配---------selenium 自己的--------
By.CSS_SELECTOR # 按css选择器找
By.XPATH  #按xpath找2 获取标签的属性,文本,大小,位置
print(tag.get_attribute('src'))
print(tag.id)  # 这个id不是id号,不需要关注
print(tag.location)
print(tag.tag_name)
print(tag.size)

import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
bro = webdriver.Chrome(options=chrome_options)bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')#### 不建议使用----》selenium提供的查找
# soup=BeautifulSoup(bro.page_source,'html.parser')
# print(soup.find(title='下载哔哩哔哩视频').attrs.get('href'))# selenium提供的查找
# By.ID  # 根据id号查找标签
# By.NAME  # 根据name属性查找标签
# By.TAG_NAME  # # 根据标签查找标签
# By.CLASS_NAME # 按类名找
# By.LINK_TEXT # a标签文字
# By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配
#---------selenium 自己的--------
# By.CSS_SELECTOR # 按css选择器找
# By.XPATH  #按xpath找#### 找到标签后,获取标签属性,文本,位置,大小等
# print(tag.get_attribute('src'))
# print(tag.id)  # 这个id不是id号,不需要关注
# print(tag.location)
# print(tag.tag_name)
# print(tag.size)
div=bro.find_element(By.ID,'cnblogs_post_body')
# res=div.get_attribute('class')   # 获取标签属性
print(div.get_attribute('class'))
print(div.id)  # 这个id不是id号,不需要关注
print(div.location) # 在页面中位置: x y轴效果---》
print(div.tag_name) # 标签名
print(div.size) # 标签大小  x y
print(div.text) # 文本内容## 找到页面中所有div
# divs=bro.find_elements(By.TAG_NAME,'div')
# print(len(divs))# 按类名找
# div=bro.find_element(By.CLASS_NAME,'postDesc').text
# print(div)# 按css选择器
# div=bro.find_element(By.CSS_SELECTOR,'div.postDesc').text
# div=bro.find_element(By.CSS_SELECTOR,'#topics > div > div.postDesc').text
# print(div)# 按xpath选择---专门学xpath的语法
# div=bro.find_element(By.XPATH,'//*[@id="topics"]/div/div[3]').text
# print(div)time.sleep(1)
bro.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊 tcp/ip 在.NET故障分析的重要性

一&#xff1a;背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后&#xff0c;真的越来越体会到计算机基础课的重要&#xff0c;比如 计算机网络 课&#xff0c;如果没有对 tcpip协议 的深刻理解&#xff0c;解决这些问题真的很难&#xff0c;因为你只能在高层…

线性代数之 伪逆矩阵

目录 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD ◼ 用Python代码计算A的伪逆矩阵 ◼ 笔算A的伪逆矩阵 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD 逆矩阵并不总是存在&#xff0c;即使是方阵。然而&#xff0c;对于非正方形矩阵&#xff0c;存在一个伪逆矩阵&#xff0c;也叫摩尔-彭罗斯…

SpringIoC之Bean生命周期源码主要流程解析

文章目录 生成BeanDefinition合并BeanDefinition加载类实例化前实例化 生成BeanDefinition Spring启动的时候会进行扫描&#xff0c;会先调用 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePacka…

OPCUA 行业配套标准:机器人

OPC UA 定义了对象&#xff0c;对象类型&#xff0c;结构化组织能力和定义对象之间关系的能力&#xff0c;利用这些基础和衍生类型及对象&#xff0c;用户还可以搭建出更复杂的类型&#xff0c;关系和对象。 如果不同的厂商或者用户定义的信息模型不同&#xff0c;将会影响系统…

qml添加滚动条

import QtQuick.Controls 2.15ScrollBar.vertical: ScrollBar {visible: flick1.contentHeight > flick1.heightanchors.right: parent.rightanchors.rightMargin: 40width: 10active: truecontentItem: Rectangle {radius: 6opacity: 0.5color: "#7882A0"} }

Linux 安装 Nginx 并配置为系统服务(超详细)

目录 前言安装 Nginx安装依赖项下载Nginx解压Nginx编译和安装防火墙设置启动Nginx 配置 Nginx 为系统服务配置 Nginx 服务文件启动 Nginx 服务设置开机自启动检查 Nginx 状态停止 Nginx 服务重启 Nginx 服务 卸载 Nginx结语 前言 Nginx是一款卓越的高性能Web服务器&#xff0c…

MySQL(11):数据处理之增删改

插入数据 方式1&#xff1a; 一条一条的添加数据 为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);# 没有指明添加的字段 INSERT INTO emp1 VALUES (1,TOM,2023-11-06,3400);没有指明添加的字段&#xff0c;要按照声明顺序&#xff0c;进行…

docker搭建EMQX集群+nginx转发TCP

一、三台机器安装 1、三台都拉取镜像 docker pull emqx/emqx:5.0.262、三台分别运行镜像 第一台 docker run -itd --network host --name emqx --restart always \-p 1883:1883 \-p 18083:18083 \-p 8083:8083 \-p 8883:8883 \-p 8080:8080 \-e EMQX_NAME"master1"…

PyTorch 从tensor.grad 看 backward(权重参数) 和 gradient accumulated

1. 新建一个自变量 tensor x import torchx torch.ones(1, requires_gradTrue) print(x)1. 输出&#xff1a; tensor([1.], requires_gradTrue)2. 写一个 forward import torchx torch.ones(1, requires_gradTrue) y x**2 z x**33. y, z 都 backward import torchx to…

Voice Control for ChatGPT简单高效的与ChatGPT进行交流学习。

快捷又不失灵活性 日常生活中&#xff0c;我们与亲人朋友沟通交流一般都是喜欢语音的形式来完成的&#xff0c;毕竟相对于文字来说语音就不会显的那么的苍白无力&#xff0c;同时最大的好处就是能解放我们的双手吧&#xff0c;能更快实现两者间的对话&#xff0c;沟通便更高效…

排序算法的分析及实现

目录​​​​​​​ 1. 排序 1.1. 排序的概念 1.2. 排序的稳定性 1.3. 内部排序和外部排序 2. 直接插入排序 2.1. 直接插入排序 2.2. 直接插入排序的两种情况 1. 情况一 2. 情况二 2.3. 直接插入排序的单趟排序 2.4. 直接插入排序的完整实现 2.5. 直接插入排序的时…

如何手动获取spring/springboot中的IOC容器(全局上下文对象)?

IDE&#xff1a;IntelliJ IDEA 2022.2.3 x64 操作系统&#xff1a;win10 x64 位 家庭版 JDK: 1.8 文章目录 前言一、如何手动获取spring容器[ApplicationContext]&#xff1f;方式①&#xff1a;在启动类中获取spring容器方式②&#xff1a;自定义工具类实现ServletContextList…

MySQL_主从复制_环境搭建

MySQL主从复制配置 CentOS 7 配置 阿里云 yum 源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo sudo yum clean all sudo yum makeca…

Typecho V1.2.1 博客更换域名还原

网站老是到期或则要换服务器&#xff08;IP地址&#xff09;&#xff0c;单独改IP老是有图片不能加载&#xff0c;出个完整的迁移教程&#xff1a; 系统环境&#xff1a;Ubuntu 2204 宝塔面板 8.0.3 Nginx1.22 PHP 8.1 MySQL 5.7 备份 进入宝塔将网站根目录直接压缩&#xff0…

pytorch复现_UNet

什么是UNet U-Net由收缩路径和扩张路径组成。收缩路径是一系列卷积层和汇集层&#xff0c;其中要素地图的分辨率逐渐降低。扩展路径是一系列上采样层和卷积层&#xff0c;其中特征地图的分辨率逐渐增加。 在扩展路径中的每一步&#xff0c;来自收缩路径的对应特征地图与当前特征…

MySQL -- 索引

MySQL – 索引 文章目录 MySQL -- 索引一、索引简介1.简介2.索引效率的案例 二、认识磁盘1.磁盘2.结论3.磁盘随机访问(Random Access)与连续访问(Sequential Access) 三、MySQL 与磁盘交互基本单位1.基本单位2.MySQL中的数据管理 五、索引的理解1.索引案例2.单页mysql page3.管…

ts学习01-开发环境搭建

环境 nodejs 18 npm 安装typescript npm install typescript # 如果上面太慢&#xff0c;可以执行下面的方法 npm install typescript --registryhttps://registry.npm.taobao.orgHelloWorld 新建index.ts console.log("hello ts");执行下面命令进行编译 npx t…

【ArcGIS Pro二次开发】(74):Python、C#实现Excel截图导出图片

以村庄规划制图为例&#xff0c;通过对现状和规划用地的统计&#xff0c;生成Excel格式的【空间功能结构调整表】后&#xff0c;需要进一步将表格导出成图片&#xff0c;并嵌入到图集中&#xff0c;这样可以实现全流程不用手动参与&#xff0c;让制图的流程完全自动化。 关于E…

5G技术的应用和发展

一、什么是5G技术 5G技术是第五代移动通信技术的缩写&#xff0c;是一项全新的高速无线通信技术&#xff0c;它可以提供更高的带宽和更低的延迟&#xff0c;以实现更快的数据传输和更好的用户体验。5G技术的主要特点包括更高的数据传输速率、更低的延迟、更大的网络容量、更好…

Go 语言循环语句

文章目录 1. for 循环:2. for 循环的无限循环形式:3. range 循环:4. while 循环模拟:5. do-while 循环模拟:6. 循环控制语句 Go语言提供了多种循环语句&#xff0c;用于重复执行一段代码块。以下是Go语言中常用的循环语句&#xff1a; 1. for 循环: #mermaid-svg-iLHuj1pKeODq…