用aardio来做网络爬虫,一键打包成exe

前言

之前一直使用Python做爬虫,Python在爬虫方面的优势毋庸置疑。丰富的第三方库加上简洁的语法可以在写爬虫时提供天然的便利。

但是如果不是给企业写的爬虫,而是给个人用的一些减少工作量的工具,Python有一个很不方便的点:无法编译成可执行文件。用起来有门槛。

打包

虽然可以用打包工具(例如Nuitka和pyinstaller)来将Python打包成exe,但它其实就是给你带了一个Python环境,如果打包成整个exe的话,会将Python整个环境都打包到exe里,使用起来并不方便。

所以就有了这个想法:如果可以用aardio做爬虫的话,那么打包成exe不就很方便了,而且文件也小。如果你不想公开源代码的话,aardio编译之后也无法被还原,可以很好的保护源代码。

爬虫基础库

做爬虫必要的一些第三方库如下:

  • 请求相关: 比如http请求,websockets请求等
  • 采集框架:比如scrapy等
  • 解析相关:比如xpath、css选择器、正则表达式和json等
  • 加密相关:比如一些常用的加密算法,aes、des和rsa等
  • 自动化抓包:例如mitmproxy,用于自动化抓包采集
  • js引擎:比如pyexecjs,用于执行js代码
  • 浏览器自动化:比如selenium,用于操作浏览器来采集
  • 存储相关:一些常用数据库的操作
  • 验证码相关:识别字符、滑块、点选验证码等

aardio实现上面的功能

在aardio中,上面的很多功能库都没有,有的虽然有,但是并不好用。所以我打算重写一下库,给aardio适配这些功能。

目前已完成或待完成的库有:

  • kirequests: 重写inet.http,更符合Python requests库的编程风格
  • tslClient:封装go语言的tls-client,也是用于http请求,支持http2.0和tls指纹
  • goquery:封装go语言的goquery,用于css选择器解析html
  • htmlquery:封装go语言的htmlquery,用于xpath解析html
  • kichardet:封装C++的uchardet,可以自动识别给定字符串的编码
  • kisunny:封装sunny,类似mitmproxy
  • kicrypt(待完成):实现一些常见的加密算法,例如aes和des,其他的算法aardio里都有
  • ChakraCore(待完成): 用于执行js代码的引擎,微软开源的
  • drissionpage(待完成):我也想用aardio实现Python的drissionpage库,本质上就是cdp协议。可以用于浏览器模拟自动化。更强大的自动化工具还得是playwright和puppeteer
  • ddddocr(待完成):封装Python的ddddocr做验证码识别
  • 采集框架(不完成):采集框架暂不在计划内,因为我没打算做一个类似八爪鱼的东西,只是想做些小工具而已。平常的http请求库足够用了。正式给公司做采集肯定还是用Python

一些常见的数据库操作在aardio中基本都有,遇到没有的再封装。其实如果遇到在aardio中没有的,可以看看C++、go有没有实现,然后封装成dll就能在aardio中使用。

库的代码更新:https://github.com/kanadeblisst00/aardio-extlibs

实战

目前在计划的内容有:

  • 导出自己的公众号粉丝列表
  • 采集公众号历史文章,并保存为mhtml和PDF文件
  • 采集一些短视频平台的数据,比如b站、抖音等。这个可能得等我开始玩对话模型的时候再写,那个时候会需要对话的数据来训练模型,可以从这些平台采集评论来做数据集
  • 一些练习网站
  • 一些课程里的网站。玩了太久的微信逆向,js逆向基本忘的差不多了。最近重新看看一些js逆向课程,有兴趣的可以b站搜志远一期二期

kirequests

先说一下 kirequests的一些基本用法:

  1. GET请求
var resp = kirequests.get("https://www.httpbin.org/get",{"a":1,"b":2})
console.dump(resp.status)
console.dump(resp.text)
console.dump(resp.json())
  1. 自定义请求头
var resp = kirequests.get("https://www.httpbin.org/get",{"a":1,"b":2},{"User-Agent""aardio"})
console.dump(resp.status)
console.dump(resp.text)
console.dump(resp.json())
  1. 禁止重定向
var params = {"url""https://www.baidu.com"}
// 注入关键词参数和位置参数不能混用
var resp = kirequests.get(url="https://www.httpbin.org/redirect-to",params=params,redirect=false)
// 这样写也可以
//var resp = kirequests.get("https://www.httpbin.org/redirect-to",params,,false)
  1. 基础http验证
var resp = kirequests.get(url="https://www.httpbin.org/basic-auth/root/123456",auth={"root";"123456"})
  1. post表单数据
var resp = kirequests.post(url="https://www.httpbin.org/post",data={"a":1,"b":2})
  1. post json数据
var resp = kirequests.post(url="https://www.httpbin.org/post",json={"a":1,"b":2})
// 这样也可以
import web.json;
var postData = web.json.stringify({"a":1,"b":2})
var resp = kirequests.post(url="https://www.httpbin.org/post",data=postData)
  1. 使用代理 (只支持http代理)
import kirequests.session;
var ses = kirequests.session(,"http://root:123456@127.0.0.1:10809",)
var resp = ses.get("https://www.httpbin.org/get")
  1. 自定义cookies
import kirequests.session;
var cookies = {
 {"name":"a","value":"a","domain":".httpbin.org"};
 {"name":"b","value":"b","domain":"www.httpbin.org"}
 {"name":"c","value":"c","domain":".httpbin.org"}
 {"name":"d","value":"d","domain":"www.httpbin.org"}
}
var ses = kirequests.session(,,cookies)
var resp = ses.get("https://www.httpbin.org/get")
  1. 设置超时时间(连接超时,发送超时,接收超时),单位毫秒
import kirequests.session;
var ses = kirequests.session()
ses.setTimeouts(2000,2000,2000)
var resp = ses.get("https://www.httpbin.org/get")

静态网页

网站:https://ssr3.scrape.center/

import console
import kirequests
import htmlquery;
io.open()

resp = kirequests.get(url="https://ssr3.scrape.center/",auth={"admin","admin"})

var html = resp.text;
var doc = htmlquery.Parse(html)
var nodeList = htmlquery.Find(doc, '//div[@class="el-card item m-t is-hover-shadow"]')
for i,node in nodeList{
 var h2Node = htmlquery.FindOne(node, './/h2');
 var title = htmlquery.InnerText(h2Node)
 var tagNodeList = htmlquery.Find(node, './/button');
 var tags = {}
 for i,tagNode in tagNodeList{
  var tag = htmlquery.InnerText(tagNode);
  table.push(tags, string.trim(tag));
 }
 var infoNodeList = htmlquery.Find(node, './/div[@class="m-v-sm info"]/span');
 var infos = {};
 for i,infoNode in infoNodeList{
  var info = htmlquery.InnerText(infoNode);
  table.push(infos, string.trim(info));
 }
 var scoreNode = htmlquery.FindOne(node, './/p[@class="score m-t-md m-b-n-sm"]')
 var score = htmlquery.InnerText(scoreNode);
 console.log("title: ", title)
 console.log("tags: ", string.join(tags," "))
 console.log("infos: ", string.join(infos," "))
 console.log("score: ", string.trim(score))
 console.log()
}
console.pause(true);

输出如图:

用aardio来做网络爬虫,一键打包成exe

ajax加载的网页

网站:https://spa2.scrape.center/

import console
import crypt;
import kirequests;
import goquery;
import crypt.bin;

io.open()
url = "https://spa2.scrape.center/api/movie/"
var page = 1;
var limit = 10;
var params = {
 "limit":limit,
 "offset": (page-1)*10
}
var t = tostring(tonumber(time()));
var r = {"/api/movie";tostring((page-1)*limit);t}
var o = crypt.sha1(string.join(r,","),false)
var c = crypt.bin.encodeBase64(string.join({o;t},","))
params["token"] = c
var resp = kirequests.get(url,params)
var datas = resp.json()

console.dump(datas );
console.pause(true);


原文始发于微信公众号(Python成长路):用aardio来做网络爬虫,一键打包成exe

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/284456.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!