首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

用python实现接口测试(七、查询快递单号)

一、查询yunda快递单号 1.查询yunda快递单号:1202247993797 ,测试地址:http://www.kuaidi.com/ 快递查询API 2.使用fiddler抓取包,抓取单号查询请求的接口地址,如下图所示 抓取单号请求接口 3.抓包后获得请求接口:http://www.kuaid.com/index-ajarselectcourierinfo-1202247993797-yuunda.html 二、 查询tiantian快递单号 1.查询tiantian快递单号:560697415000 2.使用fiddler抓取tiantian快递接口地址 接口地址 3.获取接口url地址:http://www.kuaidi.com/index-ajaxselectcourierinfo-560697415000-tiantian.html

优秀的个人博客,低调大师

Python后端(一)——客户端/服务端

网址组成(四部分) 协议 http, https(https 是加密的http) 主机 g.cn zhihu.com之类的网址 端口 HTTP 协议默认是 80,因此一般不用填写 路径 下面的「/」和「/question/31838184」都是路径 http://www.zhihu.com/ http://www.zhihu.com/question/31838184 电脑通信靠IP地址,IP地址记不住就发明了域名(domain name),然后电脑自动向DNS服务器(domain name server)查询域名对应的IP地址 比如g.cn这样的网址,可以通过电脑的ping程序查出对应IP 地址 ping g.cn PING g.cn (74.125.69.160): 56 data bytes 端口是什么? 一个比喻: 用邮局互相写信的时候,ip相当于地址(也可以看做邮编,地址是域名) 端口是收信人姓名(因为一个地址比如公司、家只有一个地址,但是却可能有很多收信人) 端口就是一个标记收信人的数字。 端口是一个16 位的数字,所以范围是 0-65535(2**16) ——HTTP协议—— 一个传输协议,协议就是双方都遵守的规范。 为什么叫超文本传输协议呢,因为收发的是文本信息。 1,浏览器(客户端)按照规定的格式发送文本数据(请求)到服务器 2,服务器解析请求,按照规定的格式返回文本数据到浏览器 3,浏览器解析得到的数据,并做相应处理 请求和返回是一样的数据格式,分为4部分: 1,请求行或者响应行 2,Header(请求的 Header 中 Host 字段是必须的,其他都是可选) 3,\r\n\r\n(连续两个换行回车符,用来分隔Header和Body) 4,Body(可选) 请求的格式,注意大小写(这是一个不包含Body的请求): 原始数据如下 'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n' 打印出来如下 GET / HTTP/1.1 Host: g.cn 其中 1,GET 是请求方法(还有POST等,这就是个标志字符串而已) 2,/ 是请求的路径(这代表根路径) 3,HTTP/1.1 中,1.1是版本号,通用了20年 具体字符串是'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n' 返回的数据如下 HTTP/1.1 301 Moved Permanently Alternate-Protocol: 80:quic,p=0,80:quic,p=0 Cache-Control: private, max-age=2592000 Content-Length: 218 Content-Type: text/html; charset=UTF-8 Date: Tue, 07 Jul 2015 02:57:59 GMT Expires: Tue, 07 Jul 2015 02:57:59 GMT Location: http://www.google.cn/ Server: gws X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Body部分太长,先不贴了 其中响应行(第一行): 1,HTTP/1.1 是版本 2,301 是「状态码」,参见文末链接 3,Moved Permanently 是状态码的描述 浏览器会自己解析Header部分,然后将Body显示成网页 ——web服务器做什么—— 主要就是解析请求,发送相应的数据给客户端。 例如附件中的代码(1client.py)就是模拟浏览器发送HTTP 请求给服务器并把收到的所有信息打印出来(使用的是最底层的 socket,现阶段不必关心这种低层,web开发是上层开发) // 客户端代码实例: 1 # coding: utf-8 2 3 import socket 4 5 6 # socket 是操作系统用来进行网络通信的底层方案 7 # 简而言之, 就是发送 / 接收数据 8 9 # 创建一个 socket 对象 10 # 参数 socket.AF_INET 表示是 ipv4 协议 11 # 参数 socket.SOCK_STREAM 表示是 tcp 协议 12 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 # 这两个其实是默认值, 所以你可以不写, 如下 14 # s = socket.socket() 15 # s = ssl.wrap_socket(socket.socket()) 16 17 # 主机(域名或者ip)和端口 18 host = 'g.cn' 19 port = 80 20 # 用 connect 函数连接上主机, 参数是一个 tuple 21 s.connect((host, port)) 22 23 # 连接上后, 可以通过这个函数得到本机的 ip 和端口 24 ip, port = s.getsockname() 25 print('本机 ip 和 port {} {}'.format(ip, port)) 26 27 # 构造一个 HTTP 请求 28 http_request = 'GET / HTTP/1.1\r\nhost:{}\r\n\r\n'.format(host) 29 # 发送 HTTP 请求给服务器 30 # send 函数只接受 bytes 作为参数 31 # str.encode 把 str 转换为 bytes, 编码是 utf-8 32 request = http_request.encode('utf-8') 33 print('请求', request) 34 s.send(request) 35 36 # 接受服务器的响应数据 37 # 参数是长度, 这里为 1023 字节 38 # 所以这里如果服务器返回的数据中超过 1023 的部分你就得不到了 39 response = s.recv(1023) 40 41 # 输出响应的数据, bytes 类型 42 print('响应', response) 43 # 转成 str 再输出 44 print('响应的 str 格式', response.decode('utf-8')) // 服务端代码实例 1 import socket 2 3 4 # 这个程序就是一个套路程序, 套路程序没必要思考为什么会是这样 5 # 记住套路, 能用, 就够了 6 # 运行这个程序后, 浏览器打开 localhost:2000 就能访问了 7 # 8 # 服务器的 host 为空字符串, 表示接受任意 ip 地址的连接 9 # post 是端口, 这里设置为 2000, 随便选的一个数字 10 host = '' 11 port = 2000 12 13 # s 是一个 socket 实例 14 s = socket.socket() 15 # s.bind 用于绑定 16 # 注意 bind 函数的参数是一个 tuple 17 s.bind((host, port)) 18 19 20 # 用一个无限循环来处理请求 21 while True: 22 # 套路, 先要 s.listen 开始监听 23 # 注意 参数 5 的含义不必关心 24 s.listen(5) 25 # 当有客户端过来连接的时候, s.accept 函数就会返回 2 个值 26 # 分别是 连接 和 客户端 ip 地址 27 connection, address = s.accept() 28 29 # recv 可以接收客户端发送过来的数据 30 # 参数是要接收的字节数 31 # 返回值是一个 bytes 类型 32 request = connection.recv(1024) 33 34 # bytes 类型调用 decode('utf-8') 来转成一个字符串(str) 35 print('ip and request, {}\n{}'.format(address, request.decode('utf-8'))) 36 37 # b'' 表示这是一个 bytes 对象 38 response = b'<h1>Hello World!</h1>' 39 # 用 sendall 发送给客户端 40 connection.sendall(response) 41 # 发送完毕后, 关闭本次连接 42 connection.close()

优秀的个人博客,低调大师

Python爬虫爬取网易云音乐全部评论

beautiful now.png 思路整理 访问网易云音乐单曲播放界面,我们可以看到当我们翻页的时候网址是没有变化的,这时候我们大致可以确定评论是通过post形式加载的; . 2.接下来就打开控制台找我们要的评论藏在哪里就好了。 我们在http://music.163.com/weapi/v1/resource/comments/R_SO_4_32019002?csrf_token=发现了我们要的评论,包括热门评论,我们注意看下R_SO_4_后面的数字,其实就是每首歌的id,如果我们想一次性爬取多首歌曲的评论的话,可以通过每次传入歌曲id来实现; image.png 我们接下来看下需要post的数据,有两个值params和encSecKey,本以为就是页码之类的,看到这两个值我其实是懵逼的,很显然是加密过了的,不过我不知道他是怎么加密的,后面在知乎上找到了解决方法,各位可以去知乎看看,我就不赘述了,因为我也没看明白……; image.png 代码部分 加密 前文说了,这部分参考了知乎的一位答主,各位可以去知乎看看,我这边只是稍微改了下就拿来用了,点这里跳转; first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}' second_param = "010001" third_param = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7" forth_param = "0CoJUm6Qyw8W8jud" def get_params(i): if i == 0: first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}' else: offset =str(i*20) first_param = '{rid:"", offset:"%s", total:"%s", limit:"20", csrf_token:""}'%(offset,'flase') iv = "0102030405060708" first_key = forth_param second_key = 16 * 'F' h_encText = AES_encrypt(first_param, first_key, iv) h_encText = AES_encrypt(h_encText, second_key, iv) return h_encText def get_encSecKey(): encSecKey = "257348aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2e3881736d94a02ca919d952872e7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3f624750ed39e7de08fc8493242e26dbc4484a01c76f739e135637c" return encSecKey def AES_encrypt(text, key, iv): pad = 16 - len(text) % 16 text = text + pad * chr(pad) encryptor = AES.new(key, AES.MODE_CBC, iv) encrypt_text = encryptor.encrypt(text) encrypt_text = base64.b64encode(encrypt_text) return encrypt_text 获取页码以及评论 获取页码数是为了加入循环获取每页的评论,代码如下; def get_json(url, params, encSecKey): data = { "params": params, "encSecKey": encSecKey } response = requests.post(url, headers=headers, data=data,proxies = proxies) return response.content def get_page(url): params = get_params(0); encSecKey = get_encSecKey(); json_text = get_json(url, params, encSecKey) json_dict = json.loads(json_text) total_comment = json_dict['total'] page=(total_comment/20)+1 print '***查询到评论共计%d条,%d页***'%(total_comment,page) return page 最后就是把json数据按照你想要的保存下来就好了,如果只想要热门评论的话,把comments改成hotcomments就好了。 完整代码如下: #coding = utf-8 from Crypto.Cipher import AES import base64 import requests import json import time import pandas as pd import random headers = { 'Referer': 'http://music.163.com/song?id=531051217', 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Cookie': 'JSESSIONID-WYYY=%5CuiUi%5C%2FYs%2FcJcoQ5xd3cBhaHw0rEfHkss1s%2FCfr92IKyg2hJOrJquv3fiG2%2Fn9GZS%2FuDH8PY81zGquF4GIAVB9eYSdKJM1W6E2i1KFg9%5CuZ4xU6VdPCGwp4KOUZQQiWSlRT%2F1r07OmIBn7yYVYN%2BM2MAalUQnoYcyskaXN%5CPo1AOyVVV%3A1516866368046; _iuqxldmzr_=32; _ntes_nnid=7e2e27f69781e78f2c610fa92434946b,1516864568068; _ntes_nuid=7e2e27f69781e78f2c610fa92434946b; __utma=94650624.470888446.1516864569.1516864569.1516864569.1; __utmc=94650624; __utmz=94650624.1516864569.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmb=94650624.8.10.1516864569' } proxies = {'http':'http://221.200.107.118','https':'http://116.2.25.251'} first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}' second_param = "010001" third_param = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7" forth_param = "0CoJUm6Qyw8W8jud" def get_params(i): if i == 0: first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}' else: offset =str(i*20) first_param = '{rid:"", offset:"%s", total:"%s", limit:"20", csrf_token:""}'%(offset,'flase') iv = "0102030405060708" first_key = forth_param second_key = 16 * 'F' h_encText = AES_encrypt(first_param, first_key, iv) h_encText = AES_encrypt(h_encText, second_key, iv) return h_encText def get_encSecKey(): encSecKey = "257348aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2e3881736d94a02ca919d952872e7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3f624750ed39e7de08fc8493242e26dbc4484a01c76f739e135637c" return encSecKey def AES_encrypt(text, key, iv): pad = 16 - len(text) % 16 text = text + pad * chr(pad) encryptor = AES.new(key, AES.MODE_CBC, iv) encrypt_text = encryptor.encrypt(text) encrypt_text = base64.b64encode(encrypt_text) return encrypt_text def get_json(url, params, encSecKey): data = { "params": params, "encSecKey": encSecKey } response = requests.post(url, headers=headers, data=data,proxies = proxies) return response.content def get_page(url): params = get_params(0); encSecKey = get_encSecKey(); json_text = get_json(url, params, encSecKey) json_dict = json.loads(json_text) total_comment = json_dict['total'] page=(total_comment/20)+1 print '***查询到评论共计%d条,%d页***'%(total_comment,page) return page if __name__ == "__main__": start_time = time.time() url = "http://music.163.com/weapi/v1/resource/comments/R_SO_4_32019002?csrf_token=" page = get_page(url) for i in range(page): params = get_params(i); encSecKey = get_encSecKey(); json_text = get_json(url, params, encSecKey) json_dict = json.loads(str(json_text))['comments'] for t in list(range(len(json_dict))): if t == 0: rdata=pd.DataFrame(pd.Series(data=json_dict[t])).T else: rdata=pd.concat([rdata,pd.DataFrame(pd.Series(data=json_dict[t])).T]) if i == 0: commentdata=rdata else: commentdata=pd.concat([commentdata,rdata]) print('***正在保存第%d页***'%(i+1)) time.sleep(random.uniform(0.2,0.5)) commentdata.to_excel('NetEase_Music_Spider.xls',sheet_name='sheet1') end_time = time.time() print "程序耗时%f秒." % (end_time - start_time) print '***NetEase_Music_Spider@Awesome_Tang***' 本次爬的是最近一直循环的<beautiful now--Zedd/Jon Bellion>,评论共计37429条,1872页,程序耗时1036.046966秒,接近20分钟。 Notes 各位爬的时候一定要使用代理IP,我后面准备爬周董最近的新歌<等你下课>的评论的,爬到5000多页也就是差不多10W条的时候,被封IP了,导致我们整个公司的网络都一段时间内不能访问网易云音乐的评论,包括手机连Wi-Fi... image.png Peace~

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册