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 requestsresponse = requests.get('https://www.baidu.com/')print('http 响应状态是:')print(response.status_code)print('API调用结果:')print(response.text)
安装公共模块
pip install requests
get
import requestsresult=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 requestsresult = 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 requestsimport xlrdurl = '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.nrowscols=s1.ncolsprint("总行数:")print(str(rows))print("总列数:")print(str(cols))for index1 in range(rows):for index2 in range(cols):text=s1.cell(index1,index2).valueprint(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] = valuereturn cookies
主程序调用
import requestsfrom utils import readCookieurl = '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 smtplibfrom email.mime.text import MIMETextfrom 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'
协议类型与域名之间用 :// 分隔
注意路径(path)以 / 作为开头和分隔符(而文件夹的分隔符是 \)
参数部分用key=value的格式表示 ,参数与参数之间用&表示
有时在域名之后会出现端口号 :443
https默认的端口号是443 http默认的端口号是80
默认的端口号省略 其他的端口号会写明
在开发过程中,所有的端口号都写明
?之前作为API地址,?之后作为API参数