Python程序设计与科学计算精录&总结Episode.4 Python进阶:自动化办公应用(基于Michael导师Python课程与VS2019)

听说,
星空从不耀白。
所以,
凡是夜,
我都低头疾走。

宁静的夏,
望着猎户天际划破,
你许下丝缕的心愿,
愿与我恒久。

可是,
哪里有长守,只不过是慰藉呓语几片。
你悄悄地离开,
捎去美丽的心愿,
敲碎明镜似的梦。

待时间的风,
寻你脚踪。

                                                                                                                                 ——頠宸


 先大致说说第三篇总结包含的Python自动化办公的知识点。事实上,利用python发邮件都是我们比较熟悉的操作了。想要群发邮件,想要快速处理邮件,但是不想通过邮箱网页一点点调,最好的方式就是交给Python自动搞定。我们所需做的就是简单地写一段控制代码调用对应的模块即可。除了发邮件,在日常工作中经常都需要去网上搜索现成的文章或数据进行学习。那么如果没有python这个工具,所有爬取网络数据的工作需要我们手动复制、整理、格式化、存储,大大浪费我们工作的准备时间。毕竟我们的工作重心应当是放在获取数据后的处理、加工、创新上面。提及数据的处理加工,又可以用到python数据分析的功能模块,通过简单的代码实现批量数据的整和,最终得到我们想要的文件。由此可见python在办公方面极其强大,而且更适合诸如商科同学、管理专业同学日常工作所需。据博主了解,当前不论腾讯、百度、阿里这些大公司产品管理等的工作岗位,面试时都要求具备一定的Python工作能力。这并不困难,在熟悉了python基础语法后,仅需这一篇文章就能总结自动化办公常用的功能。在文章的最后,我还将简要总结一个用Python进行机器学习、人工智能的项目,至此,Python系列首篇文章开头的智能对话机器人代码是如何编写的便不再是一个谜题了。


一、利用Python发邮件:

1、先导记忆&参考资料总结:

python中利用smtplib模块发邮件,利用email模块编辑邮件

SMTP.set_debuglevel(level)设置输出debug调试信息,默认不输出
SMTP.docmd(cmd[, argstring])发送一个命令到SMTP服务器
SMTP.connect([host[, port]])连接到指定的SMTP服务器
SMTP.helo([hostname])使用helo指令向SMTP服务器确认你的身份
SMTP.ehlo(hostname)使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
SMTP.ehlo_or_helo_if_needed()如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
SMTP.has_extn(name)判断指定名称是否在SMTP服务器上
SMTP.verify(address)判断邮件地址是否在SMTP服务器上
SMTP.starttls([keyfile[, certfile]])使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密
SMTP.login(user, password)登录SMTP服务器
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])

发送邮件

from_addr:邮件发件人

to_addrs:邮件收件人

msg:发送消息

SMTP.quit()关闭SMTP会话
SMTP.close()关闭SMTP服务器连接

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Email模块中涉及的东西比较多,我们具体发邮件的时候就用from email import ... 语句导入一部分内容即可。

 

2、具体实现纯文本的邮件发送的python方法步骤详析:

(1)import smtplibfrom email.header import Header以及form email.mime.text import MIMEText、form email.mime.text import MIMEImage、form email.mime.text import MIMEMultipart

分别导入文件收发送和文件文本编辑编码库,Header是一个用于表示邮件标题的类。

处理多种形态的邮件主体我们需要 MIMEMultipart 类,而处理图片需要 MIMEImage 类。

(2)设置发件人的邮箱地址:

from_addr="这里填写发件人的邮箱地址@xxx.com"

(3)设置授权码:

打开qq邮箱(别的邮箱操作类似,此处博主用qq邮箱举例),找到设置、然后选择账户设置、然后向下寻找,会看到有关POP3\SMTP方面服务的权限开关设置。选择打开,尤其是保证SMTP服务的开启。此处注意!授权码和邮箱密码并不是同一个东西。

按照操作验证进行,然后设置或者复制邮箱自动生成的授权码即可。例如博主在设置好后,生成的授权码如下:

代码为:

password="这里键入上述显示的授权码文本内容" 

(4)设置收件人的地址:

to_addr="这里键入收件人的邮箱地址@xxx.com"

(5)设置发送邮箱的服务器地址:

这与发件人的邮箱地址不同,python会操纵编译器和电脑本身连接到发邮件的服务器中去。同样用qq邮箱举例,我们利用SSL连接,那么此处的发送邮件服务器就是我们需要键入的服务器地址。以下摘自qq邮箱的SSL加密方式解释:

如何设置POP3/SMTP的SSL加密方式?

使用SSL的通用配置如下:

接收邮件服务器:pop.qq.com,使用SSL,端口号995

发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587

账户名:您的QQ邮箱账户名(如果您是VIP帐号或Foxmail帐号,账户名需要填写完整的邮件地址)

密码:您的QQ邮箱密码

电子邮件地址:您的QQ邮箱的完整邮件地址

代码为:

smtp_server="smtp.qq.com"

(6)编写MIMEText函数也即邮件的内容:

【下面是邮件文本的键入】

text="这里键入你的邮件正文全部内容,会存成一个字符串并且赋值给text"

msg=MIMEText(text, "这里填入邮件文件的类型,如果是纯文本文件就填plain", "这里填写文件编码方式,例如中文就填utf-8")

msg["From"]=Header("这里键入你的邮件标题中写明的发件人信息,通常是发件人的地址")

msg["To"]=Header("这里键入你的邮件标题中写明的收件人信息,通常是收件人的地址")

msg["Subject"]=Header("这里键入你的邮件标题中的主题内容,通常是邮件的标题或者邮件中附件的标题")

【下面是邮件附件的键入】

msg=MIMEMultipart()

完成一个简单的带附件信息变量msg的创建

att=MIMEText(open("这里键入你所要添加的附件文件在磁盘中的地址,可以通过拖入文件到python终端去自动显示").read(), "这里填入文件的类型,比如纯文本就是plain", "这里键入文本编码方式,比如中文就是utf-8")

att("Content-Disposition")='attachment, filename="这里键入你想要添加的附件文件的重命名"' 

msg.attach(att)

最后这一句的功能是将att变量利用attach对象给嵌入到我们的邮件正文信息变量msg中,完成附件的添加。

(7)调用smtplib模块开始将上面的邮件实操发出去,依照顺序进行下面几个操作:

server=smtplib.SMTP()

这是smtplib模块中的一个SMTP类,实例化给本次邮件操作的变量server,表示建立一个邮件传输的通道,准备开始发邮件。

server.connect(smtp_server, 25)

这是smtplib模块中的一个connect函数,表示连接计算机与邮件收发服务器。第一个参数是服务器地址,第二个参数是端口,这个上面有写到。

server.login(from_addr, password)

登录我们的邮箱,前者是邮箱地址,后者是授权码。

server.sendemail(from_addr, to_addr, msg.as_string())

发送邮件,第一个参数是发件人地址,第二个是收件人地址。第三个是我们刚才用MIMEText函数已经建立好的文本内容变量,利用as_string()对象以字符串方式发送。

(8)关闭服务连接:

server.quit()

 

通过以上八个步骤,我们便完成了一个邮件的发送,确认无误后点击运行,对方就能收到文本邮件了!

 

3、如何在上述代码的基础上群发邮件:

可能比较热门的方式是利用for循环的方法,将同样的邮箱内容对于不同的to_addr收件人地址反复进行,方法就是将字符串变量to_addr改成字符串列表变量to_addrs[],列表中的每一个地址都是我们要发送的人之一。

第一是直接利用代码框就完成地址的键入,也就是上述第四步在定义to_addrs[]列表的时候,就把所有人的地址写好,例如:

to_addrs["1@xxx.com", "2@xxx.com", "3@xxx.com", ......]

而所谓的for或者while循环的方式,无非就是利用列表append()对象,运行代码后在控制台一个一个输入邮箱收件人地址的方法:

While True:

    a=input("收件人的邮箱地址:")

    to_addrs.append(a)

    b=input("是否继续输入?N代表退出,任意键继续:")

    if b=="n":

        break

print(to_addrs)

 

P.S.完成了以上所有的步骤后,如果没有基本语法错误,那么就可以进行精准的群发邮件工作了!下面分别给出发送纯文本邮件、带附件邮件、带图片邮件的Python代码模板,可供直接复制改动使用:

//发送普通纯文本邮件的模板
import smtplib
import string
from email.mime.text import MIMEText
from email.utils import formataddr


host = 'smtp.263.net'       ##定义smtp主机
SUBJECT = "test smtplib"    #定义邮件主题
TO = "xx@xx.com"     ##邮件接收人
FROM = "xxxx@xx.com"             ##邮件发送人
text = "content"                            #邮件内容

###拼接邮件主体内容
BODY = "\r\n".join(("From %s:" % FROM,"To: %s" % TO,"Subject:%s" % SUBJECT,"",text)).encode("utf-8")

server = smtplib.SMTP()             #创建smtp对象
server.connect(host,"25")           ##通过connect方法连接smtp主机
server.starttls()               ##启动安全传输模式
server.login("xxx@huixxx.com",'GAxxx@xxx')       ##邮箱账号登录
server.sendmail(FROM,[TO],BODY)
server.quit()                                       ##断开smtp连接
//发送html邮件的模板
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

HOST = 'smtp.263.net'       ##定义smtp主机
SUBJECT = "test smtplib"    #定义邮件主题
TO = "xxx@xxx.com"     ##邮件接收人(可以为一个列表)
FROM = "xxx@xxx.com"             ##邮件发送人
text = "content"                            #邮件内容

def sendmail():
    msg = MIMEText(content,_subtype='html',_charset='utf-8')    ##邮件内容,content邮件内容,plain为邮件类型,charset为字符集
    msg['From'] = FROM
    msg['To'] = TO            #如果此处为列表(';'.join(to_list))
    msg['Subject'] = SUBJECT

    server = smtplib.SMTP("smtp.263.net",25)
    server.login("aa@aa.com.cn","xxxxx")    #发送者的用户名和密码
    server.sendmail(FROM,TO,msg.as_string())
    server.quit()
sendmail()
//发送带附件邮件的模板
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib

#创建一个带附件的实例
msg = MIMEMultipart()

#构造附件1
file1 = MIMEText(open('d:\\123.rar', 'rb').read(), 'base64', 'utf-8')
file1["Content-Type"] = 'application/octet-stream'
file1["Content-Disposition"] = 'attachment; filename="123.doc"'  #这里的filename可以任意写,写什么名字,邮件中显示什么名字msg.attach(file1)
#加邮件头
msg['to'] = 'YYY@YYY.com'
msg['from'] = 'XXX@XXX.com'
msg['subject'] = 'hello world'  #邮件主题

#发送邮件
server = smtplib.SMTP()
server.connect('smtp.XXX.com',"25")    server.login('XXX','XXXXX')      #XXX为用户名,XXXXX为密码    server.sendmail(msg['from'], msg['to'],msg.as_string())server.quit()
//发送带图片邮件的模板
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

msg['From'] = "XXX@XXX.com"     #邮件发件人
msg['To'] = "YYY@YYY.com"          #邮件接收人
msg['Subject'] = "hello world"      ##邮件主题

def addimg(img_src,imgid):
    fp = open(img_src,'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()    msgImage.add_header('Conteng-ID',imgid)
    return msgImage                ##返回msgImage对象
msg_text = MIMEText("""<table><tr><td><img src="cid:aa"></td></tr></table>""","html","utf-8")
#创建MIMEMultipart对象,采用related定义内嵌资源
msg = MIMEMultipart('related')
msg.attach(msg_text)
msg.attach(addimg("C:\aa.img",aa))      ##这里的aa要与msg_text里的aa对应
#发送邮件
server = smtplib.SMTP()
server.connect('smtp.XXX.com',"25")server.starttls()    ##启动安全传输模式    server.login('XXX','XXXXX')      #XXX为用户名,XXXXX为密码    server.sendmail(msg['From'], msg['To'],msg.as_string())  #这里的前两个参数自定义server.quit()

二、利用Python解析网页:

1、想要了解Python对网页的解释,首先就要知道网页的html源代码基础知识:

(1)HTML即通常所说的超文本标记语言,标准通用标记语言下的一个应用。

(2)HTML不是一款编程语言,而是一款描述性标记语言,用于描述超文本中内容的显示方式。如文本以什么颜色、大小来显示等,这些都是利用HTML标记完成的。其最基本的语法就是<标记符>内容<标记符>。标记符通常都是成对使用,有一个开头标记和一个结束标记。结束标记只是在开头的前面加一个斜杠“/”。

(3)完整的HTML文件包括标题、段落、列表、表格以及各种嵌入对象,这些对象统称为HTML元素。一个HTML文件的基本结构如下:

<html>文件开始标记<head>文件头开始的标记

......文件头的内容

</head>文件头结束的标记

<body>文件主体开始的标记

.....文件主体的内容

</body>文件主体结束的标记

</html>文件结束标记

(4)HTML是超文本标记语言,主要通过各种标记来标示和排列各对象,通常由尖括号“<”“>”以及其中所包含的标记元素组成。

(5)HTML语言编写的文件是标准的ASCII文本文件。

(6)一个完整的HTML文档必须包含3个部分:一个由<html>元素定义的文档版本信息,一个由<head>定义各项声明的文档头部和一个由<body>定义的文档主体部分。

(7)在HTML语言的头部元素中,一般需要包括标题、基础信息和元信息等。HTML的头部元素是以<head>为开始标记,以</head>为结束标记的。

(8)<head>元素的作用范围是整篇文档。<head>元素中可以有<meta>元信息定义、文档样式表定义和脚本等信息,定义在HTML语言头部的内容往往不会在网页上直接显示。

用比较简易的方式了解html的四个表达方式:

(1)HTML 标题:

HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的。

<h1>这是一个标题</h1>
<h2>这是一个标题</h2>
<h3>这是一个标题</h3>

 (2)HTML 段落:

HTML 段落是通过标签 <p> 来定义的。

<p>这是一个段落。</p>
<p>这是另外一个段落。</p>

 (3)HTML链接:

HTML 链接是通过标签 <a> 来定义的。在 href 属性中指定链接的地址。

<a href="https://www.runoob.com">这是一个链接</a>

 (4)HTML图像:

HTML 图像是通过标签 <img> 来定义的。 图像的名称和尺寸是以属性的形式提供的。

<img src="/images/logo.png" width="258" height="39" />

 由此可见,所谓的python爬网页就是解析HTML代码所表示的现实含义。这些都是可以通过HTML代码的结构区分出来的。

下面给出一个实例来分析上面总结的知识点:

<html>

<head><title>意见建议</title></head>

<body>

<form method="POST" action="WEBBOT-SELF">

<table border="0" cellpadding="0" cellspacing="3" width="100%">

<caption>请您填写详细资料并提出宝贵意见</caption>

<tr>

<td>登录名:</td>

<td><input name=username value="" type=text maxlength="16"></td>

</tr>

<tr>

<td>输入登录密码:</td>

<td><input name=password type=password value="" maxlength="16"></td>

</tr>

<tr>

<td>性别:</td>

<td><input type=radio name=sex value="1" checked>男  

<input type=radio name=sex value="2" >女

<tr>

<td>所在省份:</td>

<td> <select name=province>

<option value=34>安徽</option> <option value=11>北京</option>

<option value=50>重庆</option> <option value=35>福建</option>

<option value=62>甘肃</option> <option value=44>广东</option>

<option value=45>广西</option> <option value=52>贵州</option>

<option value=46>海南</option> <option value=13>河北</option>

<option value=23>黑龙江</option> <option value=41>河南</option>

<option value=42>湖北</option> <option value=43>湖南</option>

<option value=32>江苏</option> <option value=36>江西</option>

<option value=22>吉林</option> <option value=21>辽宁</option>

<option value=64>宁夏</option> <option value=15>内蒙古</option>

<option value=63>青海</option> <option value=31>上海</option>

<option value=14>山西</option> <option value=37>山东</option>

<option value=51>四川</option> <option value=61>陕西</option>

<option value=12>天津</option> <option value=54>西藏</option>

<option value=65>新疆</option> <option value=53>云南</option>

<option value=33>浙江</option> <option value=71>台湾</option>

<option value=81>香港</option> <option value=82>澳门</option>

<option value=600>澳洲</option> <option value=500>北美洲</option>

<option value=199>亚洲其他国家</option>

<option value=300>欧洲</option> <option value=999>其他</option>

</select></td>

<tr>

<td>个人爱好</td>

<td><input type="checkbox" name="music" value="ON">音乐<input type="checkbox" name="sport" value="ON">运动</td>

</tr>

<tr>

<td>请提供附加文件</td>

<td><input type="file" name="myview" ></td>

</tr>

<tr>

<td align="right"><input type="submit" value="提交" name="B1"></td>

<td><input type="reset" value="全部重写" name="B2"></td>

</tr>

</table>

</form>

</body>

</html>

将上述代码建立成一个txt文件,然后保存,改后缀名为.html,然后将文件打开或者直接拖动到浏览器中,即可看见效果。这个代码实现的功能大致是:

①实现表单,表单可实现用户的信息输入, 使网页具有了交互功能。

②表单及其中按钮、复选框、单选按钮、文本输入框、图像、文件、隐藏项、文本区域、列表框等各种表单控件的定义格式及用法用途两个特殊按钮: “提交”、“重置”的定义和用法用途, 一个特殊文本框“密码框”的用法用途。

 

2、利用Beautifulsoup爬数据:

(1)网络爬虫的四个基本步骤:

①获取数据:从网站上拷贝html代码:requests模块

②解析数据:解码html,了解网页的具体功能:beautifulsoup模块

③提取数据:从网页的具体功能中提取我们想要的数据部分:beautifulsoup模块

④存储数据:将提取到的数据存储为我们本地的文件或者功能

P.S.首先requests和beautifulsoup这些模块都是第三方模块。需要先进行安装。在终端中键入pip install requests和pip install beautifulsoup4安装即可。这里如果为了防止python2和python3的存储文件混淆,并且不想费时间删掉电脑上自带的python2编译器,建议用一些高档一点的程序工作平台,或者尽量选用windows电脑。

(2)解析库的调用:

BeautifulSoup默认支持Python的标准HTML解析库,但是它也支持一些第三方的解析库:

Python标准库BeautifulSoup(markup, “html.parser”)
  • Python的内置标准库
  • 执行速度适中
  • 文档容错能力强
  • Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器BeautifulSoup(markup, “lxml”)
  • 速度快
  • 文档容错能力强
  • 需要安装C语言库
lxml XML 解析器BeautifulSoup(markup, [“lxml”, “xml”])BeautifulSoup(markup, “xml”)
  • 速度快
  • 唯一支持XML的解析器
  • 需要安装C语言库
html5libBeautifulSoup(markup, “html5lib”)
  • 最好的容错性
  • 以浏览器的方式解析文档
  • 生成HTML5格式的文档
  • 速度慢
  • 不依赖外部扩展

需要安装 lxml:pip install lxml,另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:pip install html5lib

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

下面给出的一个html网页代码,将会是后面分析beautifulsoup功能的实例网页:

<!DOCTYPE html>
<!--STATUS OK-->
<html>
 <head>
  <meta content="text/html;charset=utf-8" http-equiv="content-type"/>
  <meta content="IE=Edge" http-equiv="X-UA-Compatible"/>
  <meta content="always" name="referrer"/>
  <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
  <title>
   百度一下,你就知道 </title>
 </head>
 <body link="#0000cc">
  <div id="wrapper">
   <div id="head">
    <div class="head_wrapper">
     <div id="u1">
      <a class="mnav" href="http://news.baidu.com" name="tj_trnews">
       新闻 </a>
      <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">
       hao123 </a>
      <a class="mnav" href="http://map.baidu.com" name="tj_trmap">
       地图 </a>
      <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">
       视频 </a>
      <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">
       贴吧 </a>
      <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">
       更多产品 </a>
     </div>
    </div>
   </div>
  </div>
 </body>
</html>

拿到网页后,立马在python编译器中敲入requests代码,将网页对应的代码内容全部给get到编译器定义的html变量中:

import requests

r=requests.get("这里键入网页的链接")

html=r.text

 那么我们通过这三行代码完成了一个由网页获取代码然后以文本形式赋值给html变量的过程,这个html变量之后还会用到。

(3)创建beautifulsoup4的对象:

下面这些代码按照通常的操作顺序习惯,罗列了创建beautifulsoup对象以及进行打印获取的方式。

from bs4 import BeautifulSoup

bs = BeautifulSoup(html,"html.parser")

第一个变量是上面定义好的html代码存储变量,第二个是解码器标识,html.parser就是上述提到的python自带的原始解码器。

# 缩进格式
print(bs.prettify()) 

# 获取title标签的所有内容
print(bs.title) 

# 获取title标签的名称
print(bs.title.name) 

# 获取title标签的文本内容
print(bs.title.string) 

# 获取head标签的所有内容
print(bs.head) 

# 获取第一个div标签中的所有内容
print(bs.div) 

# 获取第一个div标签的id的值
print(bs.div["id"])

# 获取第一个a标签中的所有内容
print(bs.a) 

# 获取所有的a标签中的所有内容
print(bs.find_all("a"))

# 获取id="u1"
print(bs.find(id="u1")) 

# 获取所有的a标签,并遍历打印a标签中的href的值
for item in bs.find_all("a"): 
    print(item.get("href")) 
    
# 获取所有的a标签,并遍历打印a标签的文本值
for item in bs.find_all("a"): 
    print(item.get_text())

(4)利用BeautifulSoup4四大对象种类及搜索文档树的功能完成数据提取工作:

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种,其中Tag最常用最重要,其它三个可粗略掌握:

①Tag :

Tag通俗点讲就是HTML中的一个个标签,例如:

from bs4 import BeautifulSoup
bs = BeautifulSoup(html,"html.parser")

# 获取title标签的所有内容
print(bs.title)

# 获取head标签的所有内容
print(bs.head)

# 获取第一个a标签的所有内容
print(bs.a)

# 类型
print(type(bs.a))

我们可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是 bs4.element.Tag。
但是注意,它查找的是在所有内容中的第一个符合要求的标签。

对于 Tag,它有两个重要的属性,是 name 和 attrs:

# [document] 
#bs 对象本身比较特殊,它的 name 即为 [document]
print(bs.name)

# head 
#对于其他内部标签,输出的值便为标签本身的名称
print(bs.head.name) 

# 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a.attrs)

#还可以利用get方法,传入属性的名称,二者是等价的
print(bs.a['class']) # bs.a.get('class')

# 可以对这些属性和内容等等进行修改
bs.a['class'] = "newClass"
print(bs.a) 

# 还可以对这个属性进行删除
del bs.a['class'] 
print(bs.a)

②NavigableString

获取标签内部的文字用 .string 即可,例如:

print(bs.title.string)

print(type(bs.title.string))

③BeautifulSoup

表示的是一个文档的内容。

大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性,例如:

print(type(bs.name))

print(bs.name)

print(bs.attrs)

④Comment

是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。

print(bs.a)  # 此时不能出现空格和换行符,a标签如下:
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>

print(bs.a.string) # 新闻

print(type(bs.a.string)) # <class 'bs4.element.Comment'>

 

在掌握了四种对象之后,我们开始调用find系列的搜索文档树的功能函数进行网页信息的爬取:

items=bs.find_all(name, attrs, recursive, text, **kwargs)

其中第一个参数name是过滤参数,如果填入字符串,那么则会查找与字符串完全匹配的内容;如果传入的是正则表达式,那么BeautifulSoup4会通过search()来匹配内容; 如果传入一个列表,BeautifulSoup4将会与列表中的任一元素匹配到的节点返回;传入一个方法,根据方法来匹配。

a_list = bs.find_all("a")
print(a_list)

t_list = bs.find_all(re.compile("a")) #这里需要先导入re模块
for item in t_list:
    print(item)

t_list = bs.find_all(["meta","link"])
for item in t_list:
    print(item)

def name_is_exists(tag):
    return tag.has_attr("name")

t_list = bs.find_all(name_is_exists)
for item in t_list:
    print(item)

kwargs参数表示:

# 查询id=head的Tag
t_list = bs.find_all(id="head")
print(t_list)

# 查询href属性包含ss1.bdstatic.com的Tag
t_list = bs.find_all(href=re.compile("http://news.baidu.com"))
print(t_list)

# 查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
t_list = bs.find_all(class_=True)
for item in t_list:
    print(item)

attrs参数的意义是,并不是所有的属性都可以使用上面这种方式进行搜索,比如HTML的data-*属性,我们可以使用attrs参数,定义一个字典来搜索包含特殊属性的tag:

t_list = bs.find_all(attrs={"data-foo":"value"})
for item in t_list:
    print(item)

通过text参数可以搜索文档中的字符串内容,与name参数的可选值一样。
text参数也接受 字符串,正则表达式,列表

t_list = bs.find_all(attrs={"data-foo": "value"})
for item in t_list:
    print(item)

t_list = bs.find_all(text="hao123")
for item in t_list:
    print(item)

t_list = bs.find_all(text=["hao123", "地图", "贴吧"])
for item in t_list:
    print(item)

t_list = bs.find_all(text=re.compile("\d"))
for item in t_list:
    print(item)

limit参数的意义:传入一个limit参数来限制返回的数量
例如下列放回数量为2

t_list = bs.find_all("a",limit=2)
for item in t_list:
    print(item)

通常我们的使用方式是:

items=bs.find_all("div", class_="item-footer")

其中div是带尖括号的大标签,item-footer是标签所属的类,这两个东西依据我们需要爬取的东西而改变,大标签名和所属类的名字直接到网页源代码中去找。

另外一个不常用的方法:bs.find()功能:

返回符合条件的第一个Tag
即当我们要取一个值的时候就可以用这个方法

(5)最后要想在控制台中看到我们爬取的东西,只需要for循环,对于item in items,print(item.get_text())即可

 

3、将提取后的数据进行存储,探讨Python爬取的数据都存在哪里:

(1)正则表达式的使用:

正则表达式的目的在于,用一种特定的模式来让python编译器去匹配去搜索我们需要的东西,而不是一个一个的东西都到代码里面去找规律。

import re

导入正则表达式的模块,然后上述的find_all方法描述改为正则表达式匹配的方式来写:

items=bs.find_all("img", {"src": re.compile(".*?\.jpg")})

其中img是大标签,src是我们通过看代码总结到的我们需要的内容的一个共有的前标,这里爬取图片的前标是src=......,然后利用re.compile正则表达式匹配对象,匹配所有含有对应字符串.*?\.jpg的链接或者文本内容即可。

(2)用Python下载文件:

import requests
from bs4 import Beautifulsoup
import re

r=requests.get("这里填入你所需要的文件的url地址")

with open("这里填写下载到指定位置的路径、文件名和对应的文件后缀", "文件格式标识符,如r、w、rb、wb等等,见前面的总结") as file:
    file.write(r.content)
    

(3) 利用CSV功能进行python数据存入到excel文件中去:

csv文件功能其实单纯只是一个数据整理的方法,具体的爬取还是要通过requests.get和r.content来得到数据内容哦!首先我们安装第三方模块openpyxl。

①写入csv数据:

import csv

header=['class','name','sex','height','year']

rows=[

[1,'xiaoming','male',168,23],

[1,'xiaohong','female',162,22],

[2,'xiaozhang','female',158,21],

[2,'xiaoli','male',158,21]

]

with open('csvdir.csv','w',newline='')as f:          #newline=" "是为了避免写入之后有空行

        ff=csv.writer(f)

        ff.writerow(header)

        ff.writerows(rows)

 ②在写入字典序列类型数据的时候,需要传入两个参数,一个是文件对象——f,一个是字段名称——fieldnames,到时候要写入表头的时候,只需要调用writerheader方法,写入一行字典系列数据调用writerrow方法,并传入相应字典参数,写入多行调用writerows:

import csv

headers = ['class','name','sex','height','year']

rows = [

        {'class':1,'name':'xiaoming','sex':'male','height':168,'year':23},

        {'class':1,'name':'xiaohong','sex':'female','height':162,'year':22},

        {'class':2,'name':'xiaozhang','sex':'female','height':163,'year':21},

        {'class':2,'name':'xiaoli','sex':'male','height':158,'year':21},

    ]

with open('test2.csv','w',newline='')as f:

      f_csv = csv.DictWriter(f,headers)

      f_csv.writeheader()

      f_csv.writerows(rows)

列表和字典形式的数据写入是不一样的。

③csv文件的读取:

和读取文件差不多。

import csv 

with open('test.csv')as f:

    f_csv = csv.reader(f)

    for row in f_csv:

        print(row)

 

 关于Python爬取html网页的相关知识,博主这里写的比较全面但是复杂,如果觉得没有时间一点点时间地反复消化,这里博主找到了一篇由@极客飞人总结的相对精简的文章,可供参考:

https://blog.csdn.net/qq_43669937/article/details/87300228


三、Python数据分析:

Python数据分析大致可以分为:

Pandas方法进行大数据分析,这是商科同学们走向前端高薪职业的必备武器,也是隔壁中国人民大学大佬们的看家本领,博主既作为理工大学的一员,这里就不抢他们的饭碗了。

Python数据可视化,经典Matplotlib方法。虽然目前已经出现了很多优秀的支持Python的可视化工具,比如之前介绍过的Dash,Pyecharts,但Python御用的可视化工具Matplotlib在任何时候都可能出现在不同场合并有着不凡的表现。可视化就像给数据穿上靓丽的外衣,辛苦折腾出的结果或者结论一定要有一个漂亮的呈现。所以,一个惊艳的图表报告能给一次“惊险”的数据之旅画上一个圆满的句号。这也可以理解为是Pandas在基础处理工作之后的画龙点睛。

Python的Scipy库中内嵌Numpy模块,可以进行数据科学的处理。Numpy几乎是所有重要Python数据分析工具的依赖,比如后面要介绍的Pandas,以及其他机器学习工具的包,都需要依靠Numpy来完成数据的组织和清理。在Numpy里,需要灵活掌握基本的数据类型的使用,数组的(花式)切片,数据的广播运算,数据文件的读写等等。熟悉计算数学方面的同学都学过一门叫做数值计算方法的课程,其中的计算工具均在Numpy中有所体现,可以毫不夸张地说在程序设计的世界里,因为Python的Numpy的存在,使得Matlab数据处理永远不能一枝独秀。

本专栏的文章后续还会分析Python科学计算的方法以及现代数值计算的基本算法,这里还会深入剖析Numpy。对于大数据分析的知识,可以参看更多别的文章,理工科的同学也不必深入掌握,毕竟人精力有限,可以更多地去研究软硬件结合的知识。

  • 1
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

笙歌散尽

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值