URL
    Uniform Resource Locator 统一资源定位符

    python网络 - 图1 协议类型与域名之间用 :// 分隔 注意路径(path)以 / 作为开头和分隔符(而文件夹的分隔符是 \) 参数部分用key=value的格式表示 ,参数与参数之间用&表示 有时在域名之后会出现端口号 :443 https默认的端口号是443 http默认的端口号是80 默认的端口号省略 其他的端口号会写明 在开发过程中,所有的端口号都写明 ?之前作为API地址,?之后作为API参数

    API

    应用程序接口,简单的说可以快速调用某个程序 所谓API 本质上是一个URL, 开头也是http或者https,只是返回的内容有明显的区别,没有大量的多余字符 API返回的内容统称为’数据’

    http状态码

    直观反应本次请求的状况,如200就是请求成功,404表示请求出错

    1. 获取响应状态码
    2. response.status_code
    3. 获取具体的响应内容文本
    4. response.text
    5. 对于非文本的内容
    6. response.content
    7. 对于API返回的json类型
    8. response.json() 将其换成字典数据
    1. import requests
    2. response = requests.get('https://www.baidu.com/')
    3. print('http 响应状态是:')
    4. print(response.status_code)
    5. print('API调用结果:')
    6. print(response.text)

    安装公共模块

    1. pip install requests

    get

    1. import requests
    2. result=requests.get('URL') #无参数
    3. #有参数
    4. result = requests.get('http://ip.taobao.com/service/getIpInfo.php', params={'ip': '117.89.35.58', 'format': 'json'})
    5. #get('URL',params={})

    post

    1. 提交数据到服务端进行增改删等操作
    2. import requests
    3. result = requests.post('https://gitee.com/login', data={'user[login]': '17177466748'})
    4. #提交表单数据
    5. #提交json数据
    6. params = {'name': '张飞', 'secondName': '翼德'}
    7. 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的字典

    1. response=requests.get() #response是API得到的json数据
    2. response.json()#此时这整个东西代表一个字典类型
    3. response.json()[key]#访问相关值

    User-Agent
    模拟一个user-agent来反 防爬虫

    判断是否来自一个真实的浏览器,需要从http消息头(headers)中获取user-agent才可以判断 headers的信息不写在URL中,属于隐藏信息

    1. url = 'xxx'
    2. headers = {'User-Agent': 'xxx')}
    3. response = requests.get(url, headers=headers)

    图片防盗链
    浏览器请求图片时,会自动在headers中加一个referer 信息请求的来源
    解决方法:把referer信息设置成图片原始使用的网站

    1. headers={'Referer':'http://unreach.xxxx.com'}
    2. response = requests.get(url,headers=headers)

    Host
    Host是一个域名(不带协议头)
    跟User-Agent和Referer一样,Host也是属于Headers字典的一个字段

    1. headers = {'Host': 'www.douban.com'}

    把headers的三个数据写全,能避免很多问题

    下载文件
    图片、excel等二进制文件无法在console中写出,所以请求结果必须写入文件

    打开文件 ↓ 写入内容 ↓ 关闭文件 打开和写入的步骤是为了保证同一个文件只能同时被一个程序写

    写入文本

    1. # 打开一个文件
    2. fo = open("foo.txt", "w")
    3. # 写入内容
    4. fo.write("www.runoob.com!\nVery good site!")
    5. # 关闭文件
    6. fo.close()

    写入excel等二进制文件

    1. # 打开一个文件
    2. fo = open("china-city-list.xlsx", "wb")#wb表示写入二进制内容
    3. fo.write(response.content)
    4. fo.close()

    解析excel
    用python读取excel

    excel的表格是多sheet模式,sheet实际上是一个表格,表格又分为行跟列,所以解析数据的路径是sheet-行-列

    1. import xlrd
    2. ## 必须先打开 excel 文件
    3. x1 = xlrd.open_workbook('xzq_201907.xlsx')
    4. ## 按位置读取第一个 sheet,
    5. ' sheet_by_index()方法获取到 sheet 对象,参数是位置坐标'
    6. s1 = x1.sheet_by_index(0)
    7. ## sheet 总行数
    8. rows = s1.nrows
    9. ## sheet 总列数
    10. cols = s1.ncols
    11. #取得第一个 sheet 的第一行的第一列的单元格值
    12. ' cell() 方法获取到表格单元格对象,参数是位置坐标
    13. .value 取得表示单元格的值'
    14. first = s1.cell(0, 0).value
    15. ## 取得第一个 sheet 的最后一行的最后一列的单元格
    16. last = s1.cell(rows-1, cols-1).value

    解析excel并遍历

    1. import requests
    2. import xlrd
    3. url = 'https://style.youkeda.com/img/ham/course/py2/xzq_201907.xlsx'
    4. response = requests.get(url)
    5. print('API调用状态:')
    6. print(response.status_code)
    7. localFile = 'xzq_201907.xlsx'
    8. # 打开一个文件
    9. fo = open(localFile, 'wb')
    10. # 写入xlsx 文件二进制内容
    11. fo.write(response.content)
    12. # 关闭打开的文件
    13. fo.close()
    14. print(localFile + ' 下载成功!')
    15. x1=xlrd.open_workbook(localFile)
    16. s1=x1.sheet_by_index(0)
    17. rows=s1.nrows
    18. cols=s1.ncols
    19. print("总行数:")
    20. print(str(rows))
    21. print("总列数:")
    22. print(str(cols))
    23. for index1 in range(rows):
    24. for index2 in range(cols):
    25. text=s1.cell(index1,index2).value
    26. print(text,end=' ')
    27. print('')

    cookie
    对于需要登陆才能抓取的文件

    登录之后 “开发者选项-mime-headers-拷贝cookie值” 将cookie后的内容放入一个cookie.txt文档中 编码将cookie信息字符串转化成字典类型

    将cookie转化成字典,并封入模块

    1. def readCookie():
    2. # 打开所保存的cookies内容文件
    3. f = open('cookie.txt', 'r')
    4. # 初始化cookies字典变量
    5. cookies = {}
    6. # 按照字符:进行划分读取
    7. for line in f.read().split(';'):
    8. # 其设置为1就会把字符串拆分成2份
    9. name, value = line.strip().split('=', 1)
    10. # 为字典cookies添加内容
    11. cookies[name] = value
    12. return cookies

    主程序调用

    1. import requests
    2. from utils import readCookie
    3. url = 'https://www.douban.com/mine'
    4. 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'}
    5. cookies = readCookie()
    6. print(cookies)
    7. response = requests.get(url, headers=header, cookies=cookies)
    8. '主要区别在get这边——requests.get(url, headers=header, cookies=cookies)'
    9. print('http 响应状态是:')
    10. print(response.status_code)
    11. print('页面请求结果:')
    12. print(response.text)

    cookie在登陆后还想以登陆状态与服务器通讯则比较麻烦
    Session——模拟登录

    在登陆之前打开 开发者工具,勾选preserve log 进行登陆,在右侧抓取到的网络请求(signinlogin)中 找到:request URL 登陆地址 request method 执行方式 host referer user-agent form data

    1. import requests
    2. ## 登陆网站
    3. urlLogin = 'https://passport.mtime.com/member/signinLogin'
    4. ## 表单数据
    5. formdata = {
    6. 'loginEmailText': '13777467803',
    7. 'loginPasswordText': 'aa787bc9cc97ba5d27cc042ecffe1489',
    8. 'isvcode': 'true',
    9. 'isAutoSign':'false'
    10. }
    11. ## 头信息拷贝过来。
    12. header = {'Referer': 'https://passport.mtime.com/member/signin/?redirectUrl=http%3A%2F%2Fwww.mtime.com%2F', 'Host': 'passport.mtime.com',
    13. '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'}
    14. session = requests.Session()##要在登陆状态下与服务器通讯,不能用request发送请求,而是先调用这个得到一个session对象,使用session对象发送请求
    15. response = session.post(urlLogin, data=formdata, headers=header)
    16. print('http 响应状态是:')
    17. print(response.status_code)
    18. print('登录请求结果:')
    19. print(response.text)

    登录之后复用session——必须登录界面上的请求

    在登陆成功的基础上,在调用一个新的URL时,也必须使用session对象发送请求

    实战SMTP与邮件

    SMTP简单邮件传输协议,在这个协议上我们可以指定一条邮件和一个或多个邮件接收者,然后进行邮件输出 所有的邮件服务商都有自己的邮件服务地址

    利用代码给自己的QQ邮箱发东西
    调用库:smtplib email
    编码格式:utf-8

    1. import smtplib
    2. from email.mime.text import MIMEText
    3. from email.header import Header
    4. '引入库 '
    5. ## 发送者的邮箱
    6. sender = 'xxx@xxx.com'
    7. ## 邮件接收,可以有多个,可以是其它邮箱地址
    8. receivers = ['xxx@xxx.com']
    9. ## 邮件普通文本内容
    10. mailContent = 'Hello World'
    11. message = MIMEText(mailContent, 'plain', 'utf-8')'如果是发送网页邮件,将plain改成html'
    12. ## 发送人名称
    13. message['From'] = Header('优课达', 'utf-8')
    14. ## 收件人名称
    15. message['To'] = Header('测试邮件', 'utf-8')
    16. ## 邮件标题
    17. message['Subject'] = Header('这是测试邮件', 'utf-8')
    18. ## 邮箱的SMTP 服务
    19. mailHost = 'smtp.xxxx.com'
    20. ## 用户名
    21. mailUser = 'xxx@xxx.com'
    22. ## 授权码
    23. mailPass = ''
    24. try:
    25. ## 连接邮箱。465 为 SMTP 端口号,大家需要对照阅读邮箱本身的帮助说明,有可能不一样
    26. smtpObj = smtplib.SMTP_SSL(mailHost, 465)
    27. ## 授权认证
    28. smtpObj.login(mailUser, mailPass)
    29. ## 发送邮件
    30. smtpObj.sendmail(sender, receivers, message.as_string())
    31. print("邮件发送成功")
    32. except smtplib.SMTPException:
    33. print("Error: 无法发送邮件")

    查询城市代号
    指定编码格式

    1. response.encoding='utf-8'