更多>>关于我们
西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效获取互联网任何公开可见信息。
您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。
数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。
更多>>技术文章
-
西安鲲之鹏
发布时间:2022-11-02 11:14:38
【经验分享】apache mod_proxy实现url转发时如何避免后端域名的DNS缓存
方法如下示例,加项disablereuse=On配置项即可:
ProxyPass / http://后端域名/ retry=0 disablereuse=On
关于disablereuse参数mod_proxy文档(https://httpd.apache.org/docs/2.4/mod/mod_proxy.html)有说明:
This parameter should be used when you want to force mod_proxy to immediately close a connection to the backend after being used, and thus, disable its persistent connection and pool for that backend. This helps in various situations where a firewall between Apache httpd and the backend server (regardless of protocol) tends to silently drop connections or when backends themselves may be under round- robin DNS. When connection reuse is enabled each backend domain is resolved (with a DNS query) only once per child process and cached for all further connections until the child is recycled. To disable connection reuse, set this property value to On. -
西安鲲之鹏
发布时间:2022-11-01 21:16:59
【经验分享】ttyd - Share your terminal over the web
ttyd是一款能将Linux/Andorid/Windows终端以Web形式展现的命令行工具,用法简单但功能强大。项目主页是:github.com/tsl0922/ttyd。
releases里有编译好的二进制程序,直接下载系统对应版本即可使用,无需安装。
用法举例:
Linux:执行"ttyd login"即可,支持系统账号登录认证。更高级的用法可以参考这里github.com/tsl0922/ttyd/wiki/Example-Usage。效果如附图1所示。
Andorid:执行"ttyd bash"即可。效果如附图2所示。
Windows:执行"ttyd cmd"即可。效果如附图3所示。
在Linux上如何ttyd配置为服务?
参见:github.com/tsl0922/ttyd/wiki/Systemd-service#systemd-service-on-linux
-
西安鲲之鹏
发布时间:2022-10-29 12:48:45
【经验分享】proxychains Windows版
借助proxychains可以让不支持代理的程序强制走代理,proxychains-windows是其Windows版本,项目主页:github.com/shunf4/proxychains-windows。
其原理是Hook方式实现:通过劫持connect, WSAConnect, ConnectEx, GetAddrInfoW等函数调用。
直接从releases里下载编译好的二进制版本,修改配置文件后即可使用。
配置文件放置于:%USERPROFILE%\.proxychains\proxychains.conf。
用法示例:
proxychains curl http://httpbin.org/ip
proxychains "C:\Program Files\Mozilla Firefox\firefox.exe"
-
西安鲲之鹏
发布时间:2022-10-29 09:05:44
【经验分享】如何adb连接远程的安卓设备?
方法一:直接远程连接。
(1)在安卓设备上开启网络ADB(即adb over TCP/IP)。可以使用"ADB Manager"这个APP,如附图1所示。adbd默认监听设备上的5555端口。
(2)然后通过路由器端口映射或者frp内网穿透,将设备的5555端口暴露出来。
(3)最后在本地使用“adb connect 远程IP:远程端口”即可连接。
这个方法的缺点是不安全,任何人都能连接。
方法二:通过ssh隧道中转连接。
将安卓设备连接在一台Linux机器上,然后本地通过ssh隧道安全地和设备建立连接。
首先看一下adb的工作原理,如附图2所示,"adb server"位于主控端(PC),“adbd后台进程”位于安卓设备上。"adb server"和“adbd"通过USB或者TCP通信。"adb server"监听TCP 5037端口,"adb客户端"通过该端口与其进行数据交互:执行命令、获取命令执行结果。
知道原理后实现起来就不难了:对于"adb客户端"来说,它默认是通过TCP://127.0.0.1:5037来连接"adb server",我们只要把远程的5037端口映射到本地,本地的"adb客户端"就能连接上远程的"adb server"(就和连接本机的"adb server"一样)。
具体实现思路如下:
(1)将所有需要访问的安卓设备连接到一台Linux机器上,这台机器可以被远程ssh访问。确保在Linux上"adb devices"能够正常看到设备。
(2)使用ssh本地端口映射,将Linux机器的5037映射到本地,例如
ssh -L 5037:127.0.0.1:5037 user@host
(3)然后在本地执行"adb devices"就能看到和远程Linux上一样的设备列表,如附图3所示。注意:本地的adb版本要和远程Linux上的adb server版本一致,否则会出错。之后的操作就和使用本地的adb连接一样了。
(4)这种模式下,如何使用scrcpy远程控制设备呢?
通过上面操作我们已经成功建立了adb远程连接,但是使用scrcpy的时候会发现无法显示出设备图像,提示“connect: No error”错误。这是因为scrcpy在工作的时候需要用到27183端口(scrcpy-server会监听该端口,scrcpy客户端通过这个端口和服务端进行通信),我们还需要将这个端口也从远程映射到本地来(详见scrcpy的官方文档),命令如下:
ssh -L 27183:127.0.0.1:27183 user@host
如此scrcpy就能正常工作了,如附图4所示。
-
西安鲲之鹏
发布时间:2022-08-27 13:06:25
【经验分享】编译Haproxy时加入Lua支持。
Lua是一种嵌入式编程语言,HAProxy支持通过Lua脚本实现更过强大的功能。按如下步骤操作,可以给Haproxy加入Lua支持。
(1)先编译Lua。
从官方下载Lua源码(https://www.lua.org/start.html),进入src目录,make linux即可。将编译生成lua可执行文件lua和luac。记下lua可执行文件所在路径,例如/home/qi/haproxy_backconnect_proxies/lua-5.3.6/src 。
编译时如果出现"lua.c:82:31: fatal error: readline/readline.h: 没有那个文件或目录"问题,请先安装"sudo apt-get install -y libreadline-dev”(Ubuntu下)。
(2)编译Haproxy。
从官方下载源码,编译时加入USE_LUA=1选项,并制定lua可执行文件所在路径,完整如下:
make TARGET=generic USE_DL=1 USE_CRYPT_H=1 USE_LUA=1 LUA_INC=/home/qi/haproxy_backconnect_proxies/lua-5.3.6/src LUA_LIB=/home/qi/haproxy_backconnect_proxies/lua-5.3.6/src
另外Lua默认会从/usr/local/share/lua/5.3/下寻找库文件,如果从网上下载的第三方库库例如json.lua,将放置于该目录下。 -
西安鲲之鹏
发布时间:2022-08-27 10:31:21
【经验分享】如何让Linux系统预留指定端口,防止被自动分配机制拿走(占用)。
背景:系统上开启了很多网络服务,重启某个业务时经常出现端口被占用的情况。
解决方法:
以Ubuntu 16.04为例,编辑 /etc/sysctl.conf,加入如下配置行:
net.ipv4.ip_local_reserved_ports=6666,7777,8888,9999,54001-54100
保存,然后执行sudo sysctl -p生效。
这里的"6666,7777,8888,9999,54001-54100"为预留端口。经过这样设置后,这些端口就不会被系统自动分配给connect()和bind() 端口0的程序。 -
西安鲲之鹏
发布时间:2022-08-13 12:05:20
【经验分享】JSON序列化Python字典遇到datetime出现“TypeError: datetime****** is not JSON serializable”问题的解决
例如,json.dumps({'datetime': datetime.now()}),会抛出如附图1的异常。
解决方案:
json.dumps()提供了一个default参数,用于在遇到无法序列化的类型时进行自定义的处理。如下示例用来处理datetime和date类型的数据。
def json_serial(obj):
"""JSON serializer for objects not serializable by default json code"""
if isinstance(obj, (datetime, date)):
return obj.isoformat()
raise TypeError ("Type %s not serializable" % type(obj))
>>> json.dumps({'datetime': datetime.now()}, default=json_serial)
'{"datetime": "2022-08-13T12:02:54.551000"}'
-
西安鲲之鹏
发布时间:2022-08-10 11:05:15
【经验分享】playwright/selenium绕过反自动化/爬虫检测最新方案
原理:是通过在页面加载之前注入js脚本,抹去navigator.webdriver等浏览器自动化特征。
使用的这个js脚本(stealth.min.js)来源于Github上的puppeteer-extra-plugin-stealth项目(A plugin for puppeteer-extra and playwright-extra to prevent detection.)。
playwright的示例:
context.add_init_script(path='stealth.min.js')
page = context.new_page()
page.goto("https://bot.sannysoft.com/")
selenium的示例:
driver = webdriver.Chrome()
with open('stealth.min.js', 'r') as f:
js = f.read()
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': js})
效果检验:
1. 第一个检验标准,是看是否还会爆出navigator.webdriver等特征,可以直接在控制台查看,也可以通过访问https://bot.sannysoft.com/来查看。例如附图1是未做绕过处理时的截图。
2. 第二个检验标准,是尝试登录淘宝,看能否成功。如果未做绕过处理,会出现滑块验证码,而且是无法正常处理的那种,无法登录成功。如附图2所示。
经过测试,上述两项检验标准均通过:即没有爆出navigator.webdriver等特征,也可以成功登录淘宝,不出现滑块验证码。
另附stealth.min.js的下载地址:
http://www.site-digger.com/uploads/stealth.min.js
-
西安鲲之鹏
发布时间:2022-08-10 10:26:30
【经验分享】miller以XTAB格式查看字段内容较多或者字段较多的CSV文件
示例:mlr --icsv --oxtab --from mouser_products_202208.csv head -n 3
官方文档:https://miller.readthedocs.io/en/latest/file-formats/#xtab-vertical-tabular
效果如附图所示。
-
西安鲲之鹏
发布时间:2022-08-02 12:34:26
【分享】"CZ88纯真IP库20220420版" - MySQL版(52万条)免费下载
数据说明:
基于”QQ纯真IP库20220420版”转换的MySQL版本,共计529,985条。添加的数字格式的IP段起始和终止字段,可以通过该数据快速查询出某IP的归属国家、位置信息。
字段说明:
`ip_start_num` – 起始IP,数字类型(根据ip_start转换)
`ip_end_num` – 终止IP,数字类型(根据ip_end转换)
`ip_start` – 起始IP,字符串类型
`ip_end` – 终止IP,字符串类型
`country` – 所属国家
`location` – 所在位置
用法举例:
(1)先将待查询IP转为数字类型。例如:
ip_num = struct.unpack(‘!I’, socket.inet_aton(ip))[0]
(2)查询”ip_start_num <= ip_num and ip_end_num >= ip_num”的记录,例如SQL语句:
sql = ‘SELECT country FROM ips WHERE ip_start_num <= %s AND ip_end_num >= %s;’.format(ip_num, ip_num)
示例数据:
http://db.site-digger.com/csv/637a38385f6970735f32303232303432305f73616d706c65/
下载链接:
http://www.data-shop.net/2014/08/cz88-free-ips-database-20220420-mysql-version-52w/
应用举例:
如附图2所示,是使用该数据实现的IP地址归属地查询API。
-
西安鲲之鹏
发布时间:2022-06-23 10:58:25
【经验分享】一例Squid http认证异常问题的排查
背景:
(1)Squid配置的HTTP代理。使用external_acl_type自定义acl脚本进行ip和用户名密码认证,acl通过的放行,否则deny。
(2)Playwright设置带用户名密码认证的http代理(上述Squid)代理。
问题:
curl命令或者requests库测试均工作正常,但是Playwright始终报 NS_ERROR_PROXY_FORBIDDEN错误。
排查:
用curl -v命令测试用户名密码不对或者为空情况下squid的返回,如下图所示,返回的是403状态码。意识到问题的所在了,对于浏览器来说,只有当服务端返回407状态码时,才会启用HTTP Proxy Basic Auth认证。此时返回403直接中断了后续认证流程。
解决:
自定义的external_acl_type之后,在http_access deny all之前,加入acl auth_user,让其在external_acl_type的ACL匹配失败的情况下能够返回407状态码。
延伸:
如何让“浏览器一开始就带上Proxy-Authorization头,这样就能直接通过认证,减少一次407的返回,提高效率。就像request库一样”? 经过测试发现使用一些代理插件,例如SwitchyOmega,可以实现。