解密:Python之自动获取公网IP的实例讲解
优采云 发布时间: 2022-10-01 07:07解密:Python之自动获取公网IP的实例讲解
Python自动获取微信公众号最新文章的实现代码
目录微信公众号获取思路
获取微信公众号文章常用的方法有搜狐、微信公众号首页和api接口。
听说最近搜狐不太好用,而且之前使用的API接口也经常维护,所以使用微信公众平台进行数据爬取。
首先,登录你的微信公众平台。如果您没有帐户,您可以注册一个。进来后找“图文资料”,就是写公众号的地方
点击后会出现写公众号的界面文章。在界面中,您会找到“超链接”字段,您可以在其中搜索其他公众号。
以“python”为例,输入要检索的公众号名称,从显示的公众号中选择公众号为采集
点击浏览器查看,在网络中找到链接,下图中的链接,右边的Request URL是存储公众号数据的真实链接。表示这是一个 json 网页。
采集实例
以公众号“python”的链接为例,分析URL。
https://mp.weixin.qq.com/cgi-bin/appmsg:微信公众平台的链接
"token": "163455614", #需要定期修改的token
"lang": "zh_CN", #语言
"f": "json",
"ajax": "1", #显示几天的文章
"action": "list_ex"
"begin": "0", #起始页面
"count": "1", #计数
"query": "",
"fakeid": 'MzIwNDA1OTM4NQ==', #公众号唯一编码
"type": "9",
由于我发现fakeid是唯一代表公众号的代码,那么我只需要找到所需公众号的fakeid即可。我随机找了三个公众号进行测试。
fakeid=[ 'MzIwNDA1OTM4NQ==','MzkxNzAwMDkwNQ==','MjM5NzI0NTY3Mg==']
#若增加公众号需要增加fakeid
然后下一步就是请求URL
首先导入需要的库
import time
import requests
from lxml import etree
import pandas as pd
import json
import numpy as np
import datetime
import urllib3
<p>
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)</p>
由于不想重复登录公众号平台,可以使用cookies来避免登录。在请求文章之前,需要先找到网页的cookie和User-Agent。由于微信公众号是定期刷新的,所以这个cookie和上面的token都要定期刷新。代替。
为了避免反扒,最好找个代理ip
headers = {
"Cookie": "appmsglist_action_3567997841=card;wxuin=49763073568536;pgv_pvid=6311844914;ua_id=x6Ri8bc9LeaWnjNNAAAAADI-VXURALRxlSurJyxNNvg=;mm_lang=zh_CN;pac_uid=0_3cf43daf28071;eas_sid=11Q6v5b0x484W9i7W0Z7l7m3I8;rewardsn=;wxtokenkey=777;wwapp.vid=;wwapp.cst=;wwapp.deviceid=;uuid=fd43d0b369e634ab667a99eade075932;rand_info=CAESIHgWwDfp3W4M9F3/TGnzHp4kKkrkMiCEvN/tSNhHtNBm;slave_bizuin=3567997841;data_bizuin=3567997841;bizuin=3567997841;data_ticket=IfMEEajZ8UvywUZ1NiIv9eKZkq0cgeS0oP6tTzEwNSjwK6q+u5vLw0XYeFvLL/JA;slave_sid=aVBzSlpYOGt4eTdmbzFRWDc1OUhzR1A1UkwzdUdBaklDaGh2dWY2MUZKTEw1Um1aalZRUXg5aVBMeEJVNklCcGlVN0s5Z3VEMmRtVENHS1ZxNTBDOWRCR0p2V2FyY2daU0hxT09Remd5YmlhRWExZkMwblpweVc3SndUbnJIQk55MGhUeExJa1NJcWZ0QmJS;slave_user=gh_e0f449d4f2b6;xid=7d5dc56bb7bb526c70cfef3f6bdfa18a",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36",
}
proxies = {'http': '112.80.248.73'}
接下来可以爬取页面,获取页面中的文章标题和文章链接,以及文章的时间,分析网页的信息,发现所有的信息网页保存在“app_msg_list”字段中,因此提取该字段中的数据。
代码显示如下:
得到的数据包存放在df中。这里的数据不是微信公众号最新的文章数据,而是微信公众号最近一天发送的文章数据。因此,还需要过滤发布时间。注意这里的时间格式是时间戳,所以需要转换时间数据
转换代码如下:
def time_s(df):
def transfer_time(s): #时间处理
aa = time.ctime(s)
bb = aa.split(' ')
cc = (bb[-1]+"-"+bb[1]+"-"+bb[-3]).replace('Jan','1').replace('Feb','2').replace('Mar','3'). \
replace('Apr','4').replace('May','5').replace('Jun','6').replace('Jul','7').replace('Aug','8') \
.replace('Sep','9').replace('Oct','10').replace('Nov','11').replace('Dec','12')
dd = datetime.datetime.strptime(cc,'%Y-%m-%d').date()
return dd
ti=[]
hd=[]
for i in range(0,len(df['time'])):
timestap= transfer_time(df['time'][i])
ti.append(timestap)
#print(ti)
d= ti[i] + datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, seconds=0, milliseconds=0, microseconds=0, )
#dc = d.strftime("%Y-%m-%d")
hd.append(d)
df['time']=hd
这样就可以将微信公众号的时间戳数据转换为时间数据,然后根据当天的日期提取数据集中的内容并存储。
dat=df[df['time'] == datetime.date.today() + datetime.timedelta(days= -1)] #自动获取昨天日期,将-1改为-2,则为前天的日期,以此类推
##改自动化
<p>
path = 'C:/Users/gpower/Desktop/work/行业信息/' #根据自己电脑位置更改
import re
filename=path+"微信公众号采集" + re.sub(r'[^0-9]','',datetime.datetime.now().strftime("%Y-%m-%d")) + '.csv'
# 对文件进行命名,以“微信公众号采集+当前日期”命名
dat.to_csv(filename,encoding='utf_8_sig')
print("保存成功")</p>
这样就可以下载最新的微信公众号文章采集。如果需要多个微信公众号,可以在fakeid中添加公众号的识别码。
这是关于python自动获取微信公众号最新文章的文章的介绍。更多关于python自动获取微信公众号文章的信息,请搜索我们之前的文章@文章或继续浏览以下相关文章希望大家多多支持未来!
时间:2022-07-13
Python自动获取公网IP的一个例子
0.基础知识0.1 SQL基础ubuntu.Debian系列安装:root@raspberrypi:~/python-script# apt-get install mysql-server Redhat.Centos系列安装:[root@localhost ~] # yum install mysql-server 登录数据库 pi@raspberrypi:~ $ mysql -uroot -p -hlocalhost 输入密码:欢迎马
Python实现自动获取磁力链接的方法
既然没事做,我就去找个电影看。然后我找到了洪流搜索网站,但是网站这种类型的弹窗广告太多了,让我很烦。所以我想写一个脚本来自动获取python中的磁力链接。写了大概半个小时。代码如下 import requests import re from bs4 import BeautifulSoup url="*seed 网站*/" header ={ "Accept":"text/html,application/xhtml+xml,appli
python+excel接口自动获取token作为请求参数传递
1.登录界面返回登录后对应的token包: import json import requests from util.operation_json import OperationJson from base.runmethod import RunMethod class OperationHeader: def __init__(self, response): self.response = json。加载(响应)def get_response_token(自我
python接口自动化如何封装获取常量的类
本篇文章主要介绍python接口自动化如何封装获取常量的类。本文对示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考和学习价值。有需要的朋友可以参考以下背景:一.执行一个案例的过程:首先我们可以通过excel获取单元格的内容。在获取内容的时候,我们首先要知道获取到的数据是哪一行,在这行数据中需要带哪些参数,比如case name .Request url.Request method.header.Depending id.Depending在数据所属的字段上。请求数据。预期结果:然后需要,判断该字段的合法性。数据,将合法案例组合成一个接口请求:最后,执行
python获取当前公网ip并自动断开宽带连接示例代码
今天写了一个文件,获取当前公网ip并自动断开宽带连接,分享给大家。这个文件的具体用途大家都知道,可以使用,但是目前只适用于windows平台,我的python版本是2.7,win32ras模块需要下载pywin32.@ > 代码如下: #!coding: cp936 import win32ras import time,os def Connect(dialname, account, passwd): dial_params = (dialname, '' , '', account,
php获取用户真实IP及反刷机制示例代码
一. 如何获取用户IP地址 public static function getClientIp() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } if ('HTTP_X_REAL_IP')) { $ip = getenv('HTTP_X_REAL_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FO
使用Python获取和处理IP的类型和格式
公网和私网的判断其实很简单,只要记住私网的三个网段即可。但是对于记忆力差的人或者知识水平低的机器来说,还是要有判断的方法的。编写以下脚本: from IPy import IP ip1 = IP('192.168.1.2') ip2 = IP('11.12.@ >1 3.14') print("ip1 type: %s" % ip1.iptype()) print("ip2 type: %s" % ip2.iptype())打印(“IP2
python获取外网IP并发邮件的实现方法
Step 1:通过ip138爬取外网IP Step 2:通过python的smtplib模块和email发送邮件,具体使用方法网上搜索。以下是代码示例: #!/usr/bin/env python #coding: utf-8 import urllib2 import re import smtplib from email.MIMEText import MIMEText from email.Header import Header ########## ################### ####
python获取外网ip地址的方法总结
本文的例子总结了python获取外网IP地址的方法。分享给大家,供大家参考。具体如下: 一.使用脚本引擎库直接获取导入控制台;导入 web.script 导入 inet.http;var jsVm = web .script("JavaScript") jsVm.AddCode(inet.http().get("") ) var ipAddr = jsVm.CodeObject.
Python获取linux主机ip的简单实现方法
本文中的例子介绍了Python获取linux主机ip的简单实现方法。分享给大家,供大家参考,如下: Python有几种获取主机ip的方法。我常用的是通过socket.socket()。实现inet_ntoa()很方便:但是这个方法有个限制,就是要传入网卡的名字(比如eth0))作为参数。因此,增加了一个额外的条件判断。如果发现上述方法获取到ip,则抛出异常,然后使用shell命令(ifconfig)和管道过滤出想要的ip。导入套接字导入 fcntl 导入
Linux下通过python获取本机ip的方法示例
下面介绍在Linux上使用python获取本地ip的方法。网上查了一下,发现大致有两种方法,一种是调用shell脚本,另一种是使用python中的socket等模块来获取。以下是这两种方法。该方法源码:#!/usr/bin/env python #encoding: utf-8 #description: 获取本地ip地址 import os import socket, fcntl, struct def get_ip(): #注意用双引号代替单引号,并假设沉默
python自动绘制轨迹示例代码
使用的思维:自动化思维,数据与功能分离处理,数据驱动程序界面设计自动化操作,数据与程序之间的联系清晰明了,二维数据的应用,维度组织数据的应用,最二维数据常用代码# AutoTrace.py import turtle as t t.title("自动绘制轨迹") t.setup(800,600) t.pencolor("red") t.pensize( 5) t.speed( 10) # 数据读取 datals=[] f=open("data.trac
Python获取文件路径、文件名、后缀名的实例
示例如下:#########start 获取文件路径.filename.suffix name############ def jwkj_get_filePath_fileName_fileExt(filename): (filepath,tempfilename) = os. path.split(文件名);(shotname,extension) = os.path.splitext(tempfilename); 返回文件路径,镜头名称,扩展名#########
Python+selenium实现自动抢票功能示例代码
简介 什么是硒?Selenium 是来自 ThoughtWorks 的一系列功能强大的开源 Web 功能测试工具。它使用 Javascript 来管理整个测试过程,包括读入测试套件、执行测试和记录测试结果。它以Javascript单元测试工具JSUnit为核心,模拟真实用户操作,包括浏览页面、点击链接、输入文本、提交表单、触发鼠标事件等,可以对页面结果进行各种验证。也就是说,只要在测试用例描述中使用了预期的用户行为和结果,我们就得到了一个可以自动运行的功能测试套件。(硒的
汇总:七步实现列表点击事件的采集
前言
在iOS全埋点采集中,单元格点击事件采集通常是指UITableViewCell和UI采集ViewCell采集的用户点击行为。
单元格点击是通过protocol中的方法实现的,所以我们可以通过hook UITableView的protocol方法-tableView:didSelectRowAtIndexPath:和UI采集View的protocol方法-采集View:didSelectItemAtIndexPath:来达到采集的目的。
iOS中hook方法最简单的方法是通过Method Swizzling[1]来交换方法的IMP,但是这种方法不能完全适应单元格点击事件采集,缺陷如下:
Method Swizzling的代码只需要执行一次,但是代理对象可以设置多次;
当代理对象有子类继承时,需要区分子类是否重写了要交换的方法;
RxSwift、Texture等第三方库使用消息转发时,无法进行方法交换。
正是因为上述缺陷,我们不得不寻找其他的钩子解决方案。
计划概述
Method Swizzling exchange方法对整个类及其子类都有效,那么有没有只作用于当前代理对象的hook方案呢?答案是肯定的。
我们的采集解决方案是在获得代理对象后,基于代理对象的类创建一个唯一的子类,继承自原类。在子类中重写-tableView:didSelectRowAtIndexPath:和-采集View:didSelectItemAtIndexPath:方法,然后将代理对象的isa指针指向新创建的子类。最后,只需要在代理对象释放时释放新创建的子类即可。能。
这样,单元格点击事件可以是采集,并且不交换点击方法,所以没有Method Swizzling相关的问题。
原则
钩子原理如图2-1所示。我们更改代理对象的isa指针后,当用户点击单元格时,系统会首先调用我们子类重写的-tableView:didSelectRowAtIndexPath:或-采集View:didSelectItemAtIndexPath:方法。此时可以执行事件采集,然后调用父类中的方法完成消息的转发。
图 2-1 代理对象的 isa 指针变化
完成
获取代理
由于获取代理对象只需要hook UITableView 和UI采集View - setDelegate: 方法,所以要hook的类是已知的,所以我们可以使用Method Swizzling:
SEL 选择器 = NSSelectorFromString(@"sensorsdata_setDelegate:");[UITableView sa_swizzleMethod:@selector(setDelegate:) withMethod:selector error:NULL];[UI采集View sa_swizzleMethod:@selector(setDelegate:) withMethod:selector error:NULL];
代理对象可以在-sensorsdata_setDelegate:方法中获取:
创建子类
动态创建子类需要使用runtime[2]的objc_allocateClassPair接口,定义如下:
OBJC_EXPORT Class _Nullableobjc_allocateClassPair(Class _Nullable superclass, const char * _Nonnull name,size_t extraBytes) OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
superclass:新子类要继承的类;
name:新子类的类名;
extraBytes:分配给 ivars 的额外字节数,通常为 0。
我们将它封装在一个工具类 SAClassHelper 中:
注意:我们不使用 NSObject 的 -class 方法来获取代理对象的 isa 指针,而是通过 runtime 的 object_getClass 接口,因为一个类可能会覆盖 -class 方法。
为了使新创建的子类与众不同、唯一,我们需要对新类的类名做一些处理。新类的类名格式如下:原类名递增值,含义如下:
原类名:为了在编译器调试时尽可能的显示原类信息,我们以原类名作为新类的类名开始;
增量值:为了使新创建的类的生命周期与对象的生命周期保持一致,我们需要保证每个新类都是唯一的,所以我们通过增加值来保证这一点;
Sensors Identification:用来标识这个类是由 Sensors 动态创建的。
覆盖方法
覆盖方法是向新创建的子类添加方法。add方法使用runtime的class_addMethod接口,定义如下:
OBJC_EXPORT BOOLclass_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp,const char * _Nullable types) OBJC_AVAILABLE(10.5, 2.0, 9.0, 1. 0, 2.0);
cls:方法要添加到哪个类;
名称:方法名称;
imp:方法实现;
types:方法参数和返回值类型。
同样,我们将其封装在一个工具类 SAMethodHelper 中:
由于我们需要采集单元格的点击事件,我们需要重写-tableView:didSelectRowAtIndexPath:和-采集View:didSelectItemAtIndexPath:两个方法:
[SAMethodHelper addInstanceMethodWithSelector:tablViewSelector fromClass:proxyClass toClass:dynamicClass];[SAMethodHelper addInstanceMethodWithSelector:采集ViewSelector fromClass:proxyClass toClass:dynamicClass];
click方法的实现,涉及到消息的发送,下面会详细讲解。
由于我们动态改变了代理对象的 isa 指针,但又想对原代码隐藏类,所以需要重写 -class 方法,返回原类:
[SAMethodHelper addInstanceMethodWithSelector:@selector(class) fromClass:proxyClass toClass:dynamicClass];
为了获取原类,需要在创建新的子类时记录原类名,所以我们通过关联属性将原类名信息绑定到代理对象:
静态 void const kSADelegateProxyClassName = (void )&kSADelegateProxyClassName; @interface NSObject (SACellClick) /// 用于在创建子类时记录原来的父类名 @property (nonatomic, copy, nullable) NSString sensorsdata_className; @end @implementation NSObject (SACellClick) - (NSString)sensorsdata_className { return objc_getAssociatedObject(self, kSADelegateProxyClassName);} - (void)setSensorsdata_className:(NSString *)sensorsdata_className { objc_setAssociatedObject(self, kSADelegateProxyClassName, sensorsdata_className, OBJC_ASSOCIATION_COPY);} @end
注册子类
通过 objc_allocateClassPair 接口创建的子类需要注册到 objc_registerClassPair:
OBJC_EXPORT void objc_registerClassPair(Class _Nonnull cls) OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
其中,cls是要注册的类。
设置伊萨
以上对子类的操作完成后,我们需要将代理对象的isa指针指向新创建的子类,即设置代理对象所属的类属于新创建的子类,这需要使用运行时的object_setClass接口:
OBJC_EXPORT Class _Nullableobject_setClass(id _Nullable obj, Class _Nonnull cls) OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
obj:要修改的对象;
cls:对象指向的类是一个指针。
自由子类
由于我们会在程序运行的过程中为每个代理对象创建子类,如果不释放,就会造成内存泄漏。
发布类需要使用运行时的 objc_disposeClassPair 接口:
OBJC_EXPORT voidobjc_disposeClassPair(Class _Nonnull cls) OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
其中,cls是要发布的类。
如上所述,我们为每个代理对象类创建了一个唯一的子类,所以代理对象释放后,我们新创建的子类就没有用了,此时可以释放子类。
通过运行时源码[3]我们可以发现,在对象释放的过程中,一个对象的关联对象的释放时机比较晚:
void *objc_destructInstance(id obj){ if (obj) {// 一次读取所有的 flags for performance.bool cxx = obj->hasCxxDtor();bool assoc = obj->hasAssociatedObjects();// 这个顺序是important.if (cxx) object_cxxDestruct(obj);if (assoc) _object_remove_assocations(obj);obj->clearDeallocating(); }返回对象;}
因此,我们可以通过在对象中添加关联对象来释放新创建的子类,并在关联对象释放时触发回调。
声明一个名为 SADelegateProxyParasite 的类,该类收录一个 deallocBlock 属性,在 dealloc 时调用该属性:
@interface SADelegateProxyParasite : NSObject @property (nonatomic, copy) void(^deallocBlock)(void); @end @implementation SADelegateProxyParasite - (void)dealloc { !self.deallocBlock ?: self.deallocBlock();} @end
为 NSObject 扩展一个监控对象释放的方法,并在内部持有一个 SADelegateProxyParasite 实例对象:
静态 void const kSADelegateProxyParasiteName = (void )&kSADelegateProxyParasiteName; @interface NSObject (SACellClick) @property (nonatomic, strong) SADelegateProxyParasite sensorsdata_parasite; @end @implementation NSObject (SACellClick) - (SADelegateProxyParasite)sensorsdata_parasite { return objc_getAssociatedObject(self, kSADelegateProxyParasiteName);} - (void)setSensorsdata_parasite:(SADelegateProxyParasite *)parasite { objc_setAssociatedObject(self, kSADelegateProxyParasiteName, parasite, OBJC_ASSOCIATION_RETAIN_NONATONAT) )sensorsdata_registerDeallocBlock:(void (^)(void))deallocBlock { if (!self.sensorsdata_parasite) {self. sensordata_parasite = [[SADelegateProxyParasite alloc] init];self.sensorsdata_parasite.deallocBlock = deallocBlock; }} @结尾
设置代理对象的isa指针后,注册*敏*感*词*器释放子类:
if ([SAClassHelper setObject:delegate toClass:dynamicClass]) { [delegate sensorsdata_registerDeallocBlock:^{dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{[SAClassHelper disposeClass:dynamicClass];}); }];}
消息发送
通过以上步骤,我们已经完成了对代理对象的钩子操作,接下来需要处理方法响应时的消息发送[4]。
由于 UITableView 和 UI采集View 相似,以下内容以 UITableView 为例进行说明。
当用户点击UITableViewCell时,系统会调用UITableView代理对象中的-tableView:didSelectRowAtIndexPath:方法。由于我们重写了这个方法,所以这个时候我们的方法会被调用,我们会向父类发送消息;
由于-tableView:didSelectRowAtIndexPath:方法定义在UITableViewDelegate协议中,不能被父类直接调用,所以我们通过调用父类的IMP来实现消息发送:
它分为以下几个步骤:
从父类中获取选择器的IMP并执行;
如果从父类获取的IMP为空,则父类可能是NSProxy相关的类。这时候我们使用_objc_msgForward进行消息转发(这个只兼容RxSwift,下一篇文章会解决这个问题)。优化逻辑);
事件 采集。
总结
我们完成了单元格单击事件的 采集 并通过在运行时对其进行子类化来管理其生命周期。但这仅在基本场景中满足 采集 。在实际使用场景中,我们会遇到各种意想不到的问题,下一篇文章会讲到。