Python爬虫自学
Python爬虫自学
前言
这是我自己学习Python爬虫的学习笔记,内容大部分来自上海交通大学出版的《Python语言程序设计实践教程》
参考博客:
Python爬虫教程(纯自学经历,保姆级教程)
BeautifulSoup 四大对象种类
爬虫:设置Request Header(请求头)
一,网络基础知识
1,网站访问流程
用户使用浏览器大致流程
(1)在浏览器的地址栏中输入一个网页地址(这个地址称为“统一资源定位符”(uniform resource locator,URL)),浏览器程序会通过计算机发起一个网络访问请求,这个请求称为Request
(2)互联网上的网络设备会分析这个网页地址(如www.baidu.com),在众多注册过的服务器计算机中找到对应的百度Web服务器
(3)在用户输入时的网页地址中通常会指定访问的具体是哪个网页文件,服务器上的Web服务器程序会将与此文件相关的所有数据(文字、表格、动画等)返回给用户,这个过程称为响应,也称Response
(4)当用户的计算机收到这些数据,浏览器会将所有数据按网页预先设定的格式整合起来展示给用户。一次Web访问到此基本结束了
通常访问的网址包含以下几方面信息
网络协议://服务器主机:端口/文件路径?发送数据
如http://lib.njtech.edu.cn/list.php?fid=9
第一部分代表采用何种网络协议,它告诉浏览器该如何处理要打开的文件,http(超文本传输协议)是最常用的协议
第二部分代表Web服务器的域名或IP地址,根据这部分信息,网络设备才能在众多计算机中准确找到请求访问的那一台。少数情况下,有些域名后面要指明一个端口编号
第三部分代表用户请求访问的文件名即该文件在服务器上的存储位置
第四部分是用户发送到网页文件的数据,可能是一个用户名,也可能是一个查询关键字,等等,网页文件会处理这些数据并将处理结果返回给用户。
2,HTML文档的标签及属性
要想利用计算机程序获取网页数据,就需要对网页结构有一定的了解。日常看见的网页实际上是HTML文档,包含HTML标签和纯文本。
(1)HTML指的是hypertext markup language(超文本标记语言)
(2)HTML不是编程语言,而是一种标记语言
(3)标记语言是一套标记标签(markup tag)
(4)HTML使用标记标签来描述网页
如图显示的简单网页对应的HTML脚本如下
<html>
<body bgcolor="#eeeeee"><style>.css1{background-color:yellow;color:green;font-style:italic;}</style><h1 align="center">这里是标题行</h1><p name="p1" class="css1">这里是第一段</p><p name="p2" class="css1">这里是第一段</p><img src="http://www.baidu.com/img/bd_logo1.png" style="width:200px;height:100px"></img><a id='link' href="http://baidu.com">点我跳去百度</a>
</body>
</html>
脚本中那些由<>
括起来的关键词就是标签,如<html>、<h1>、<p>
等,标签通常是成对出现的,如“<h1 align="center">这里是标题行</h1>
”中<h1>
称为开始标签,</h1>
称为结束标签。开始标签到结束标签之间的所有内容称为一个元素,文字”这里是标题行“就是这个元素的内容。标签可以具有属性,属性描述标签的各种信息和特征。属性总是出现在开始标签中,以键值对的形式展现,如name=‘p1’。
下面解释HTML文档常出现的标签及属性:
第1行的<html>
称为文档类型标签,用来告知浏览器自身是HTML格式的文件
第2行的<body>
称为网页主体标签,绝大部分网页内容包含在body标签内部。body标签属性bgcolor用来设置整体的背景颜色,bgcolor="#eeeeee"将网页背景设为浅灰色。
第3~5行设定了一个样式类css1,包含三种格式:文本设为绿色、背景设为黄色、字体为斜体。然后段落标签p1、p2的class属性都赋值为css1,使两个段落都具备了css1设定的样式。
第6行的<h1>
称为标题标签,标签中的对齐属性align="center"用来将标题文字居中显示。标签元素“这里是标题行”是给用户看的内容。
第7行的<p>
称为段落标签,标签中的名称属性name="p1"用来设置段落名称为“p1”,类属性class="css1"用来指定p1段落使用第四行中定义的css1样式。
第8行用<p>
又定义了“p2”的第二个段落。
第10行的<img>
称为图像标签,标签中的属性src指明图像文件的存储路径,属性style用以设定图像的显示大小。
第11行的<a>
称为超链接标签,标签中的属性id规定了标签在文档的唯一标识,属性href指明了单击链接将跳转的URL。标签元素“点我跳去百度”是显示给用户看的内容。
name属性和id属性都是用来在HTML文档中标识某个标签元素的,都可以用于查找指定标签。其中id属性如同学生的学号,其值在HTML中是唯一的;而name属性如同学生姓名,其值可能重复。所以查找标签时优先使用id属性。class属性称为类属性,用于给标签设置某种样式。当多个标签采用同一样式时,可以新建一个命名的样式类,在这个样式类完成格式设定,然后将class属性设为该样式类即可。实际有很多标签可能没有id或name属性,如果有class属性,经常也会通过class属性查找标签。
3,HTML文档的标签结构
在前面的HTML脚本中,共使用了8个标签,其中有6个标签都是嵌套在body标签中的。在HTML文档中,标签嵌套很常见,有时会多达几十层。这种嵌套关系如果一个图表示出来就是一个树状结构。下面用一个包含表格的HTML文档作为示例。
其源码如下
<html><head><title>网页标题</title>
</head>
<body><h2>金庸群侠传</h2><table width ="400px" border ="1"><tr><th>书名</th> <th>人物</th> <th>年份</th></tr><tr><td>《射雕英雄传》</td><td>郭靖</td><td>1959年</td></tr><tr><td>《倚天屠龙记》</td><td>张无忌</td><td>1961年</td></tr><tr><td>《笑傲江湖》</td><td>令狐冲</td><td>1967年</td></tr><tr><td>《鹿鼎记》</td><td>韦小宝</td><td>1972年</td></tr></table></body></html>
表格在HTML文档中以<table>,<tr>,<tr>,<td>
等标签来表示。<table>
代表表格,表示一行,代表标题行的一个单元格,代表数据行一个单元格。分析时可以将各级标签用下图所示的标签树加以描述,树形图层次关系反映各标签的嵌套关系。
概括的讲,HTML文档代码主要由三部分组成:标签及属性、文本、事件代码。最常见的标签大多充当数据文本的容器,规定文本、图片等内容的布局和格式;标签属性则对内容的显示样式进一步设定,如大小、颜色等。文本代表了网页实际上有意义的那部分数据,可能是文字或图片文件的路径等。爬取网页数据,实际上就是希望把这部分内容全部提取到本地计算机中进行处理。事件代码是指网页为了响应用户操作的那部分代码,称为客户端代码,通常是用JavaScript脚本语言编写并由用户浏览器执行的,如对用户填写的表单数据进行验证、对用户单击按钮的响应等。这三部分中,数据采集关心的是前两种。
4,查看HTML文档源码
通过浏览器打开网页后,在页面空白处右击,在弹出的菜单中点击“查看网页源码”(不同浏览器不同,IE为“查看源”),单击后弹出一个新的标签页显示当前网页源代码
对于采用数据动态加载技术的网页,单纯的查看源码是无法找到所需数据的,需要更高级的采集技术,不做论述(我也不会😂)。
很多网站源码动辄几百上千行,如何在源码中定位到自己所需的数据在的那部分标签代码呢?选中感兴趣的文本部分,然后右击,在弹出的菜单中单击“检查”(或“检查元素”)项。
二,requests库的使用
requests库需自行安装,在系统左下角搜索框内输入cmd,会找到一个应用“命令提示符”,打开后输入pip install requests
,回车键执行即可完成安装。
1,请求网页
通过http协议请求网页有以下几种访问方式:get、post、delete、put、head、options。只介绍get、post
两种方式。
1.get方式
get方式表示从指定的网页文件请求数据,是最常用的一种方式。当输入类似于“http://lib.njtech.edu.cn/list.php?fid=9”这样的URL时,服务器会直接返回这个网页无须用户再执行其他操作。
2.post方式
post方式表示指定的某个网页有待处理的数据源。例如,用户填写了一些表单并将表单数据提交到网页,服务器程序将对提交的数据做相关处理。这种情形很常见,如输入用户名和密码登录某网站、注册某网站账号或修改用户的个人资料,都涉及用户数据的提交。
函数 | 功能说明 |
---|---|
get(URL) | 根据给定的URL直接下载网页 |
post(URL,data={‘key’:‘value’}) | 向给定的URL的网页提交字典类型的数据 |
相比较而言,get方式用的多,下面以百度为例演示get()函数的用法。
import requests
#使用get访问百度首页,函数返回对象赋值给r变量
r=requests.get('http://www.baidu.com')
print(r.text)#打印返回对象的内容
2,带头部参数的网页请求
越来越多的网站注重对数据的保护,允许用户通过浏览器进行页面访问,但拒绝用户使用程序代码采集页面数据。例如用上面的方法去采集知乎网(http://www.zhihu.com)上的数据,会得到请求失败的信息(400 Client Error: Bad requests for url: http://www.zhihu.com)。那么网站是如何辨识用户通过浏览器还是程序代码访问呢?
用户使用浏览器访问一个页面时会发送一些请求数据,其中部分数据称为请求头部(headers),网站大多数是通过headers来分辨的。
为让网站服务器将爬虫程序理解为一次成功的浏览器访问,可以把类似的请求数据封装在一个参数中一起发给服务器,这样网站就会以为当前访问是浏览器的正常请求(没错,就是骗服务器)。requests库提供了一字典类型的headers参数,用来储存请求头的头部信息。在头部信息中,数据项很多,但不是所有项都有用,最常用的是User-Agent,其包含了用户浏览器类型、版本、以及操作系统的版本信息等。参考爬虫:设置Request Header(请求头)获取自己浏览器的User-Agent。
import requestsmyHeaders={'user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/30'}
url='http://www.zhihu.com'
r=requests.get(url,headers=myHeaders)
r.encoding='utf-8'
print(r.status_code)
print(r.text)
有些网站只加User-Agent还不能访问,可以尝试在headers字典里添加Cookie,甚至其他项,继续调试直到正常访问为止。
3,Response对象
调用一次get()函数就相当于发起了一次get方式的请求,requests库把用户请求数据封装为一个Request对象中;服务器会返回一个响应,requests库则把该响应的所有信息封装在一个Response对象中。在get方式访问百度示例中,这个Response对象就存入了变量r。
Response对象常用属性:
属性名称 | 属性说明 |
---|---|
status_code | 服务器响应状态码,整数类型,200代表请求成功,4XX或5XX代表出错 |
encoding | 服务器响应内容的编码方式,允许用户修改编码类型 |
text | 以字符串格式显示响应内容,依据头部信息中的编码约定对内容进行解码 |
content | 以字节(二进制)格式显示响应内容 |
headers | 以字典形式存储的服务器响应头部信息 |
Response对象的状态码属性status_code用一个整数反映了这次请求的结果状态,200表示请求成功;状态码4XX意味着用户发送的请求有问题,如403表示服务器拒绝请求,404表示服务器找不到请求的网页。5XX表示服务器处理请求时发生错误,如500表示服务器内部程序发生错误,503表示当前服务器无法提供服务,可能处于维护状态或停机
1.encoding属性的使用
HTML格式的网页文档本身对其内容是有一个编码设定的,这个原始的编码格式体现在Response对象的encoding属性上。有时候获取文档后出现很多看不懂的乱码,这时可以尝试将编码格式换为utf-8。
import requests
#使用get访问百度首页,函数返回对象赋值给r变量
r=requests.get('http://www.baidu.com')
r.encoding='utf-8' #方法一,直接转换response对象编码格式
print(r.text)#打印返回对象的内容
r=requests.get('http://www.baidu.com')
print(r.content.decode('utf-8'))#方法二,对二进制内容以utf-8格式解码
2.content属性的使用
如果知道一张图片的URL,可以利用content属性下载并保存这张图片。在上述r.text打印出的网页代码中,可以发现一个标签里包含了百度logo图片的URL:<img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129>
。采用以下代码可以将该图片下载保存,并重新命名为baidu.png。新建图片文件时open()函数采用了wb模式,即write+binary,以二进制形式写入图片数据
import requests
r=requests.get(http://www.baidu.com/img/bd_logo1.png)
path='D:\\learningFile\\python\\爬虫\\baidu.png'#下载文件保存的路径
with open(path,'wb') as file: #以二进制+写模式新建文件file.write(r.content)
3.raise_for_status()方法的使用
为避免某一个或几个意外问题而导致程序终止,Response对象提供了一个raise_for_status()方法。此方法主要用于当请求访问某个网页出现异常时,允许程序及时捕捉到该异常并且跳过他,转而去执行下一个网页的采集。而对个别采集失败的网页,只需要查看一下出错日志,有针对性地重新处理即可。下面以采集《天龙八部》豆瓣短评(https://book.douban.com/subject/1255625/comments/)为例。
分析URL发现,翻页时URL基本不变,只是参数start的值加20,也就是页数p=n时,start=20*p。因此可以利用range()函数循环采集前10页。
import time
import requests
url='https://book.douban.com/subject/1255625/comments/?start={}&limit=20&status=P&sort=new_score'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36',}
for p in range(0,11)try:url=url.format(int(page)*20)r=requests.get(url,timeout=30,headers=header)#由于豆瓣有反爬虫机制,所以要加上headers参数r.raise_for_status()r.encoding='utf-8'return r.textexcept Exception as ex:print("第{}页采集错误,出错原因:{}。".format(page,ex))return ""
三,BeautifulSoup库的使用
1,解析器选择
要从HTML文档中解析想要数据,首先根据该文档的源码创建一个BeautifulSoup对象,并选择一种解析器类型
import requests
import bs4
r=requests.get('http://www.baidu.com')
r.encongding='utf-8'
#新建beautifulSoup对象,赋值给soup对象
soup=bs4.BeautifulSoup(r.text,'html.parser')
BeautifulSoup对象有两个参数,第一个r.text是百度首页的文档源码,即要解析的对象;第二个html.parser是解析器类型,表示选择Python自带的解析器来解析前面的html文档
常用解析器比较
解析器 | 参数写法 | 优点 | 缺点 |
---|---|---|---|
Python标准库 | html.parser | 内置库,执行较快,解析HTML文档容错性好 | 在旧版Python容错性不好 |
lxml html解析器 | lxml | 执行速度很快,解析HTML文档容错性好 | 需安装C语言库 |
lxml xml解析器 | xml | 执行速度很快,支持解析XML格式文档 | 需安装C语言库 |
html5lib | html5lib | 容错性最好,以浏览器方式解析文档,可生成HTML5格式的文档 | 解析速度慢 |
推荐使用html.parser 和 lxml解析器。lxml解析器需事先安装,执行pip install lxml指令即可
2,BeautifulSoup的四种对象
BeautifulSoup能将HTML文档中复杂的源码映射为一个树形结构,并把整个文档中所有内容映射转化为四类对象:Tag,BeautifulSoup,NavigationString,Comment。
1.Tag对象(标签对象)
通俗点讲就是 HTML 中的一个个标签,例如
<title>The Dormouse's story</title>
<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag,下面我们来感受一下怎样用 Beautiful Soup 来方便地获取 Tags。
下面每一段代码中注释部分即为运行结果,以下图所示的HTML文档为例
# -*- coding: utf-8 -*-
import bs4
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><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"><!-- 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>
</body>
</html>
"""#创建beautifulsoup对象
#也可以用打开本地的html文件来创建beautifulsoup对象,例如:
#soup=bs4.BeautifulSoup(open('BeautifulSoup示例Tag.html'),"lxml")
soup=bs4.BeautifulSoup(html,"lxml")#格式化输出
print(soup.title)
print(soup.head)
print(soup.a)
print(soup.p)#运行结果:
<title>The Dormouse's story</title>
<head><title>The Dormouse's story</title></head>
<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
创建BeautifulSoup对象后,文档的每一个标签自动转换为有一个Tag对象存放在树形结构的相应位置。
- 利用 soup加标签名轻松地获取这些标签的内容
- 它查找的是在所有内容中的第一个符合要求的标签
- 这些对象的类型是
<class 'bs4.element.Tag'>
Tag对象有两个属性,即name,attrs,它们分别用来存储标签的类型及标签的属性。
#根据html新建的BeautifulSoup对象(html同上)
soup=bs4.BeautifulSoup(html,'html.parser')print(soup.p) #输出标签对象:<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
print(type(soup.p)) #输出对象类型:<class 'bs4.element.Tag'>
print(soup.p.name) #输出标签pprint(soup.p.attrs) #输出标签属性字典:{'class': ['title'], 'name': 'dromouse'}
print(soup.p['name']) #输出标签name属性:dromouse
print(soup.p['class']) #输出标签class属性:['title']
#运行结果
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<class 'bs4.element.Tag'>
p
{'class': ['title'], 'name': 'dromouse'}
dromouse
['title']
(标签的大多数属性是单值属性,但class属性是多值属性,因此获取class属性值得到的是一个列表)
attr获得的是字典对象,是可以修改和删除的
#-*-coding:utf-8-*-
from bs4 import BeautifulSoup
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><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"><!-- 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>
</body>
</html>
"""#创建beautifulsoup对象
#也可以用打开本地的html文件来创建beautifulsoup对象,例如:
#soup=bs4.BeautifulSoup(open('BeautifulSoup示例Tag.html'),"lxml")
soup = BeautifulSoup(html,"lxml")
#修改Tag对象的属性
soup.p['class']="newClassname"
print(soup.p)
#删除Tag对象的属性
del soup.p['class']
print(soup.p)#运行结果:
<p class="newClassname" name="dromouse"><b>The Dormouse's story</b></p>
<p name="dromouse"><b>The Dormouse's story</b></p>
2.BeautifulSoup对象
表示的是一个文档的整体,可以看做HTML文档书的根或一个顶层节点,文档的所有标签及内容都是它的后代节点。因为BeautifulSoup对象对应的是整个文档,不是某种标签,所以它没有Tsg对象的那些属性。通常情况下,是从它开始向下搜索和遍历文档树的
#前面代码同上···
#创建beautifulsoup对象
soup = BeautifulSoup(html,"lxml")
#···
print(soup.name)
print(type(soup.name))
print(soup.attr)#运行结果:
[document]
<type 'unicode'>
None
3.NavigableString对象
NavigableString称为可遍历的字符串对象,是用来操作那些包含标签内的字符串。在解析HTML文档时,真正关心的实际上是那些标签中包含的数据,而不是标签本身。这些有价值的数据可以通过NavigableString从标签中取出来,方法很简单,用.string
即可,依旧以前面的网页为例
soup = BeautifulSoup(html,"lxml")#获取标签内部文字
print(soup.p.string)
print(type(soup.p.string))#运行结果:
The Dormouse's story
<class 'bs4.element.NavigableString'>
4.Comment对象
Comment对象是一个特殊类型的NavigableString对象。
如果标签内部的内容是注释,例如:<!-- Elsie -->
。那么该NavigableSring对象会转换成Comment对象,并且会把注释符号去掉。
print(soup.a)
print(soup.a.string)
print(type(soup.a.string))#运行结果:
<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>Elsie
<class 'bs4.element.Comment'>
————————+————————
版权声明:本文为CSDN博主「tyson Lee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chinaltx/article/details/86748757
如果我们需要获得comment类型的对象,需要先判断对象类型是comment还是NavigableString。
不过大多数情况下注释价值很小,并不需要关心他们。
接下来继续解析HTML文档树,有两种思路:一种是遍历文档树,一级一级地访问文档树节点;另一种是搜索文档树,基于目标数据所在标签的特征直接进行查找。
3,遍历文档树
HTML文档既然可以映射为一棵树,则各种嵌套的标签就可以转化为树的各层结点,基于这种结构,就可以对树进行遍历访问。遍历时可能出现三种路径:自上而下遍历、水平方向遍历、自下而上遍历。下面以“金庸群侠传”页面对应的标签书为例说明。
1.自上而下解析
从上级(外层)标签开始向内分析文档,即从树形结构的上层往下访问。此时,被上级标签直接包含的标签称为子节点(children、contents),子节点及其所有的下级统称为上级标签的后代节点(descendant)。例如,<tr>
,是<table>
标签的子节点,<td>
是<tr>
的子节点,<tr>
,<td>
都是<table>
标签的后代节点。
使用soup.tr.contents
和soup.tr.children
两个属性都可以得到<tr>
标签的所有子节点,但是contents属性返回的子节点列表,可以采用列表方式访问子节点元素;而children属性返回的是子节点所构成的生成器,还需要经过循环才能取出所有节点。soup.tr.descendants属性得到的同样是生成器,也需要通过循环获取<tr>
的后代标签。
(1)使用contents属性输出标签所有子节点列表
from bs4 import BeautifulSoup,element
code='''<html><head><title>网页标题</title>
</head>
<body><h2>金庸群侠传</h2><table width ="400px" border ="1"><tr><th>书名</th> <th>人物</th> <th>年份</th></tr><tr><td>《射雕英雄传》</td><td>郭靖</td><td>1959年</td></tr><tr><td>《倚天屠龙记》</td><td>张无忌</td><td>1961年</td></tr><tr><td>《笑傲江湖》</td><td>令狐冲</td><td>1967年</td></tr><tr><td>《鹿鼎记》</td><td>韦小宝</td><td>1972年</td></tr></table></body></html>'''
soup=BeautifulSoup(code,'html.parser')
print(soup.table.contents)#输出<table>标签所有子节点
#运行结果
"""
['\n', <tr><th>书名</th> <th>人物</th> <th>年份</th></tr>, '\n', <tr><td>《射雕英雄传》</td><td>郭靖</td><td>1959年</td></tr>, '\n', <tr><td>《倚天屠龙记》</td><td>张无忌</td><td>1961年</td></tr>, '\n', <tr><td>《笑傲江湖》</td><td>令狐冲</td><td>1967年</td></tr>, '\n', <tr><td>《鹿鼎记》</td><td>韦小宝</td><td>1972年</td></tr>, '\n']
"""
从输出结果可发现,换行符也算做子节点。
(2)对children属性做循环,输出标签的子标签
for child in soup.table.children:if type(child)!=element.NavigableString:#过滤标签之间的换行符print(child)
#运行结果
"""
<tr><th>书名</th> <th>人物</th> <th>年份</th></tr>
<tr><td>《射雕英雄传》</td><td>郭靖</td><td>1959年</td></tr>
<tr><td>《倚天屠龙记》</td><td>张无忌</td><td>1961年</td></tr>
<tr><td>《笑傲江湖》</td><td>令狐冲</td><td>1967年</td></tr>
<tr><td>《鹿鼎记》</td><td>韦小宝</td><td>1972年</td></tr>
"""
(3)对descendants属性做循环,输出标签的后代标签
for des in soup.table.descendants:if type(des) !=element.NavigableString:#过滤标签间的换行符print(des)
#运行结果
'''
<tr><th>书名</th> <th>人物</th> <th>年份</th></tr>
<th>书名</th>
<th>人物</th>
<th>年份</th>
<tr><td>《射雕英雄传》</td><td>郭靖</td><td>1959年</td></tr>
<td>《射雕英雄传》</td>
<td>郭靖</td>
<td>1959年</td>
<tr><td>《倚天屠龙记》</td><td>张无忌</td><td>1961年</td></tr>
<td>《倚天屠龙记》</td>
...(省略部分)
'''
HTML文档源码中,标签间经常有换行符,而换行符属于NavigableSting类型对象,因此可用条件语句把换行符过滤掉,只留下Tag标签对象。比较children属性循环和descendants属性循环,children循环只输出了<table>
标签的5个子标签<tr>
内容;descendants循环不仅输出了直接下级<tr>
标签,也循环输出了后代标签<td>
2.水平方向解析
在HTML文档代码中经常会看见很多相同类型的标签连续出现,用来展示一些数据列表和数据表格。此时,这些同类型标签之间是同级关系,因此可以把这些标签称为兄弟节点。使用next_siblings属性解析表格内的行标签非常方便,因为行与行之间就是兄弟关系。
from bs4 import BeautifulSoup,element
code='''<html><head><title>网页标题</title>
</head>
<body><h2>金庸群侠传</h2><table width ="400px" border ="1"><tr><th>书名</th> <th>人物</th> <th>年份</th></tr><tr><td>《射雕英雄传》</td><td>郭靖</td><td>1959年</td></tr><tr><td>《倚天屠龙记》</td><td>张无忌</td><td>1961年</td></tr><tr><td>《笑傲江湖》</td><td>令狐冲</td><td>1967年</td></tr><tr><td>《鹿鼎记》</td><td>韦小宝</td><td>1972年</td></tr></table></body></html>'''
soup=BeautifulSoup(code,'html.parser')
for child in soup.table.tr.next_siblings:#获取第一行向后的兄弟标签if type(child)!=element.NavigableString:#过滤标签之间的换行print(child)
#运行结果
<tr><td>《射雕英雄传》</td><td>郭靖</td><td>1959年</td></tr>
<tr><td>《倚天屠龙记》</td><td>张无忌</td><td>1961年</td></tr>
<tr><td>《笑傲江湖》</td><td>令狐冲</td><td>1967年</td></tr>
<tr><td>《鹿鼎记》</td><td>韦小宝</td><td>1972年</td></tr>
从输出结果中容易发现,没有标题行,why?因为soup.table.tr获取的已经是表格第一行,也就是标题行,他不能把自己看作兄弟标签,所以next_siblings属性获取到的就是后面所有行的数据行。
3.自下而上解析
一个元素的直接上级对象称为父节点,对应的属性为parent。一个元素的所有上级对象则称为父辈节点,对应的属性为parents(复数形式,注意前面的content,contents,child,children,descendant,descendants)。抓取网页时查找父辈标签的情况很少,基本用法和上面两种差不多。
4,搜索文档树
现实中,一个复杂网页的节点的上下级关系可能多达几十层,所需的数据都深深藏在若干层标签之下,如果通过遍历文档树的方式去一级一级地查找目标数据所在的标签,需要话费很大的精力且容易出错。好在BeautifulSoup库提供了另外一种搜索文档树搜索的方法,能够快速地定位到目标数据所在标签附件(往往是距离目标数据不远的父辈标签),然后再利用局部的上下级节点关系,对这一块局部区域进行标签遍历,获取目标数据。
搜索过程中用的最多的方法就是find()函数和find_all()函数。这两个函数用法和参数相似,主要区别在于返回结果。find()函数返回满足查找条件的第一个对象,而find_all()函数则返回一个列表,列表元素为满足条件的所有对象。当没有找到符合条件的对象时,find()返回None,find_all()返回空列表,两个函数原型如下
find(name,attrs,recursive,text,**kwargs)
find_all(name,attrs,recursive,text,limit,**kwargs)
这两个函数参数较多且相似,实际上这些参数主要是起过滤器的作用。回想一下HTML文档源码中那些标签的特征,想想如何才能在众多标签中筛选出他们?可以从标签类型、标签标识熟悉(id)、名称属性(name)、类属性(class)等不同方面观察,如果发现目标标签具备了某种特征,就可以利用查找函数去获取它们。
有时想获取的数据位于一组同类标签中,或者目标标签不具备明显特征,那就向上观察他们的父标签;若还未找到特征,就继续查看父标签的上一级,这样由内而外的一层层分析通常会找到一个父辈节点标签具备某种特征。此时利用查找函数取出这个父辈标签的所有内容,然后就可以利用上一小节的遍历方法向下遍历解析,或者在取出的父辈标签上继续应用查找函数来获取后代标签,即可得到所想要的数据。
1.name参数
查找所有标签类型为name的对象。查找多个类型标签时,可以传入一个列表。
from bs4 import BeautifulSoup
code="""
<html>
<body bgcolor="#eeeeee"><style>.css1{background-color:yellow;color:green;font-style:italic;}</style><h1 align="center">这里是标题行</h1><p name="p1" class="css1">这里是第一段</p><p name="p2" class="css1">这里是第二段</p><img src="http://www.baidu.com/img/bd_logo1.png" style="width:200px;height:100px"></img><a id='link' href="http://baidu.com">点我跳去百度</a>
</body>
</html>"""
soup=BeautifulSoup(code,'html.parser')
print(soup.find_all('h1'))
#输出:[<h1 align="center">这里是标题行</h1>]
print(soup.find_all('h2'))
#输出:[]
print(soup.find_all('p'))
#输出:[<p class="css1" name="p1">这里是第一段</p>, <p class="css1" name="p2">这里是第一段</p>]
print(soup.find_all(['p','a']))
#输出:[<p class="css1" name="p1">这里是第一段</p>, <p class="css1" name="p2">这里是第一段</p>, <a href="http://baidu.com" id="link">点我跳去百度</a>]
2.**kwargs(关键字参数)
如果一个指定名字的参数不是find_all()函数内置的参数名,搜索时会把该参数名当做标签的属性来搜索。常见情况是:如果目标标签具备id属性,则优先采用id属性进行标签搜索,因为标签的id属性值在文档中大多是唯一的。
print(soup.find_all(id='link'))
#输出:print(soup.find_all(id='link'))
print(soup.find_all('h1',align="center"))
#输出:[<h1 align="center">这里是标题行</h1>]
需要注意标签的class属性,因为class本身就是Python语言中的关键字,所以采用class属性作为keyword参数搜索时,需要加一个下划线,写成class_。如果一个标签的class属性被赋予多个值时,此时只要有一个值匹配即认为满足条件。
soup2=BeautifulSoup('<p class="css1 css2"></p>','html.parser')
print(soup2.find_all(class_='css1'))
print(soup2.find_all(class_='css2'))
print(soup2.find_all(class_='css1 css2'))
#输出:以上三条语句都输出:
#[<p class="css1 css2"></p>]
3.attrs参数
attrs参数定义了一个字典参数来实现对标签属性的查找匹配。虽然对于大多数标签属性用keyword参数也能实现查找,但某些特殊情况,如HTML5格式文档中有一种data-foo属性,data-foo不符合Python标识符命名规则,是不能作为参数名的,此时需要attrs参数实现
>>>soup.find_all(attrs={'data-foo':'value'})
#输出:[]
>>>soup.find_all(attrs={'class':'css1'})
#输出:[<p class="css1" name="p1">这里是第一段</p>, <p class="css1" name="p2">这里是第二段</p>]
>>>soup.find_all('p',{'name':'p2','class':'css1'})
#输出:[<p class="css1" name="p2">这里是第二段</p>]
4.recursive参数
函数默认是查找当前对象的所有后代起点,如果只想搜索当前标签对象的子节点,无需查找子节点的后代,对recursive参数赋值为False即可。
5.text参数
text参数是针对文本内容的查找,通过它可以搜索文档的字符串内容。如果直接对text参数赋值进行查找的话,只有标签内的字符串与参数值完全不一样才算匹配。所以大多数情况下,对于文本字符串的搜索都是基于关键字的模糊查询,此时需要用到正则表达式,需要导入库re
>>>soup.find_all(text='这是第一段')
#输出:['这是第一段']
>>>soup.find_all(text='是')
#输出:[]
>>>import re
>>>soup.find_all(text=re.compile("是"))
#输出:['这里是标题行','这是第一段','这是第二段']
6.limit参数
find_all()方法默认返回对当前对象进行全部搜索的匹配结果,如果当前对象嵌套的后代标签很多,搜索会很慢。当不需要全部结果时,可以使用limi参数限制返回结果的数量,一旦匹配结果达到limit规定的数量就会停止搜索并立刻返回。
四,爬虫应用实例
前面学习requests库时,曾以豆瓣上《天龙八部》短评为例,讲解如何抓取网页源码,现在进一步实现从源码中获取真正想要的那部分评论,并以此生成一个词云图片。
为了让代码结构清晰,对代码进行拆分,将抓取网页源码、分析网页源码抽取评论内容、生成词云图片文件三部分功能分别定义成独立函数,有主程序进行调用。
豆瓣作为公共网站,对爬虫程序有一定的限制,所以在代码中需要增加休眠函数time.sleep(2),每爬取一页评论后暂停2秒,否则爬虫程序会被网站拒绝访问(可能会封号,然后你的电脑就不能进入这个网站)。很多成熟的网站都有类似限制,所以程序的爬去频率不可太频繁。
为了能够从HTML文档源码获取到评论内容,需要分析评论内容所在标签的特征,以便利用BeautifulSoup库进行筛选。选中网页上一段短评内容,然后利用浏览器的检查元素功能,可以查看到源码中这段评论所在的局部标签树结构
图中的源码中有一组结构相同的列表项标签<li>
,评论内容是位于<li>
的一个后代标签<span>
之内的。从<li>
标签往上看,可发现一个上级标签具备属性id=‘comments’,所以可以考虑直接对HTML文档对象使用查询函数find()来获取这个div标签,然后再向下获取它内部的所有<li>
、<p>
、<span>
标签及内容。
在前面已经知道豆瓣评论每页网址变化规律为start=20,40,60……因此可以用
'https://book.douban.com/subject/1255625/comments/?start={}&limit=20&status=P&sort=new_score'.format(int(page)*20)
page(=1,2……10)为变量循环
import time,requests,jieba
from bs4 import BeautifulSoup
from wordcloud import WordCloud#函数1:爬取给定url的html文档
def getHtmlDoc(url,page,header):try:url=url.format(int(page)*20)r=requests.get(url,timeout=30,headers=header)#由于豆瓣有反爬虫机制,所以要加上headers参数r.raise_for_status()r.encoding='utf-8'return r.textexcept Exception as ex:print("第{}页采集错误,出错原因:{}。".format(page,ex))return ""#函数2:获取给定html文档中的评论内容,返回评论列表
def getComment(html):comment=[]#该列表用于存放当前页面的所有评论soup=BeautifulSoup(html,'html.parser')div=soup.find('div',id='comments')#获取<div>标签内部的所有列表项标签<li>,再获取后代标签<p>、<span>for li in div.find_all('li',{'class':'comment-item'}):p=li.find('p',{'class':'comment-content'})text=p.span.stringcomment.append(text)return comment#函数3:根据给定评论文件,利用jieba库分词后生成词云文件
#这里提供两种生成词云的方式,第一种是根据文本生成词云,第二种是根据字典生成词云
#第一种因为不好去除词云图片里的单个字,所以采用第二种
"""def creatWordCloud(fileName):with open(fileName,'r',encoding='utf-8') as file:text=file.read()ls_word=jieba.lcut(text)#利用jieba库对所有评论进行分词all_words=','.join(ls_word)#所有词语以逗号连接成一个长字符串wcloud=WordCloud(font_path=r'C:\Windows\fonts\simhei.ttf',width=1000,height=800,background_color='white',max_words=200,margin=2)wcloud.generate(all_words)#生成词云图片文件,主文件名同文本文件名fileCloud=fileName.split('.')[0]+'.png'wcloud.to_file(fileCloud)
"""
def creatWordCloud(fileName):with open(fileName,'r',encoding='utf-8') as file:text=file.read()counts={}#存放词语及其词频的字典ls_word=jieba.lcut(text)#利用jieba库对所有评论进行分词for word in ls_word:if len(word)==1:#排除单字continueelse:rword=wordcounts[rword]=counts.get(rword,0)+1wcloud=WordCloud(font_path=r'C:\Windows\fonts\simhei.ttf',width=1000,height=800,background_color='white',max_words=200,margin=2)wcloud.fit_words(counts)#生成词云图片文件,主文件名同文本文件名fileCloud=fileName.split('.')[0]+'.png'#取fileName的前半部分和.png拼接wcloud.to_file(fileCloud)
#以下为主程序
url='https://book.douban.com/subject/1255625/comments/?start={}&limit=20&status=P&sort=new_score'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36',}
all_comment=[] #存储全部评论的列表for p in range(1,11):html=getHtmlDoc(url,str(p),headers) #循环爬取前10页html文档page_comment=getComment(html) #从html文档中抽取评论内容all_comment.extend(page_comment) #每页的评论列表添加到总列表中time.sleep(2) #每爬取一页暂停2sprint('第{}页处理完成。'.format(p))print('网页采集结束,开始写入文件、生成词云')
#评论列表全部写入文件
fileName='D:\\learningFile\\python\\爬虫\\4应用实例\\天龙八部评论.text'
with open(fileName,'w',encoding='utf-8') as file:file.writelines(all_comment)#根据评论文件生成词云
creatWordCloud(fileName)
print('词云生成结束。')
最后运行得到的结果如下图
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 风水——概率学——需要大数据依托
首先,什么是科学? 科学,就是被证实客观存在的普遍现实,但它并不代表,没有被证实的事物,就是伪科学。相反,现有的科学,却很有可能是伪科学,就像曾经的地心说,…...
2024/4/19 15:02:41 - Ubuntu18.04安装RTL8068驱动程序
首先下载安装 Openssl, sudo apt-get update sudo apt-get install gcc makegit clone --recursive https://github.com/openssl/openssl.git cd openssl ./Configure make make test sudo make install sudo ldconfig /usr/local/lib64/ 然后安装r8168的驱动&…...
2024/4/28 6:52:57 - ‘pytest‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
1.问题截图 我的原因是C:\Program Files\Python38\Scripts路径下没有py.test.exe和pytest.exe文件 将C:\Users\GT\AppData\Roaming\Python\Python38\Scripts路径下的该文件复制到C:\Program Files\Python38\Scripts下就可以了...
2024/4/28 6:25:42 - 简单DOS命令
首先打开控制台 盘符切换 直接输入盘符冒号 d: 没有空格 查看当前目录下所有文件 dir 也是直接输入然后回车 切换目录 cd格/d空格盘符:文件名称 cd /d e:steam cd /d 地址很重要 返回上一级 cd.. 点是小数点,两个点就表示上一级 清理控制台屏…...
2024/4/16 22:03:19 - 9张图,32个案例带你轻松玩转Java stream
大家好,我是君哥。 Java8 中增加了 Stream 处理,可以配合 Lambda 表达式来使用,让操作集合非常便利。虽然我们平时经常使用 Stream,但用到的方法其实非常少,这篇文章就来完整的介绍 Stream 的使用。 Stream 提供的方法…...
2024/4/13 21:13:47 - 2021年春节前总结
2021年再疫情中度过,收获的是自己是准爸爸了,失落很多,工作没啥起色 ,没有年终奖,领导认可度一般,希望2022一切都更好,努力提高自己 专业知识,情商,做好一个好爸爸的职责…...
2024/4/13 21:14:02 - 免费下载1-Java1.6中文版api下载
有些人真是想钱想疯了 从现在开始我遇到一个需要有人收费的东西我就直接挂上来 都不是自己的东西 怎么好意思收费 链接:https://pan.baidu.com/s/1r6s3pxeliVxVbiR-ZzsUzA 提取码:3tmw --来自百度网盘超级会员V2的分享...
2024/4/7 19:18:04 - VS Code常见正则表达式,如删除空行、删除重复行等等
^\s*([a-z])[\.]* 删除a-z开头的行 ^\s*(?\r?$)\n 删除空行 ^(.)((?:\r?\n.*)*)(?:\r?\n\1)$ 替换$1$2 删除重复行 ^[A-Za-z0-9]$ 删除英文和带数字的英文行 ^[!]$ 删除一个!的行 ^[a-zA-Z0-9’!"]$ 删除里面带,!"的英文行 ^[A-Za-z0-9’!";_()?……...
2024/4/28 4:38:11 - Excel如何拆分产品规格数据
如下图是某公司各产品规格表,A列为产品信息,B列为产品规格数据,其中三个数字分别代表长宽高。现在我们想要将B列产品规格数据拆分,分别放在C,D,E三列中。 选中B2:B12单元格区域 点击下图选项(Excel工具箱,百…...
2024/4/13 21:13:57 - PyCharm中出现怪异的Unresolved Reference
你要做的就是:File → Settings → Editor → File Types → Ignore files and folders,干掉框框中的:__init__.py;,然后:OK等待重新文件扫描,如果还不行,那就:File → Invalidate C…...
2024/4/28 10:58:27 - 一文摸懂OkHttp,android热修复视频
// 他会从正在执行运行的Call中先进行查找,再从准备执行的Call中查找 if (!call.call.forWebSocket) { val existingCall findExistingCallWithHost(call.host) if (existingCall ! null) call.reuseCallsPerHostFrom(existingCall) } } promoteAndExecute()…...
2024/4/13 21:14:12 - MySQL开发篇,存储引擎的选择真的很重要吗?
前言 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后一篇,希望能带给大家些许收获,不知不觉查找文档和参考实体书籍就写了这么多&#x…...
2024/4/28 11:34:20 - 流体力学与NS方程
流体力学是否可以使用NS方程表示,需要看流体分子或者原子的平均自由程和流体微元的比例大小。 一般在宏观低速情况下,使用本构方程和牛顿第二定律得到流体的控制方程和固体的控制方程。 F为流体微元所受重力或者其他比如电磁力等,以及正应力和…...
2024/4/27 23:37:00 - Anaconda 常用命令
Anaconda下查看已经创建了哪些环境 conda info --env创建虚拟环境,使用 conda create -n rainfall_dev python3.9.7创建一个名字为rainfall_dev ,python版本为3.9.7的环境 进入虚拟环境,使用 $ conda activate spider-venv退出虚拟环境&a…...
2024/4/15 22:00:34 - 网页结构详解
转自:微点阅读 https://www.weidianyuedu.com/content/4817446912814.html 有人说“互联网中有50%以上的流量是爬虫”,第一次听这句话也许你会觉得这个说法实在太夸张了,怎么可能爬虫比用户还多呢?毕竟会爬虫的相对与不会爬虫的简…...
2024/4/28 4:03:52 - 51单片机数码管动态显示数字
代码如下(示例): #include <reg52.h> #define uchar unsigned char #define uint unsigned intsbit SMG_0 P2^1; sbit SMG_1 P2^2; sbit SMG_2 P2^3; sbit SMG_3 P2^4; uchar code num[]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x…...
2024/4/28 8:33:45 - typora简单实使用(写博客用)
#加空格加标题名字回车就是个标题 两个#就是二级标题 最多六级标题六个# 字体 CTRLb粗体;CTRLi斜体;CTRLu下划线**(删除线)** 前后加一个星号和两个星号,或者加~也可以达到同样效果 文字高亮 前后两个“” 删除线…...
2024/4/28 1:58:45 - 打卡50天
leetcode 566. 重塑矩阵 class Solution:def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:m,n len(mat),len(mat[0])if m * n ! r * c:return matans [[0] * c for _ in range(r)]for i in range(m*n):ans[i//c][i%c] mat[i//n][i%n…...
2024/4/20 5:13:36 - 工作流引擎的:挂起-延迟设计与实现
说明 1.当一件工作需要暂停,或者需要延时处理时,就需要这个功能。 2.挂起,并不是终止工作,而是告诉工作的发送人,该工作需要暂缓。 3.比如:一个维修工人接到多个工单的时候,手里的工单排队&…...
2024/4/13 21:13:42 - 43. Leetcode 94. 二叉树的中序遍历 (二叉树-二叉树遍历)
给定一个二叉树的根节点 root ,返回它的 中序 遍历。示例 1:输入:root [1,null,2,3] 输出:[1,3,2] 示例 2:输入:root [] 输出:[] 示例 3:输入:root [1] 输出ÿ…...
2024/4/13 21:14:38
最新文章
- electron ipcRenderer.invoke 和 ipcMain.handle 介绍
ipcMain.handle 是 Electron 主进程中的一个方法,用于处理从渲染进程发送过来的 IPC 请求,并返回一个 Promise。渲染进程可以使用 ipcRenderer.invoke 方法发送 IPC 请求到主进程,并等待主进程处理完成后返回结果。 在主进程中 (main.ts)&am…...
2024/4/28 14:02:00 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 【讲解下Docker in Docker的原理与实践】
🌈个人主页:程序员不想敲代码啊🌈 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家🏆 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提…...
2024/4/26 14:50:15 - 新能源汽车驱动电机振动噪音分析
驱动电机示例图 驱动电机的噪声主要分为空气动力噪声、电磁噪声和机械噪声。其中在高速运转时空气动力噪声是主要噪声,中低速运转时电磁噪声为主要噪声。 1、空气动力噪声: 空气噪声主要由于风扇转动,使空气流动、撞击、摩擦而产生&#x…...
2024/4/23 4:51:31 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/28 13:52:11 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/28 13:51:37 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57