Email(电子邮件)的历史比Web还要久远。直到现在,Email还是互联网上应用非常广泛的服务。
在我们开始编写邮件操作的相关代码之前,先了解一下电子邮件在互联网上是如何运作的。
相关概念:
假设自己的电子邮件地址是me@163.com,对方的电子邮件地址是friend@aliyun.com。用Outlook或Foxmail之类的软件写
好邮件,填上对方的Email地址,单击“发送”按钮,电子邮件就发送出去了。这些电子邮件软件被称为邮件用户代理(Mail
User Agent,MUA)。
Email从MUA发出去后,不是直接到达对方计算机,而是发到邮件传输代理(Mail Transfer Agent,MTA),就是Email服务
提供商,如网易、阿里云等。由于自己的电子邮件地址是163.com,因此Email首先被投递到网易提供的MTA,再由网易的
MTA发送到对方的服务商,也就是阿里的MTA。
Email到达阿里的MTA后,由于对方使用的是@aliyun.com的邮箱,因此阿里的MTA会把Email投递到邮件的最终目的地邮件投
递代理(Mail Delivery Agent,MDA)。Email到达MDA后,会存放在阿里云服务器的某个文件或特殊的数据库里,我们将这
个长期保存邮件的地方称为电子邮箱。
同普通邮件类似,Email不会直接到达对方的计算机,因为对方的计算机不一定开机,开机也不一定联网。对方要取到邮件,必
须通过MUA从MDA上获得。
SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议.
SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特
点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传送。通常它工作在两种情况下:一是邮件从客户
机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是一个请求/响应协议,它监听25号端口,用于接收用户的
Mail请求,并与远端Mail服务器建立SMTP连接。
SM
import time
from selenium import webdriver
# from selenium.webdriver import ActionChains
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import pyautogui
driver = webdriver.Edge(executable_path="msedgedriver.exe")
driver.get('https://www.baidu.com')
time.sleep(2) # 等待页面加载完成
# action_chains = ActionChains(driver)
# body = driver.find_element_by_tag_name('body') # [name="body"]
# print(body)
#
# action_chains.context_click(body).perform()
# time.sleep(3)
#
# pyautogui.typewrite(['down', 'down', 'down'])
# time.sleep(3)
# pyautogui.typewrite(['return'])
#
# time.sleep(10)
'''
<div name="body" class="body" id="ddd"></div>
<body></body> #tag
'''
# driver.find_element_by_link_text("新闻").click()
# time.sleep(2)
#
# # 切换窗口
# all_windows = driver.window_handles # 窗口句柄, 列表
# driver.switch_to.window(all_windows[1]) # 窗口句柄
#
# driver.find_element_by_link_text("读懂习近平总书记二十大后首次出京活动的深意").click()
# time.sleep(2)
#
# '''
# <select>
#
在现实的自动化测试中关于鼠标的操作不仅仅是click()单击操作,还有很多操控方法包含在ActionChains类中。
from selenium import webdriver
#1.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
定位到要悬停的元素
element= driver.find_element_by_link_text("设置")
#3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()
右键菜单
action_chains = ActionChains(driver)
body = driver.find_element_by_tag_name('body') # [name="body"]
print(body)
action_chains.context_click(body).perform()
time.sleep(3)
pyautogui.typewrite(['down', 'down', 'down'])
time.sleep(3)
pyautogui.typewrite(['return'])
time.sleep(10)
Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键
盘的操作。
# 输入框输入关键词
driver.find_element_by_id("kw").send_keys("关键词")
# 提交
driver.find_element_by_id("btnSubmit").send_keys(Keys.ENTER)
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了
switch_to.window()方法,可以实现在不同的窗口之间切换。
#1.获
'''
find_element_by(查找单个元素的)->高版本: find_element
find_elements_by(查找多个元素的)->高版本: find_elements
find_element(By.TAG_NAME,'tag01')
find_element_by_tag_name('tag01') -> find_element_by_css_selector('tag01')
find_element(By.CLASS_NAME,'class01')
find_element_by_class_name('class01') -> find_element_by_css_selector('.class01')
find_element(By.ID,'id01')
find_element_by_id('id01') -> find_element_by_css_selector('#id01')
find_element(By.NAME,'name01')
find_element_by_name('name01') -> find_element_by_css_selector('[name="name01"]')
find_element_by_css_selector('[id="id01"]')
find_element_by_css_selector('[class="class01"]')
find_element(By.LINK_TEXT,'新闻')
find_element_by_link_text('新闻') # 全部文本
find_element(By.PARTIAL_LINK_TEXT,'新')
find_element_by_partial_link_text('新') # 部分文件
页面有两个class01的元素, 使用find_element_by得到的结果是两个中的第一个
value=find_element(By.NAME,'name01').get_attribute('class
Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器。使
用Selenium可以模拟人工对web浏览器进行自动化操作。
pip install Selenium
要使用Selenium,还需要下载安装浏览器驱动。
下载Microsoft Edge的webdriver,找到对应版本下载,解压后得到一个msedgedriver.exe
然后可以将msedgedriver.exe放到某个文件夹中,然后将路径配置到环境变量中
手动创建一个存放浏览器驱动的目录,如: D:\webdriver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)
丢到该目录下,接着设置环境变量。
selenium提供8种元素定位方式,包括DOM元素id, name和tag等等。它还支持xpath和css选择器。返回结果是元素对象。
接下来将以下面这个html页面为例演示如何使用以上各种定位方法。
通过id定位:
dr.find_element_by_id("kw")
通过name定位:
dr.find_element_by_name("wd")
通过class name定位
dr.find_element_by_class_name("s_ipt")
通过tag name定
CSV (Comma Separated Values) ,即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式, 用以存储表格数据,包括数字或者字符。很多程序在处理数据时都会碰到csv这种格式的文件,它的使用是非常广泛
Python中集成了专用于处理csv文件的库,名为:csv。
csv 库中有4个常用的对象:
本节课学习: csv.reader和csv.writer
假设我们现在要创建一个csv文件,将数据保存为如下形式
使用csv.writer写入数据
关于写入,需要注意:
假设现在要读取的csv文件内容如下:
可以看到,该文件的第一行表明数据类型,我们暂且称之为header
从第2行开始,保存的是设备采集到的数据。
使用csv.reader读取数据
import json
import os
import urllib.request
import re
response = urllib.request.urlopen(
'https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%E5%9F%8E%E5%B8%82%E5%BB%BA%E7%AD%91%E6%91%84%E5%BD%B1%E4%B8%93%E9%A2%98&fr=searchindex_album%20&album_tab=%E5%BB%BA%E7%AD%91&album_id=7&rn=30')
html = response.read().decode()
# print(html)
# https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF
'''
- 目标明确: 要什么东西
- 抓取网页到本地进行分析(规律)
- 爬取
result = re.findall('src="(.+?)"', content)
print(result)
'''
# linkData开头, 单引号中间的字符串, linkData: ('要找的内容')
result = re.findall("linkData: ('.+?')", html)
image_list = json.loads(eval(result[0]))
if not os.path.exists("images"):
os.mkdir("images")
index = 0
for image_item in image_list:
image_url = image_item['thumbnailUrl'].replace('\/', '/')
urllib.request.urlretrieve(image_url, "images/image-" + str(index) + '.gif')
index = index + 1
print(image_url)
# json.dumps() # python对象(list,di
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的 子串替换或者从某个串中取出符合某个条件的子串等。
例如:
正则表达式是由 普通字符 (例如字符 a 到 z)以及 特殊字符 (称为”元字符”)组成的文字 模式 。模式描述在搜索文本时要匹 配的一个或多个字符串。
正则表达式,广泛用于与文字、字符串的格式化,放到Python里使用,再合适不过;尤其是在编写爬虫时,用正则表达式匹配 URL、匹配IP等,正则表达式都是一个简单、高效的选择。
普通字符:
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一 些其他符号。
如:
abc #匹配所有abc
123 #匹配所有123
元字符:
预定义字符集:
转义字符:
元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符\ 放在它们前 面。
如:
\[ #匹配左中括号
\} #匹配右大括号
Python里的正则表达式,无需下载外部模块,只需要引入自带模块:re:
import re
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配 的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findal
超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信。
HTTP 的工作方式是客户端与服务器之间的请求-应答协议。
web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。
举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求 的内容。
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.php?name1=value1&name2=value2
有关 GET 请求的其他一些注释:
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
有关 POST 请求的其他一些注释:
下面的表格比较了两种 HTTP 方法:GET 和 POST。
HTTP 的全称是 Hyper Text Transfer Protocol,中文名叫作超文本传输协议,HTTP 协议是用于从网络传输超文本数据到本地 浏览器的传送协议,它能保证高效而准确地传送超文本文档
HTTPS 的全称是 Hyper Text Transfer Protocol over Secure Socket Layer,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即在