2022-11-13 12:23:07    38    0    0

SMTP协议

Email(电子邮件)的历史比Web还要久远。直到现在,Email还是互联网上应用非常广泛的服务。

在我们开始编写邮件操作的相关代码之前,先了解一下电子邮件在互联网上是如何运作的。

title

title

相关概念:

假设自己的电子邮件地址是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

2022-10-30 13:22:23    25    0    0
  1. import time
  2. from selenium import webdriver
  3. # from selenium.webdriver import ActionChains
  4. from selenium.webdriver import ActionChains
  5. from selenium.webdriver.common.by import By
  6. import pyautogui
  7. driver = webdriver.Edge(executable_path="msedgedriver.exe")
  8. driver.get('https://www.baidu.com')
  9. time.sleep(2) # 等待页面加载完成
  10. # action_chains = ActionChains(driver)
  11. # body = driver.find_element_by_tag_name('body') # [name="body"]
  12. # print(body)
  13. #
  14. # action_chains.context_click(body).perform()
  15. # time.sleep(3)
  16. #
  17. # pyautogui.typewrite(['down', 'down', 'down'])
  18. # time.sleep(3)
  19. # pyautogui.typewrite(['return'])
  20. #
  21. # time.sleep(10)
  22. '''
  23. <div name="body" class="body" id="ddd"></div>
  24. <body></body> #tag
  25. '''
  26. # driver.find_element_by_link_text("新闻").click()
  27. # time.sleep(2)
  28. #
  29. # # 切换窗口
  30. # all_windows = driver.window_handles # 窗口句柄, 列表
  31. # driver.switch_to.window(all_windows[1]) # 窗口句柄
  32. #
  33. # driver.find_element_by_link_text("读懂习近平总书记二十大后首次出京活动的深意").click()
  34. # time.sleep(2)
  35. #
  36. # '''
  37. # <select>
  38. #
2022-10-30 13:23:04    10    0    0

题目

  1. 打开百度页面, 点击"图片"跳转到图片页面
  2. 在图片页面使用"以图搜图"功能, 搜索相似的图片
  3. 输出供搜索到多少个相似图片
    '''
2022-10-30 13:14:29    27    0    0

Selenium自动化web爬虫

操控鼠标

在现实的自动化测试中关于鼠标的操作不仅仅是click()单击操作,还有很多操控方法包含在ActionChains类中。

title

  1. from selenium import webdriver
  2. #1.引入 ActionChains 类
  3. from selenium.webdriver.common.action_chains import ActionChains

定位到要悬停的元素

  1. element= driver.find_element_by_link_text("设置")
  2. #3.对定位到的元素执行鼠标悬停操作
  3. ActionChains(driver).move_to_element(element).perform()

右键菜单

  1. action_chains = ActionChains(driver)
  2. body = driver.find_element_by_tag_name('body') # [name="body"]
  3. print(body)
  4. action_chains.context_click(body).perform()
  5. time.sleep(3)
  6. pyautogui.typewrite(['down', 'down', 'down'])
  7. time.sleep(3)
  8. pyautogui.typewrite(['return'])
  9. time.sleep(10)

键盘事件

Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键
盘的操作。

title

  1. # 输入框输入关键词
  2. driver.find_element_by_id("kw").send_keys("关键词")
  3. # 提交
  4. driver.find_element_by_id("btnSubmit").send_keys(Keys.ENTER)

多窗口切换

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了
switch_to.window()方法,可以实现在不同的窗口之间切换。

title

  1. #1.获
2022-10-23 08:59:09    7    0    0
  1. '''
  2. find_element_by(查找单个元素的)->高版本: find_element
  3. find_elements_by(查找多个元素的)->高版本: find_elements
  4. find_element(By.TAG_NAME,'tag01')
  5. find_element_by_tag_name('tag01') -> find_element_by_css_selector('tag01')
  6. find_element(By.CLASS_NAME,'class01')
  7. find_element_by_class_name('class01') -> find_element_by_css_selector('.class01')
  8. find_element(By.ID,'id01')
  9. find_element_by_id('id01') -> find_element_by_css_selector('#id01')
  10. find_element(By.NAME,'name01')
  11. find_element_by_name('name01') -> find_element_by_css_selector('[name="name01"]')
  12. find_element_by_css_selector('[id="id01"]')
  13. find_element_by_css_selector('[class="class01"]')
  14. find_element(By.LINK_TEXT,'新闻')
  15. find_element_by_link_text('新闻') # 全部文本
  16. find_element(By.PARTIAL_LINK_TEXT,'新')
  17. find_element_by_partial_link_text('新') # 部分文件
  18. 页面有两个class01的元素, 使用find_element_by得到的结果是两个中的第一个
  19. value=find_element(By.NAME,'name01').get_attribute('class
2022-10-23 08:52:50    35    0    0

Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器。使
用Selenium可以模拟人工对web浏览器进行自动化操作。

安装Selenium

  1. pip install Selenium

要使用Selenium,还需要下载安装浏览器驱动。

驱动下载

配置webdriver(EDGE)

下载Microsoft Edge的webdriver,找到对应版本下载,解压后得到一个msedgedriver.exe

然后可以将msedgedriver.exe放到某个文件夹中,然后将路径配置到环境变量中

配置环境变量

手动创建一个存放浏览器驱动的目录,如: D:\webdriver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)
丢到该目录下,接着设置环境变量。

测试是否安装成功

title

元素定位方法

定位单个元素

selenium提供8种元素定位方式,包括DOM元素id, name和tag等等。它还支持xpath和css选择器。返回结果是元素对象。

title

接下来将以下面这个html页面为例演示如何使用以上各种定位方法。

title

通过id定位:

  1. dr.find_element_by_id("kw")

通过name定位:

  1. dr.find_element_by_name("wd")

通过class name定位

  1. dr.find_element_by_class_name("s_ipt")

通过tag name定

2022-08-28 06:23:34    32    0    0

csv简介

CSV (Comma Separated Values) ,即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式, 用以存储表格数据,包括数字或者字符。很多程序在处理数据时都会碰到csv这种格式的文件,它的使用是非常广泛

Python csv库

Python中集成了专用于处理csv文件的库,名为:csv。

csv 库中有4个常用的对象:

  • csv.reader:以列表的形式返回读取的数据。
  • csv.writer:以列表的形式写入数据。
  • csv.DictReader:以字典的形式返回读取的数据。
  • csv.DictWriter:以字典的形式写入数据。

本节课学习: csv.reader和csv.writer

写入csv文件

假设我们现在要创建一个csv文件,将数据保存为如下形式

title

使用csv.writer写入数据

title

关于写入,需要注意:

  • 在打开文件时,需要添加newline = “”。否则,会在每2行有效内容之间添加一行空白。
  • 如果要保存的内容有中文,而且之后需要用Excel打开文件,那么需要选用utf-8-sig编码。如果使用utf-8编码,会导致使 用Excel查看文件时中文乱码。

读取csv文件

假设现在要读取的csv文件内容如下:

title

可以看到,该文件的第一行表明数据类型,我们暂且称之为header

从第2行开始,保存的是设备采集到的数据。

使用csv.reader读取数据

title
title

2022-08-07 08:30:28    39    0    0
  1. import json
  2. import os
  3. import urllib.request
  4. import re
  5. response = urllib.request.urlopen(
  6. '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')
  7. html = response.read().decode()
  8. # print(html)
  9. # https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF
  10. '''
  11. - 目标明确: 要什么东西
  12. - 抓取网页到本地进行分析(规律)
  13. - 爬取
  14. result = re.findall('src="(.+?)"', content)
  15. print(result)
  16. '''
  17. # linkData开头, 单引号中间的字符串, linkData: ('要找的内容')
  18. result = re.findall("linkData: ('.+?')", html)
  19. image_list = json.loads(eval(result[0]))
  20. if not os.path.exists("images"):
  21. os.mkdir("images")
  22. index = 0
  23. for image_item in image_list:
  24. image_url = image_item['thumbnailUrl'].replace('\/', '/')
  25. urllib.request.urlretrieve(image_url, "images/image-" + str(index) + '.gif')
  26. index = index + 1
  27. print(image_url)
  28. # json.dumps() # python对象(list,di
2022-08-07 08:23:42    21    0    0

正则表达式

什么是正则表达式?

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的 子串替换或者从某个串中取出符合某个条件的子串等。

例如:

  • runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
  • runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0 次、或1次、或多次)。
  • colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次或1次)。

正则表达式是由 普通字符 (例如字符 a 到 z)以及 特殊字符 (称为”元字符”)组成的文字 模式 。模式描述在搜索文本时要匹 配的一个或多个字符串。

正则表达式的用途

正则表达式,广泛用于与文字、字符串的格式化,放到Python里使用,再合适不过;尤其是在编写爬虫时,用正则表达式匹配 URL、匹配IP等,正则表达式都是一个简单、高效的选择。

正则表达式

普通字符:

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一 些其他符号。

如:

  1. abc #匹配所有abc
  2. 123 #匹配所有123

元字符:

title

预定义字符集:

title

转义字符:

元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符\ 放在它们前 面。

如:

  1. \[ #匹配左中括号
  2. \} #匹配右大括号

Python里的正则表达式

Python里的正则表达式,无需下载外部模块,只需要引入自带模块:re:

  1. import re

re.findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配 的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

  1. findal
2022-07-10 10:13:28    19    0    0

HTTP协议

什么是 HTTP ?

超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信。

HTTP 的工作方式是客户端与服务器之间的请求-应答协议。

web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。

举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求 的内容。

两种 HTTP 请求方法:GET 和 POST

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

  • GET - 从指定的资源请求数据
  • POST - 向指定的资源提交要被处理的数据。

GET 方法

请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

  1. /test/demo_form.php?name1=value1&name2=value2

有关 GET 请求的其他一些注释:

  • GET 请求可被缓存
  • GET 请求保留在浏览器历史记录中
  • GET 请求可被收藏为书签
  • GET 请求不应在处理敏感数据时使用
  • GET 请求有长度限制
  • GET 请求只应当用于取回数据

POST 方法

请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

title

有关 POST 请求的其他一些注释:

  • POST 请求不会被缓存
  • POST 请求不会保留在浏览器历史记录中
  • POST 不能被收藏为书签
  • POST 请求对数据长度没有要求

比较 GET 与 POST

下面的表格比较了两种 HTTP 方法:GET 和 POST。

title

HTTP 与 HTTPS 的区别

HTTP 的全称是 Hyper Text Transfer Protocol,中文名叫作超文本传输协议,HTTP 协议是用于从网络传输超文本数据到本地 浏览器的传送协议,它能保证高效而准确地传送超文本文档

HTTPS 的全称是 Hyper Text Transfer Protocol over Secure Socket Layer,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即在

2/5