URL
Uniform Resource Locator 统一资源定位符
协议类型与域名之间用 :// 分隔 注意路径(path)以 / 作为开头和分隔符(而文件夹的分隔符是 \) 参数部分用key=value的格式表示 ,参数与参数之间用&表示 有时在域名之后会出现端口号 :443 https默认的端口号是443 http默认的端口号是80 默认的端口号省略 其他的端口号会写明 在开发过程中,所有的端口号都写明 ?之前作为API地址,?之后作为API参数
API
应用程序接口,简单的说可以快速调用某个程序 所谓API 本质上是一个URL, 开头也是http或者https,只是返回的内容有明显的区别,没有大量的多余字符 API返回的内容统称为’数据’
http状态码
直观反应本次请求的状况,如200就是请求成功,404表示请求出错
获取响应状态码
response.status_code
获取具体的响应内容文本
response.text
对于非文本的内容
response.content
对于API返回的json类型
response.json() 将其换成字典数据
import requests
response = requests.get('https://www.baidu.com/')
print('http 响应状态是:')
print(response.status_code)
print('API调用结果:')
print(response.text)
安装公共模块
pip install requests
get
import requests
result=requests.get('URL') #无参数
#有参数
result = requests.get('http://ip.taobao.com/service/getIpInfo.php', params={'ip': '117.89.35.58', 'format': 'json'})
#get('URL',params={})
post
提交数据到服务端进行增改删等操作
import requests
result = requests.post('https://gitee.com/login', data={'user[login]': '17177466748'})
#提交表单数据
#提交json数据
params = {'name': '张飞', 'secondName': '翼德'}
result=requests.post('https://www.fastmock.site/mock/3d95acf3f26358ef032d8a23bfdead99/api/posts', json=params)
json JSON(JavaScript Object Notation, JS 对象简谱),采用完全独立于编程语言的文本格式来存储和表示数据. Python中的json和字典的写法是一样的,json是一种通用数据格式,可以在Java、Python、JavaScript之间通信,而字典不可以,因此在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作。 在Python中自带json库。通过import json导入。 在json模块有4个方法, loads():将json数据转化成dict数据 dumps():将dict数据转化成json数据 load():读取json文件数据,转成dict数据 dump():将dict数据转化成json数据后写入json文件 注意在json中,name也是由” “包围的,所有的key和value都在” “中
解析json的字典
response=requests.get() #response是API得到的json数据
response.json()#此时这整个东西代表一个字典类型
response.json()[key]#访问相关值
User-Agent
模拟一个user-agent来反 防爬虫
判断是否来自一个真实的浏览器,需要从http消息头(headers)中获取user-agent才可以判断 headers的信息不写在URL中,属于隐藏信息
url = 'xxx'
headers = {'User-Agent': 'xxx')}
response = requests.get(url, headers=headers)
图片防盗链
浏览器请求图片时,会自动在headers中加一个referer 信息请求的来源
解决方法:把referer信息设置成图片原始使用的网站
headers={'Referer':'http://unreach.xxxx.com'}
response = requests.get(url,headers=headers)
Host
Host是一个域名(不带协议头)
跟User-Agent和Referer一样,Host也是属于Headers字典的一个字段
headers = {'Host': 'www.douban.com'}
把headers的三个数据写全,能避免很多问题
下载文件
图片、excel等二进制文件无法在console中写出,所以请求结果必须写入文件
打开文件 ↓ 写入内容 ↓ 关闭文件 打开和写入的步骤是为了保证同一个文件只能同时被一个程序写
写入文本
# 打开一个文件
fo = open("foo.txt", "w")
# 写入内容
fo.write("www.runoob.com!\nVery good site!")
# 关闭文件
fo.close()
写入excel等二进制文件
# 打开一个文件
fo = open("china-city-list.xlsx", "wb")#wb表示写入二进制内容
fo.write(response.content)
fo.close()
解析excel
用python读取excel
excel的表格是多sheet模式,sheet实际上是一个表格,表格又分为行跟列,所以解析数据的路径是sheet-行-列
import xlrd
## 必须先打开 excel 文件
x1 = xlrd.open_workbook('xzq_201907.xlsx')
## 按位置读取第一个 sheet,
' sheet_by_index()方法获取到 sheet 对象,参数是位置坐标'
s1 = x1.sheet_by_index(0)
## sheet 总行数
rows = s1.nrows
## sheet 总列数
cols = s1.ncols
#取得第一个 sheet 的第一行的第一列的单元格值
' cell() 方法获取到表格单元格对象,参数是位置坐标
.value 取得表示单元格的值'
first = s1.cell(0, 0).value
## 取得第一个 sheet 的最后一行的最后一列的单元格
last = s1.cell(rows-1, cols-1).value
解析excel并遍历
import requests
import xlrd
url = 'https://style.youkeda.com/img/ham/course/py2/xzq_201907.xlsx'
response = requests.get(url)
print('API调用状态:')
print(response.status_code)
localFile = 'xzq_201907.xlsx'
# 打开一个文件
fo = open(localFile, 'wb')
# 写入xlsx 文件二进制内容
fo.write(response.content)
# 关闭打开的文件
fo.close()
print(localFile + ' 下载成功!')
x1=xlrd.open_workbook(localFile)
s1=x1.sheet_by_index(0)
rows=s1.nrows
cols=s1.ncols
print("总行数:")
print(str(rows))
print("总列数:")
print(str(cols))
for index1 in range(rows):
for index2 in range(cols):
text=s1.cell(index1,index2).value
print(text,end=' ')
print('')
cookie
对于需要登陆才能抓取的文件
登录之后 “开发者选项-mime-headers-拷贝cookie值” 将cookie后的内容放入一个cookie.txt文档中 编码将cookie信息字符串转化成字典类型
将cookie转化成字典,并封入模块
def readCookie():
# 打开所保存的cookies内容文件
f = open('cookie.txt', 'r')
# 初始化cookies字典变量
cookies = {}
# 按照字符:进行划分读取
for line in f.read().split(';'):
# 其设置为1就会把字符串拆分成2份
name, value = line.strip().split('=', 1)
# 为字典cookies添加内容
cookies[name] = value
return cookies
主程序调用
import requests
from utils import readCookie
url = 'https://www.douban.com/mine'
header = {'Referer':'https://www.douban.com', 'Host':'www.douban.com', 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
cookies = readCookie()
print(cookies)
response = requests.get(url, headers=header, cookies=cookies)
'主要区别在get这边——requests.get(url, headers=header, cookies=cookies)'
print('http 响应状态是:')
print(response.status_code)
print('页面请求结果:')
print(response.text)
cookie在登陆后还想以登陆状态与服务器通讯则比较麻烦
Session——模拟登录
在登陆之前打开 开发者工具,勾选preserve log 进行登陆,在右侧抓取到的网络请求(signinlogin)中 找到:request URL 登陆地址 request method 执行方式 host referer user-agent form data
import requests
## 登陆网站
urlLogin = 'https://passport.mtime.com/member/signinLogin'
## 表单数据
formdata = {
'loginEmailText': '13777467803',
'loginPasswordText': 'aa787bc9cc97ba5d27cc042ecffe1489',
'isvcode': 'true',
'isAutoSign':'false'
}
## 头信息拷贝过来。
header = {'Referer': 'https://passport.mtime.com/member/signin/?redirectUrl=http%3A%2F%2Fwww.mtime.com%2F', 'Host': 'passport.mtime.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
session = requests.Session()##要在登陆状态下与服务器通讯,不能用request发送请求,而是先调用这个得到一个session对象,使用session对象发送请求
response = session.post(urlLogin, data=formdata, headers=header)
print('http 响应状态是:')
print(response.status_code)
print('登录请求结果:')
print(response.text)
登录之后复用session——必须登录界面上的请求
在登陆成功的基础上,在调用一个新的URL时,也必须使用session对象发送请求
实战SMTP与邮件
SMTP简单邮件传输协议,在这个协议上我们可以指定一条邮件和一个或多个邮件接收者,然后进行邮件输出 所有的邮件服务商都有自己的邮件服务地址
利用代码给自己的QQ邮箱发东西
调用库:smtplib email
编码格式:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
'引入库 '
## 发送者的邮箱
sender = 'xxx@xxx.com'
## 邮件接收,可以有多个,可以是其它邮箱地址
receivers = ['xxx@xxx.com']
## 邮件普通文本内容
mailContent = 'Hello World'
message = MIMEText(mailContent, 'plain', 'utf-8')'如果是发送网页邮件,将plain改成html'
## 发送人名称
message['From'] = Header('优课达', 'utf-8')
## 收件人名称
message['To'] = Header('测试邮件', 'utf-8')
## 邮件标题
message['Subject'] = Header('这是测试邮件', 'utf-8')
## 邮箱的SMTP 服务
mailHost = 'smtp.xxxx.com'
## 用户名
mailUser = 'xxx@xxx.com'
## 授权码
mailPass = ''
try:
## 连接邮箱。465 为 SMTP 端口号,大家需要对照阅读邮箱本身的帮助说明,有可能不一样
smtpObj = smtplib.SMTP_SSL(mailHost, 465)
## 授权认证
smtpObj.login(mailUser, mailPass)
## 发送邮件
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print("Error: 无法发送邮件")
查询城市代号
指定编码格式
response.encoding='utf-8'