开发

破解geetest的拖动验证码

最近有个项目需要爬取“国家企业信用信息公示系统”的数据,在该网站点击搜索按钮时,会弹出极验(geetest)的拖动式验证码。 遂一番google之,发现果然有哥们已经破解了这套验证码系统,甚至放出源码来了。学以致用。 原理很简单,首先定位缺口的位置,然后驱动浏览器将按钮移动到该位置。至于如何定位缺口位置,其实这个验证图是分上下两张的,底图是完整图,上一层则是有缺口的图,另外这两张图都是打散的,需要先还原出原图,然后再逐像素对比两张图片就可以得到缺口位置。移动按钮看似简单,但如果只是简单的将按钮设置到目标位置,极验后台会返回“怪物吃了拼图”,因为该验证码系统会将按钮的移动轨迹提交到极验后台,并验证该轨迹是否像一个人类的行为,所以我们需要尽可能模拟出人类的拖动行为。 代码示例: # -*- coding: utf-8 -*- import logging import time import random import re import requests import […]

注意!crontab的环境变量并非用户环境变量

今天发现爬虫脚本的一个问题:“直接在shell下运行的话,爬SIPO网站的数据得到的是中文;但是在crontab中启动的脚本爬出来的数据却是英文。”想了好半天,怀疑是环境的问题,然后一查,果然有好多人提到。原来crontab的环境变量跟用户的环境变量是不一致的!!! 直接在用户shell下敲env命令,可以看到有一行LANG=zh_CN.UTF-8,而crontab默认的环境语言是英文的,所以可以在编辑crontab时加上语言这一行。如下:   2022.04.21 最近在 Oracle 云上搞了两台服务器,并且安装了 certbot 来自动更新证书,但每次 crontab 执行 /usr/bin/certbot renew –quiet 时都会报错。错误日志如下: certbot.errors.NoInstallationError: Could not find a

用 Python 装饰器写一个single instance

一、关于python的装饰器 python装饰器的形式有点像java的注解、用处有点像java的切面。可以简单的理解为一个函数如果被装饰器注解了,那么在运行该函数之前,会先调用装饰器函数。 具体的参考如下两篇文章: https://www.zhihu.com/question/26930016 http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 二、一个脚本单一实例运行 有时候我们会有这种需求,只允许某个程序在系统中只有一个运行实例,即不允许程序“多开”。 There are several common techniques including using semaphores. The one I see used

pytesseract识别验证码

验证码破解是做爬虫经常要面对的问题。对于一般字符串或者算式的验证码,可以使用网页截图,然后OCR识别的方式来识别出验证码字符串来。 网页截图可以使用selenium的save_screenshot()方法; 用PIL图像处理库来截取验证码图片; 用Tesseract来做OCR识别 要安装的python第三方库有:selenium、pillow(PIL)、pytesseract 要安装的软件有:selenium用的webdriver、pytesseract用的Tesseract 1. 网页截图并截取验证码 import selenium from PIL import Image … fileScreenshot = "截屏文件保存路径" fileCaptcha =

爬虫遭遇http error 521

最近做了个爬虫需要用到代理ip,然后想去快代理上爬点代理ip下来用。 结果使用urllib2访问http://www.kuaidaili.com/proxylist/1时候发现总是返回521错误。 使用HTTPError的read方法可以打印出HTTP的返回内容。 try: resp = urllib2.urlopen(url) contents = resp.read() except urllib2.HTTPError, error: print e contents = error.read() print contents

如何处理数据库并发操作

1. 基本问题 假设项目的用户信息包括用户积分,现在需求是给用户增加积分。在Service层有一个方法addCredits负责执行增加积分的操作。 @Override @Transactional("fproxy") public void addCredits(User user, int number) { // user对象为已从数据库读出的用户信息 // 先调用user.getCredits()获取当前的用户积分,增加number数量后写入user对象中 user.setCredits(user.getCredits() + number); //

基于Spring、Hibernate实现通用Dao层

这两天又捡起来老司机的web端代码,需要增加一些新的功能,比如说充值卡(PrepaidCard)模块。在写Dao层的时候发现好麻烦呀,每个实体类都要写一个对应的Dao(还包括接口跟实现),而大部分Dao方法都是基本的增删查改操作(CRUD)。比如getById,save,update,count,query,delete。而这些基本操作的代码其实都是相差无几的,既然这样那我们是不是可以写一个BaseDao来实现基本操作,然后让其他Dao来继承他。 以我现在要写的PrepaidCard实体类为例: /** * 省略各种import **/ @Entity @Table(name = "fp_prepaid_card") public class PrepaidCard implements Serializable { private static final long

坑,Laravel的cache系统与entrust与throttle

laravel默认是使用file做cache驱动的,但file与database驱动的cache无法支持tag,这就与我用到的entrust插件冲突了,所以改成了array作为cache系统的驱动。 后来想用throttle中间件的时候,发现throttle无效,一猜就是cache的问题,因为改用array做cache后,array其实相当于一次进程获得的内存空间开辟的一块数组,那么如果cache在这个数组里面,请求处理完后,这个数组已经没有啦!所以throttle根本不起作用。想了想最好的办法还是得换redis或者memcache做cache驱动,尤其在生产环境。  

【转】实用的javascript调试小技巧

首先得强调一下调试前端javascript的基本命令:console.log(obj),用来在浏览器控制台输出对象。其实除了console.log,还有各种console.error、console.warn、console.info、console.assert等命令。console代表的是浏览器控制台,firefox与chrome的console命令大部分是通用的,更详细的命令介绍可以参考:Chrome Console API Reference (ps:在旧版本的ie,比如ie9,如果在js代码中使用了console.log,那么只有在打开F12,即ie的开发者工具时候,才能识别console对象。如果没有打开ie的开发者工具,会导致脚本无法识别console,js代码无法执行😰   @20171029) 原文地址:10+ 实用的 JavaScript 调试小技巧   1. debugger 除了console.log,debugger就是另一个我很喜欢的快速调试的工具,将debugger加入代码之后,Chrome会自动在插入它的地方停止,很像C或者Java里面打断点。你也可以在一些条件控制中插入该调试语句,譬如: if (thisThing) { debugger; } 2.

Laravel框架 – 打印容器实例

初学laravel的时候,看到service provider这一块,一直纠结如何才能打印出容器内所有的service provider,因为光靠config/app.php文件,很难从alias看出其对应的service provider到底是哪个。后来才发现,其实在程序的任意地方(Application启动后),都可以通过 Container::getInstance()这个静态方法获取当前的Application实例。或者可以使用在全局helps.php中定义的的 app()方法来获取当前Application实例。 Route::get('/test', function () { dd(app()); // dd(Illuminate\Container\Container::getInstance()); }); 注意: 在laravel中打印变量尤其是“超大型”变量的时候,千万不要直接使用var_dump()。一来不直观,二来大型变量直接 var_dump可能会导致浏览器卡死(我猜应该是卡死在尝试将var_dump数据解析成dom上面)。=。=# 最好使用larave的全局函数dd()或者dump(),输出又美观,又不会卡死浏览器。 ps: 最好用dd吧,少用dump,今天发现一个bug,如果使用dump的话,会导致cookie操作失效=。=#

Scroll to Top