更多>>关于我们

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

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

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

更多>>官方微博

西安鲲之鹏
陕西 西安

加关注

  • 【经验分享】关于彻底关闭Nox模拟器虚拟机
    背景: 命令行关闭Nox虚拟机可以使用"NoxConsole.exe quit <-name:nox_name | -index:nox_index>", 但是有时候会失败。
    这里采用一种保险的思路,先调用"NoxConsole.exe quit"进行安全关闭,若干秒后检测虚拟机对应虚拟机的Nox.exe进程(考虑到多开的情况,根据"-clone:"参数判断是否属于当前虚拟机实例)和NoxVMHandle.exe进程(考虑到多开的情况,根据"--comment"参数判断是否属于当前虚拟机实例)是否还存在,如果存在就强制终止这两个进程,达到彻底关闭的目的。

    完整实现如下图所示。
    发布时间:2021-11-02 10:16:20
  • 【经验分享】如何计算阿里系Ajax请求中的sign签名?
    有过阿里系采集经验的开发者都应该知道,淘宝(天猫)H5版、1688、淘宝司法拍卖H5版等阿里系网站,在Ajax请求中都会有一个sign签名参数(如下图1、2、3所示),要是值不正确将无法获取到有效的数据(例如返回“非法请求”提示)。如果我们无法构造出有效的sign,就只能通过“模拟浏览器操作”的方式来绕过签名验证,再结合"mitmproxy动态抓包脚本"来提取返回数据,这种方案效率太低,而且很不灵活。本文将介绍如何计算这个sign值以及给出对应的Python实现,这样就能实现通过直接HTTP交互抓取数据。点击链接查看详情>>> http://www.site-digger.com/html/articles/20211018/851.html
    发布时间:2021-10-18 14:59:23
  • 【经验分享】mysqldump时的两点技巧
    (1)如何避免锁表?
    加上--single-transaction=TRUE参数即可。
    来源:https://stackoverflow.com/questions/104612/run-mysqldump-without-locking-tables
    (2)如何排除某张表?例如 避免导出尺寸太大的日志表。
    使用--ignore-table=dbname.tablename指定即可,如果要排除多个,加上多个--ignore-table=dbname.tablename参数。
    来源:https://www.cnblogs.com/rxbook/p/7735485.html
    发布时间:2021-10-09 11:40:29
  • 【经验分析】urllib2使用"User-Agent"设置UA会无效原因的分析

    (1)如下代码,尝试使用"User-Agent"设置UA为"test",会失败:
    服务端接收到的UA信息为"Python-urllib/2.7",而不是"test"。
    urllib2.build_opener().open(urllib2.Request(url='http://192.168.1.200:1234', data=None, headers={'User-Agent': 'test'}))
    (2)将headers修改为{'User-agent': 'test'},成功。
    如附图1所示。原因是什么呢?

    可以在urllib2.py中找到答案:
    (1)首先urllib2默认会在headers列表中添加一个“User-agent”,其值为"Python-urllib/%s" % __version__,如附图2所示。
    (2)在do_open()中对headers进行了规范化处理(.title()),代码如下。
    headers = dict((name.title(), val) for name, val in headers.items())
    如图3所示,我们在该句前后分别打印headers,处理之前为:
    {'Host': '192.168.1.200:1234', 'User-Agent': 'test', 'Connection': 'close', 'User-agent': 'Python-urllib/2.7'},里面有我们设置的'User-Agent': 'test'
    处理之后就变成下面了:
    {'Host': '192.168.1.200:1234', 'Connection': 'close', 'User-Agent': 'Python-urllib/2.7'}
    原因是后面的'User-agent'经过.title()后也会变'User-Agent',在字典中覆盖掉了我们自定义的值。

    以后使用urllib2要设置UA时,一定要用“User-agent”,而不能用“User-Agent”!
    发布时间:2021-08-15 13:48:07
  • 【经验分享】在分析别人代码的时候,通过打印调用栈可以帮助我们快速掌握调用函数的上下文调用逻辑。Python中如何打印调用栈呢?如下。
    import traceback
    traceback.print_stack()
    参考>>> https://stackoverflow.com/questions/1156023/print-current-call-stack-from-a-method-in-python-code
    例如,我们想知道httplib.py中_send_request()函数的调用上下文,在_send_request()中加入上述代码,当代码执行的时候就会在控制台打印出调用栈信息,如附图所示。
    发布时间:2021-08-15 13:17:33
  • 【经验分享】如何给python函数增加一个timeout功能?
    想要实现的效果:
    在调用一个函数(不固定)的时候如果在指定的N秒内没有返回,就强制停止。

    在github上找到了一些方案例如func_timeout,timeout_decorator。经过测试对比,func_timeout比较理想,项目主页:github.com/kata198/func_timeout,“Python module to support running any existing function with a given timeout.”。它提供了一个装饰器func_set_timeout,非常方便。

    timeout_decorator原理:
    它是利用子线程StoppableThread来执行目标函数,当指定时间到达,子线程还未结束,就强制结束子线程,然后抛出FunctionTimedOut异常,详见github.com/kata198/func_timeout/blob/master/func_timeout/dafunc.py。
    发布时间:2021-06-24 14:11:26
  • 【演示】得物APP商品"最近购买列表"采集演示
    (1)根据商品的spuid从APP端采集。
    (2)得物的“最近购买”列表展示了最近3个月的销售记录,可以借以分析商品的价格和销量波动情况。包括字段“昵称、日期、规格、价格”,采集好的示例数据见:http://db.site-digger.com/csv/646577755f6170705f70726f647563745f6c6173745f736f6c645f6c6973745f73616d706c65/ 点击查看西安鲲之鹏的微博视频 ​​​
    发布时间:2021-06-24 13:17:22
  • 【演示】某小红书APP笔记详情及评论数据采集最新(20210618)演示
    近日某小红书的网页版不再展示笔记的“点赞数、评论数、收藏数和分享数”了,为了能拿到这些信息只能从APP端入手。本采集方案可以拿到笔记的所有属性值以及前10条评论数据。

    (1)笔记详情包含的字段
    'note_id'(笔记ID), 'note_type'(笔记类型,是普通的还是视频), 'user_red_id'(用户ID), 'user_name'(用户名), 'liked_count'(点赞数), 'shared_count'(分享数), 'collected_count'(收藏数), 'comments_count'(评论数), 'pubtime'(笔记发布时间), 'hash_tags'(标签), 'images_list'(原图列表), 'video'(视频链接,如果是视频笔记), 'desc'(笔记内容)
    示例数据链接:点击查看"小红书笔记示例数据"

    (2)笔记评论包含的字段
    'comment_id'(评论), 'note_id'(关联的笔记ID), 'user_name'(用户名), 'pubtime'(评论发布时间), 'like_count'(评论点赞数), 'score'(评分), 'content'(评论内容), 'sub_comment_count'(评论回复数), 'sub_comments'(评论回复内容)
    示例数据链接:点击查看小红书评论示例数据

    某小红书APP笔记详情及评论数据采集最新(20210618)演示

    发布时间:2021-06-18 14:30:34
  • 【经验分享】某特来电APP采集方案
    我们分析的是V5.11.0版本,加了360的壳,用了ssl证书固定。
    (1)经过ssl unpinning之后,Fiddler成功抓到包,如图1-3所示,分别对应“充电站搜索返回的列表”,“充电站详情”和“充电站的终端列表”。可以看到请求头中有很多陌生的参数,例如AVER,它是怎么构造出来的?
    (2)脱壳,反编译找到了实现过程代码,如图4所示。可以看出AVER是通过对时间戳参数ATS,经过"DES/CBC/PKCS7Padding"加密而成。其它参数在代码中也都能找到实现过程。其中"X-Token"的产生过程比较复杂,后面再分享产生过程。
    发布时间:2021-06-08 12:10:34
  • 【经验分享】com.google.gson.Gson的toJson()方法在插桩分析的时候太有用了,赞赞赞。
    function toJson(javaObject) {
        return Java.use("com.google.gson.Gson").$new().toJson(javaObject);
    };
    通过toJson(javaObject)可以将Java对象(数据结构)转换成JSON格式,非常方便。想想之前都是通过字符串拼接各个字段(熟悉)值,太费劲儿了。

    关于com.google.gson.Gson的toJson()的更多示例可以看这篇文章:https://www.cnblogs.com/reboost/p/9521603.html
    发布时间:2021-06-04 10:57:34
当前位置: 首页 > 公司微博 >
  • 西安鲲之鹏

    发布时间:2020-01-12 10:05:12
    【经验分享】qemu-system-x86_64使用网桥出现
    failed to parse default acl file `/etc/qemu/bridge.conf`
    qemu-system-x86_64: -net bridge,br=br0: bridge helper failed
    问题(如附图1所示)的解决方法:

    原因是缺少/etc/qemu/bridge.conf文件。

    (1) mkdir /etc/qemu
    (2) echo 'allow br0' > /etc/qemu/bridge.conf

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2020-01-10 15:15:48
    【开源分享】发布一款Android X86虚拟定位的App,支持命令行设置经纬度参数,无需UI操作,专为安卓App自动化模拟操作设计。

    用法举例:

    # 切换定位到"秦始皇陵"(34.384225, 109.254423)  
    adb shell am start -n cn.webscraping.qi.mocklocation/cn.webscraping.qi.mocklocation.MainActivity --es lat 34.384225 --es lng 109.254423  

    详细介绍见 >>> http://t.cn/AisHGPoY

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2020-01-02 15:20:22
    【经验分享】Chrome + Remote Debugging模式(注意:不是Selenium + Chromedriver模式)登录淘宝出现“验证码爆错”(如附图所示)。原因Chrome V79版本在Remote Debugging模式时会爆出navigator.webdriver属性,从而被风控。换用V72或V73版本可以顺利登录!(前一条微博也说得是这个事儿) ​​​​

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-31 18:03:03
    【经验分享】不经意见发现Chrome v73版本在Remote Debugging模式下(注意:不是Selenium + Chromedriver模式)不会暴露出navigator.webdriver!如附图1所示。

    作为对比,我又测试了其它的版本:
    (1)如图2所示,是Chrome V63版本,在Remote Debugging模式下会暴露出navigator.webdriver;
    (2)如图3所示,是Chrome V79版本,在Remote Debugging模式下也会暴露出navigator.webdriver;

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-31 11:11:58
    【Mark收藏】MurmurHash3.js - A javascript implementation of MurmurHash3's hashing algorithms.    >>>  http://t.cn/z8Yont3

    Usage
    // Return a 32bit hash as a unsigned int:
    > murmurHash3.x86.hash32("I will not buy this record, it is scratched.")
      2832214938

    // Return a 128bit hash as a unsigned hex:
    > murmurHash3.x86.hash128("I will not buy this tobacconist's, it is scratched.")
      "9b5b7ba2ef3f7866889adeaf00f3f98e"
    > murmurHash3.x64.hash128("I will not buy this tobacconist's, it is scratched.")
      "d30654abbd8227e367d73523f0079673"

    // Specify a seed (defaults to 0):
    > murmurHash3.x86.hash32("My hovercraft is full of eels.", 25)
      2520298415

    // Rebind murmurHash3:
    > somethingCompletelyDifferent = murmurHash3.noConflict()
    > murmurHash3
      undefined
    > somethingCompletelyDifferent.version
      "2.1.2"

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-31 09:55:51
    "浏览器指纹"之 "HTML5 Canvas指纹"

    【原理】
    在HTML5中可以使用JS + Canvas标签生成图片,利用"canvas.toDataURL()"可以获取到图片的Base64码。
    同样的JS Canvas绘图代码,在同一个浏览器下生成的图片是相同的(字节码相同)。
    但是由于系统的差别、渲染引擎的不同,同样的JS Canvas绘图代码,在不同的浏览器下得到的图片也是不同的(字节码不同。注意:也有相同的可能,但是概率较小)。
    利用上述原理,同一段JS Canvas绘图代码,返回生成图片的HASH值作为“HTML5 Canvas指纹”。

    【在线测试工具】
    http://t.cn/R3259jj
    如附图1所示,我的谷歌浏览器的“HTML5 Canvas指纹”在49w个相同UA的浏览器中,仅有1456个相同的,唯一性高达99.71%。

    【"HTML5 Canvas指纹算法"示例代码】
    // 计算字符串的hash值
    // 摘自http://t.cn/AiFHoZGI
    function hashstr(s){
    var hash = 0;
    if (s.length == 0) return hash;
    for (i = 0; i < s.length; i++) {
      char = s.charCodeAt(i);
      hash = ((hash<<5)-hash)+char;
      hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
    }

    // 使用canvas绘图,并返回图片的Base64码对应的hash值
    // 摘自http://t.cn/AiFHoZGV
    function getCanvasFp() {
        var result = "";
        // Very simple now, need to make it more complex (geo shapes etc)
        var canvas = document.createElement('canvas');
        canvas.width = 2000;
        canvas.height = 200;
        canvas.style.display = 'inline';
        var ctx = canvas.getContext('2d');
        // detect browser support of canvas winding
        // http://t.cn/R7wzrRy
        // http://t.cn/AiFHoZG5
        ctx.rect(0, 0, 10, 10);
        ctx.rect(2, 2, 6, 6);
        result += 'canvas winding:' + ((ctx.isPointInPath(5, 5, 'evenodd') === false) ? 'yes' : 'no');

        ctx.textBaseline = 'alphabetic';
        ctx.fillStyle = '#f60';
        ctx.fillRect(125, 1, 62, 20);
        ctx.fillStyle = '#
    069';
        // http://t.cn/AiFHoZGx
        ctx.font = '11pt no-real-font-123';

        ctx.fillText('Cwm fjordbank glyphs vext quiz, \ud83d\ude03', 2, 15);
        ctx.fillStyle = 'rgba(102, 204, 0, 0.2)';
        ctx.font = '18pt Arial';
        ctx.fillText('Cwm fjordbank glyphs vext quiz, \ud83d\ude03', 4, 45);

        // canvas blending
        // http://t.cn/AiFHoZGt
        // http://t.cn/AiFHoZGM
        ctx.globalCompositeOperation = 'multiply';
        ctx.fillStyle = 'rgb(255,0,255)';
        ctx.beginPath();
        ctx.arc(50, 50, 50, 0, Math.PI * 2, true);
        ctx.closePath();
        ctx.fill();
        ctx.fillStyle = 'rgb(0,255,255)';
        ctx.beginPath();
        ctx.arc(100, 50, 50, 0, Math.PI * 2, true);
        ctx.closePath();
        ctx.fill();
        ctx.fillStyle = 'rgb(255,255,0)';
        ctx.beginPath();
        ctx.arc(75, 100, 50, 0, Math.PI * 2, true);
        ctx.closePath();
        ctx.fill();
        ctx.fillStyle = 'rgb(255,0,255)';
        // canvas winding
        // http://t.cn/R7wzrRy
        // http://t.cn/AiFHoZGf
        ctx.arc(75, 75, 75, 0, Math.PI * 2, true);
        ctx.arc(75, 75, 25, 0, Math.PI * 2, true);
        ctx.fill('evenodd');

        if (canvas.toDataURL) {
            result += ';canvas fp:' + canvas.toDataURL();
        }
        return hashstr(result);
      }

    在同一个机器上不同的Chrome和Firefox窗口测试上述代码,结果如附图2所示:
    (1)Chrome窗口1、Chrome窗口2内getCanvasFp()返回的值相同;
    (2)Firefox窗口getCanvasFp()返回的值不同;

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-17 11:13:52
    Tmall APP searching result data scraping screenshots. ​​​​

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-12 12:46:58
    【经验分享】Android-x86 4.4和5.1版本安装的时候卡在GRUB安装,问题解决方法:
    The  fix is that you should manually create partitions: create a small (100m) first primary partition for grub, and a 2nd extended partition for the rest, and install android on the 2nd, the grub will go automatically to the 1st...
    >>> http://t.cn/AiDw9VwW  http://t.cn/AiDw9VwC

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-06 12:35:57
    【经验分享】昨天发的Android x86模拟器设置静态IP的方法,今天在另外一个环境下测试发现有问题。原来是静态IP被DHCP给覆盖掉了,DHCP执行得比/etc/init.sh要晚。查了半天也没找到禁用默认HDCP的方法,最后试着将/system/bin/dhcpcd和/system/bin/dhcptool两个文件重命名,重启,问题竟然解决了 ​​​​

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-05 16:07:33
    【经验分享】Android x86 默认是通过DHCP获取IP的,那如何设置为静态IP参数呢?
    为什么不用DHCP呢?我所在的网络环境中有三个网关,分别连接联通、电信、动态VPN三种出口,我需要让不同的模拟器使用不同的网络(根据业务情况调整)。而DHCP默认分配的网关是固定的。

    以Android x86 6为例,按Alt + F1切换到控制台模式:

    vi /etc/init.sh
    在最后一行return 0之前,加入如下代码:

    # 加下面两句的目的是放弃DHCP获取的IP
    ifconfig eth0 down
    ifconfig eth0 up
    #
    设置eth0口的静态IP为192.168.1.116
    ifconfig eth0 192.168.1.116 netmask 255.255.255.0
    # 设置默认网关为192.168.1.253
    busybox route add default gw 192.168.1.253
    #
    设置DNS为 114.114.114.114 223.5.5.5
    ndc resolver setnetdns 0 localdomain 114.114.114.114 223.5.5.5

    保存(如图1所示),reboot后生效(如图2所示)。

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-05 10:18:57
    【经验分享】添加Fiddler/Mitmproxy证书为安卓系统证书,附自动化脚本,点击链接查看>>>  http://t.cn/AieLat6a ​​​​

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-12-05 08:53:05
    【经验分享】
    "adb devices"出现"unauthorized"的问题经常遇到,大多数情况,adb kill-server之后就能解决,但是今天遇到遇到一设备怎么折腾都不行。

    后来按照这篇文章(http://t.cn/Aie2dMPU)介绍的方法得以解决:

    QUESTION/PROBLEM
    How to fix adb devices shows unauthorized device?

    APPLIES TO
    Android 4, Android 6, Android 7, Android 8

    RESOLUTION
    Possible solutions if "adb devices" shows a device as "unauthorized":
    C:\Users\JohnDoo>adb devices
    List of devices attached
    17310D821D      unauthorized

    1. Disconnect USB between PC and device
    2. Stop adb server by entering "adb kill-server" in command window
    3. On device use "Revoke USB debugging authorizations" in "Developer Options"
    4. On PC delete "adbkey" file in user directory, for example "C:\Users\JohnDoo\.android"
    5. Reconnect the device to the PC
    6. Open a command window and enter "adb devices". Watch the device's screen for any Authorization message and allow the connection.

    The device should now show as "device":

    注意:第四步"删除adbkey文件"是解决本问题的关键!

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-11-19 16:23:49
    【经验分享】使用uiautomatorviewer一直有一个奇怪的问题,查看某些UI正常,但是某些UI却提示异常“Error obtaining UI hierarchy”(如图1所示),控制台信息“null rootnode after parsing.”(如图2所示)。

    之前曾多次遇到这个情况,今天花了些时间查了下,发现stackoverflow上有人遇到类似的问题,详见http://t.cn/AidyMg3t。 原来这是Android4的一个Bug(http://t.cn/AidyMg3c),在Android L中被修复了(http://t.cn/AidyMg3f),Android 5之后的版本应该可以正常工作。

    于是我试了下Android 8下的情况,同一个APP,同一个UI uiautomatorviewer工作正常。

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-11-06 09:32:19

    【视频演示】ANJUKE新房楼盘/二手房小区详细参数,基于APP采集,IP限制弱。

    二手房小区字段:
    u'community_id', u'城市', u'小区名', u'本月均价', u'价格变动', u'所在版块', u'地址', u'总户数', u'建造年代', u'物业公司', u'物业类型', u'物业费', u'开发商', u'总建面积',  u'容积率', u'停车位', u'绿化率', u'经度', u'纬度', u'简介'

    新房楼盘字段:
    u'loupan_id', u'城市', u'楼盘名称', u'别名', u'楼盘价格', u'特色', u'区域位置', u'楼盘地址', u'建筑类型', u'规划户数', u'工程进度', u'开盘时间', u'交房时间', u'容积率', u'绿化率',  u'开发商', u'物业类型', u'物业公司', u'物业管理费', u'车位比', u'车位数', u'楼层状况', u'楼盘户型', u'经度', u'纬度'  西安鲲之鹏的微博视频

    阅读全文 + 去微博评论 +

  • 西安鲲之鹏

    发布时间:2019-10-30 12:05:49
    【经验分享】grep命令提示Binary file (standard input) matches(如附图所示)怎么解决?
    可以使用-a参数,e.g. grep -a 'pattern'。
    -a, --text
    Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.

    >>> http://t.cn/Ai1RqEdR ​​​​

    阅读全文 + 去微博评论 +

QQ在线客服
欢迎咨询,点击这里给我发送消息。
欢迎咨询,点击这里给我发送消息。

加微信咨询