更多>>关于我们

西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效绕过各种反采集策略。

您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。

数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。

更多>>官方微博

西安鲲之鹏
陕西 西安

加关注

  • 【经验分享】Linux server(headless模式)下Android模拟器的实现。

    现在越来越多的采集项目(采集APP数据)需要用到安卓模拟器了,然而市面上还没有支持Linux server(headless模式)下运行的安装模拟器,太遗憾了(因为公司大多数服务器都是Ubuntu server版本)。

    我们可以使用KVM + Android x86版系统来实现:

    1. 安装配置KVM。关于KVM在Ubuntu server下的安装配置步骤,详见我们去年的这篇文章:http://t.cn/EGdGjVE
    2. Android x86是支持运行于 x86 PC上的Android操作系统。下载Android X86 系统安装ISO文件,下载地址:https://osdn.net/projects/android-x86/releases,我测试的是android-x86-6.0-r3.iso。
    3. 创建KVM虚拟硬盘:
    qemu-img create -f qcow2 ./android60-1/android.img 10G
    PS:磁盘大小10GB,虚拟磁盘文件存储路径./android60-1/android.img(后面要用到)。
    4. 创建好网桥br0(直连主机外网,如附图1所示)。让虚拟机通过桥接模式上网,这样我们就可以很方便的从外网使用adb连接5555端口,进行远程控制。网桥的配置方法详见http://t.cn/EGdGjVE
    5. 启动KVM虚拟机,安装Android x86系统:
    qemu-system-x86_64 -enable-kvm -m 2048 -smp 4 -cdrom "android-x86-6.0-r3.iso"  -hda "./android60-1/android.img" -net nic,model=virtio,macaddr=00:16:3E:51:CC:10 -net bridge,br=br0  -vnc :2

    PS: 2048M内存,4核CPU,光驱链接系统安装镜像文件android-x86-6.0-r3.iso,指定虚拟机使用00:16:3E:51:CC:10这个MAC,使用网桥br0,指定VNC端口为5900 + 2 = 5902。

    执行上述命令之后,就可以通过VNC连接5902端口,进行系统安装了,安装过程很简单,跟其它Linux发行版安装过程类似:先是分区,格式化磁盘,然后写入文件,重启(如附图2所示)。
    6. 系统好之后,再次运行上述命令(注意要把-cdrom相关参数去掉,否则默认还会从光盘启动),首次进入系统,需要完成系统初始化配置。

    PS:需要注意的是,如果卡到WIFI配置那里了(提示无法连接网络,安装向导无法连接到谷歌,原因你懂的),可以先关掉网络,方法是按Alt + F1,进入安装命令行模式(可以ping www.baidu.com,发现网络其实是通着的),执行ifconfig eth0 down断掉网络(如附图3所示),然后再按Alt + F7恢复图形模式,继续完成向导即可。

    7. 配置好一个安卓虚拟机之后,我们可以直接通过复制多个虚拟磁盘文件android.img,启动多个安卓系统。注意:要指定不同的MAC地址,和不同的VNC端口。

    如附图4和5所示,我配置好一个虚拟机,安装上所需的各种APP之后,通过直接复制android.img,又启动了2个MAC地址不同的安卓模拟器。

    如附图6所示,通过adb远程连接上各安卓虚拟机(模拟器)。
    发布时间:2019-07-10 17:08:14
  • 【经验分享】美团外卖APP在siua头里隐藏了什么信息?
    1. 美团外卖发出的HTTP请求头里有个叫做siua的头(如图1所示),它是什么鬼?
    2.反编译APK,一路跟踪,找到了startCollection(),如图2所示。就是它了。
    3. 通过Xposed HOOK上述函数,成功获取到明文数据(如下所示)。也如图3所示。

    1.0}}MSM8974|Xiaomi|cancro_wc_lte|cancro|KTU84P|zh|CN|Xiaomi|MI 4LTE|4.4.4|19|release-keys|Xiaomi/cancro_wc_lte/cancro:4.4.4/KTU84P/99.12.4:user/release-keys|qcom|qh-miui-ota-bd58|user|cancro|armeabi-v7a|armeabi|cancro-user 4.4.4 KTU84P 99.12.4 release-keys|1|0|}}mtp,adb|mtp,adb|mtp,adb|MPSS.DI.3.0-525eb9a|Qualcomm RIL 1.0|wlan0|ABSENT||1|1|1|1|1|1|1|1|0|1|1|1}}ARMv7 Processor rev 1 (v7l)|Qualcomm MSM8974PRO-AC|4|Accelerometer|STMicroelectronics|Gravity|Qualcomm}}866500021425311|-|-|1920*1080|12GB|12GB|7c:1d:d9:76:af:f9||wifi}}-|0|-1.0|0|0||79d072a8-59fc-4ace-b45e-1b386d8de712}}0|0|0|-}}Android|com.sankuai.meituan.takeoutnew|5.12.3|19|-|2019-06-25 14:00:34:034}}0.0|0.0|KUNZHIPENG|0c:4b:54:da:bd:80|1|-46|-|-|-|}}

    我们来看看这里面包含有什么信息:
    手机品牌、型号、安卓版本号、IMEI码、WLAN的MAC地址、热点名称、热点的MAC地址(如图4所示,和路由器铭牌一致)、手机屏幕尺寸、存储空间...
    发布时间:2019-06-28 16:27:07
  • 【经验分享】如何快速从APK中获取AES秘钥和IV?
    (1)如图1所示,是通过脱壳和反编译获取到的,用时约1小时。
    (2)如图2所示,是使用Xposed + CryptoFucker勾出来的,用时10分钟。
    详细过程见 >>>  http://t.cn/Aip4E9KW ​​​​
    发布时间:2019-06-22 14:21:11
  • 【经验分享】如果动态修改Android设备的代理,如何程序化设置安卓设备的HTTP代理? >>> 详见 http://t.cn/Aip4HUaM ​​​​
    发布时间:2019-06-22 14:11:35
  • 【经验分享】美团外卖APP采集
    1. 如何根据poiId打开店铺详情页?
    adb shell am start -a android.intent.action.VIEW --el poiId 1000651254601802   -n com.sankuai.meituan.takeoutnew/.ui.poi.shop.RestaurantActivity
    效果如图1所示。

    2. 如何截获App返回的应答数据(JSON)?
    使用Xposed勾住parsejson()方法。
    效果如图2所示。
    发布时间:2019-06-20 14:03:02
  • 【经验分享】iostat -d -x -k 1查看某个硬盘的IO一直是100%,如何定位是哪个程序造成的呢? 使用sudo iotop -aoP命令即可,如图所示。 ​​​​
    发布时间:2019-05-29 18:38:49
  • 【经验分享】Apache2如何设置文件的Content-Type值?

    例如,我想给所有的*.pem证书文件,都设置Content-Type为"pplication/x-x509-ca-cert"。
    经查,可以使用ForceType指令,示例如下:

    <FilesMatch "\.pem$">
      ForceType application/x-x509-ca-cert
    </FilesMatch> ​​​​
    发布时间:2019-05-28 15:44:17
  • 【经验分享】如何使用adb检测系统是否安装了某个APP?
    如下所示,判断是否安装了抖音:
    adb shell pm list packages |grep com.ss.android.ugc.aweme ​​​​
    发布时间:2019-05-24 09:39:20
  • 【经验分享】如何破解叮当快药的签名算法? >>> http://t.cn/EoAltBU ​​​​
    发布时间:2019-05-05 17:11:14
  • 【经验分享】抖音的附近功能是根据什么定位的呢?(请求的参数中并没有找到经纬度相关的参数)  经过实测发现是根据IP地址定位的。用西安的代理IP返回的就是西安的,用苏州的代理IP返回就是苏州的,用宿迁的代理IP返回的就是宿迁的。如下截图所示。 ​​​​
    发布时间:2019-04-18 13:42:20
当前位置: 首页 > 技术文章 >
squid external_acl_type介绍及后台程序编写示例
发布时间:2016-10-17 来源:未知 浏览:

        近日我在查询Squid相关问题时无意在谷歌搜索结果中看到external_acl_type,然后详细了解了一下,发现它功能是在太强大了。
        利用external_acl_type可以自定义一种Squid的ACL类型,并且可以指定一个自定义的后端程序(Helper Program)。我们可以向这个后端程序动态传递很多有用的参数,例如客户端IP (%SRC,) 服务端IP( %MYADDR),客户端访问的URL( %PATH),访问者的用户名( %LOGIN)等变量,然后在认证程序中我们可以根据这些变量实现复杂的逻辑认证。PS:我在网上找了很久都没找到介绍这些变量参数含义的,最后抱着试一试的想法在squid.conf的注释中找到的详细的说明(如下FORMAT specifications部分)。

#  TAG: external_acl_type
#       This option defines external acl classes using a helper program
#       to look up the status
#
#         external_acl_type name [options] FORMAT.. /path/to/helper [helper arguments..]
#
#       Options:
#
#         ttl=n         TTL in seconds for cached results (defaults to 3600
#                       for 1 hour)
#         negative_ttl=n
#                       TTL for cached negative lookups (default same
#                       as ttl)
#         children-max=n
#                       Maximum number of acl helper processes spawned to service
#                       external acl lookups of this type. (default 20)
#         children-startup=n
#                       Minimum number of acl helper processes to spawn during
#                       startup and reconfigure to service external acl lookups
#                       of this type. (default 0)
#         children-idle=n
#                       Number of acl helper processes to keep ahead of traffic
#                       loads. Squid will spawn this many at once whenever load
#                       rises above the capabilities of existing processes.
#                       Up to the value of children-max. (default 1)
#         concurrency=n concurrency level per process. Only used with helpers
#                       capable of processing more than one query at a time.
#         cache=n       limit the result cache size, default is unbounded.
#         grace=n       Percentage remaining of TTL where a refresh of a
#                       cached entry should be initiated without needing to
#                       wait for a new reply. (default is for no grace period)
#         protocol=2.5  Compatibility mode for Squid-2.5 external acl helpers
#         ipv4 / ipv6   IP protocol used to communicate with this helper.
#                       The default is to auto-detect IPv6 and use it when available.
#
#       FORMAT specifications
#
#         %LOGIN        Authenticated user login name
#         %EXT_USER     Username from previous external acl
#         %EXT_LOG      Log details from previous external acl
#         %EXT_TAG      Tag from previous external acl
#         %IDENT        Ident user name
#         %SRC          Client IP
#         %SRCPORT      Client source port
#         %URI          Requested URI
#         %DST          Requested host
#         %PROTO        Requested protocol
#         %PORT         Requested port
#         %PATH         Requested URL path
#         %METHOD       Request method
#         %MYADDR       Squid interface address
#         %MYPORT       Squid http_port number
#         %PATH         Requested URL-path (including query-string if any)
#         %USER_CERT    SSL User certificate in PEM format
#         %USER_CERTCHAIN SSL User certificate chain in PEM format
#         %USER_CERT_xx SSL User certificate subject attribute xx
#         %USER_CA_xx   SSL User certificate issuer attribute xx
#
#         %>{Header}    HTTP request header "Header"
#         %>{Hdr:member}
#                       HTTP request header "Hdr" list member "member"
#         %>{Hdr:;member}
#                       HTTP request header list member using ; as
#                       list separator. ; can be any non-alphanumeric
#                       character.
#
#         %<{Header}    HTTP reply header "Header"
#         %<{Hdr:member}
#                       HTTP reply header "Hdr" list member "member"
#         %<{Hdr:;member}
#                       HTTP reply header list member using ; as
#                       list separator. ; can be any non-alphanumeric
#                       character.
#
#         %ACL          The name of the ACL being tested.
#         %DATA         The ACL arguments. If not used then any arguments
#                       is automatically added at the end of the line
#                       sent to the helper.
#                       NOTE: this will encode the arguments as one token,
#                       whereas the default will pass each separately.
#
#         %%            The percent sign. Useful for helpers which need
#                       an unchanging input format.
#
#       In addition to the above, any string specified in the referencing
#       acl will also be included in the helper request line, after the
#       specified formats (see the "acl external" directive)
#
#       The helper receives lines per the above format specification,
#       and returns lines starting with OK or ERR indicating the validity
#       of the request and optionally followed by additional keywords with
#       more details.
#
#       General result syntax:
#
#         OK/ERR keyword=value ...
#
#       Defined keywords:
#
#         user=         The users name (login)
#         password=     The users password (for login= cache_peer option)
#         message=      Message describing the reason. Available as %o
#                       in error pages
#         tag=          Apply a tag to a request (for both ERR and OK results)
#                       Only sets a tag, does not alter existing tags.
#         log=          String to be logged in access.log. Available as
#                       %ea in logformat specifications
#
#       If protocol=3.0 (the default) then URL escaping is used to protect
#       each value in both requests and responses.
#
#       If using protocol=2.5 then all values need to be enclosed in quotes
#       if they may contain whitespace, or the whitespace escaped using \.
#       And quotes or \ characters within the keyword value must be \ escaped.
#
#       When using the concurrency= option the protocol is changed by
#       introducing a query channel tag infront of the request/response.
#       The query channel tag is a number between 0 and concurrency-1.
#Default:
# none

配置示例:

        下面这个配置结合了“用户名密码认证(HTTP Basic Auth)”和“自定义的认证”。只有同时通过这两个认证的请求才会被Squid放行(否则会返回403)。

        external_acl_type自定义认证部分后端程序使用自己编写的Python脚本(后面有源码),并将%LOGIN(客户用户名),%SRC(客户端IP) ,%MYADDR(服务端IP)作为命令行参数传递给后端认证程序。

#用户名密码认证:
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/users.pwd
auth_param basic children 5
auth_param basic realm IPRENT.CN Proxy Auth Required
auth_param basic credentialsttl 2 hours
#使用external_acl_type实现的自定义认证,后台程序 /etc/squid/squid_external_acl_helper.py
#支持多种宏格式,上面帮助文档里面有列举。
#ipv4标记如果不加,可能会看到“external ACL 'ip_user_check' queue overload”异常(cache.log), >>> https://ubuntuforums.org/showthread.php?t=2187256
external_acl_type ip_user_check children-startup=5 ipv4 %LOGIN %SRC %MYADDR /usr/bin/python /etc/squid/squid_external_acl_helper.py

acl ipuseracl external ip_user_check
acl auth_users proxy_auth REQUIRED
http_access allow auth_users ipuseracl

后台程序(Helper program)示例脚本(Python):

这里只写了一个框架(直接返回验证通过),没有加入实际性的逻辑判断,你可以根据传递进来的参数实现复杂的逻辑判断。

# coding: utf-8
# squid_external_acl_helper.py
# Author: redice(qi@site-digger.com)
# Created at: 2016-10-14

# Python版本的Squid external_acl_type扩展ACL后台脚本
# 在squid.conf中的"htcp_access deny all"之前加入如下配置:
#external_acl_type ip_user_check children-startup=5 ipv4 %LOGIN %SRC %MYADDR /usr/bin/python /etc/squid/squid_external_acl_helper.py
#acl ipuseracl external ip_user_check
#http_access allow ipuseracl


import sys
import logging

# 记录日志
# sudo chmod 755 /var/log/squid/squid_auth_helper.log
# sudo chown proxy:proxy /var/log/squid/squid_auth_helper.log
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename='/var/log/squid/squid_auth_helper.log', filemode='a')


if __name__ == '__main__':
    while True:
        # 从stdin读取一行
        line = sys.stdin.readline()
        username, client_ip, local_ip = line.split()
        logging.info('New auth request: username = {}, client_ip = {}, local_ip = {}'.format(username, client_ip, local_ip))
        # 这里直接输出'OK'(通过认证,反之输出'ERR\n')。你可以根据上述参数实现复杂的认证逻辑。
        sys.stdout.write('OK\n')
        sys.stdout.flush()

日志输出示例:

2016-10-14 12:29:11,968 INFO New auth request: username = test, client_ip = 103.27.125.250, local_ip = 58.96.184.54

特别说明:该文章为鲲鹏数据原创文章 ,您除了可以发表评论外,还可以转载到别的网站,但是请保留源地址,谢谢!!(尊重他人劳动,我们共同努力)
☹ Disqus被Qiang了,之前的评论内容都没了。如果您有爬虫相关技术方面的问题,欢迎发到我们的问答平台:http://spider.site-digger.com/
QQ在线客服
欢迎咨询,点击这里给我发送消息。
欢迎咨询,点击这里给我发送消息。

加微信咨询