更多>>关于我们
西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效获取互联网任何公开可见信息。
您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。
数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。
更多>>技术文章
-
西安鲲之鹏
发布时间: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,可以实现。
-
西安鲲之鹏
发布时间:2022-05-22 16:22:21
【经验分享】利用HAProxy Runtime API的"set server"命令可以动态修改Haproxy的Backend server。
例如 将Backend "backendout"的 Server "server1"的地址修改为115.209.110.181,端口修改为32603,执行如下命令即可。
echo "set server backendout/server1 addr 115.209.110.181 port 32603" | socat stdio tcp4-connect:127.0.0.1:9999
有两个前提:
(1)HAproxy 2.0以后的版本才支持 Runtime API。
(2)在配置文件里要开始 Runtime API的端口。如下配置示例,在9999端口开启Runtime API。
global
stats socket ipv4@127.0.0.1:9999 level admin
详细用法可以参见官方博客里的示例,链接为https://www.haproxy.com/blog/dynamic-configuration-haproxy-runtime-api/ -
西安鲲之鹏
发布时间:2022-05-10 19:10:47
【经验分享】linux下如何检测某个网口下有ADSL拨号设备信号?
用途:检测拨号设备是否工作正常,或者网口与拨号设备的连接是否正常。
方法:可以使用"pppoe-discovery -I eth1"命令,eth1修改为具体要检测的网口。如果对应网口和拨号设备连接正常,将会返回BAS的名称和IP。
文档连接:https://www.systutorials.com/docs/linux/man/8-pppoe-discovery/
如附图所示,为分别在连云港联通、南京电信、南昌电信拨号环境下做的测试。
-
西安鲲之鹏
发布时间:2022-05-06 13:31:47
【经验分享】接上一篇:Android APP内置WebView如何获取当前加载的URL(方法二)?
这次是直接HOOK android.webkit.WebView类的loadUrl()方法,可以直接得到加载的URL。同时也可以再loadUrl()内调用setWebContentsDebuggingEnabled(true)开启远程调试。效果如附图所示,这是某宝APP内嵌的H5页面,成功获取到了URL并且在inspect中能看到对应的WebView窗口(开启该WebView的远程调试成功)。
// 查看WebView加载的URLs并启动远程调试
Java.use("android.webkit.WebView").loadUrl.overload("java.lang.String").implementation = function (s) {
console.log('WebView.loadUrl():' + s);
console.log('Set webview DebuggingEnabled!');
this.setWebContentsDebuggingEnabled(true);
this.loadUrl.overload("java.lang.String").call(this, s);
};
-
西安鲲之鹏
发布时间:2022-05-06 13:04:25
【经验分享】Android APP内置WebView如何获取当前加载的URL?
(1)使用Firida强制其开启WebView的远程调试,以某司法拍卖APP为例,执行如下代码后。
Java.perform(function() {
var WebView = Java.use("com.uc.webview.export.WebView");
WebView.setWebContentsDebuggingEnabled(true);
}
);
(2)通过adb forward命令把WebView的Unix域套接字映射为本地端口,详细步骤可参见我们的这篇文章http://www.site-digger.com/html/articles/20220414/860.html。
(3)通过WebView的远程调试接口即可看到当前Tab的JSON数据,如附图所示,其中就有URL信息。
-
西安鲲之鹏
发布时间:2022-04-01 19:36:02
【经验分享】Linux如何设置虚拟内存?
1. 先看一下是否设置了虚拟内存。执行free -m命令,查看"Swap:"后的第一个数字,如果是0则表明未设置。
2. 添加虚拟内存,假设1G。
# 创建swapfile文件
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
# 将目标设置为swap分区文件
sudo mkswap /swapfile
# 激活启用虚拟内存,执行完毕之后就可以用free -m验证是否生效了。
sudo swapon /swapfile
开机自动启用虚拟内存:
添加这行: /swapfile swap swap defaults 0 0 到 /etc/fstab即可。