原 WEB技术
|--原 win7下Appserv或Xampp安装imagemagick以及php的imagick扩展教程并生成GIF缩略图(2018年版)
PHP项目中,需要用到切图和缩图的效果,在linux测试服务器上很轻松的就安装好php imagick扩展。但是在本地windows开发环境,安装过程遇到好多问题,在此与大家分享。这里...
PHP项目中,需要用到切图和缩图的效果,在linux测试服务器上很轻松的就安装好php imagick扩展。但是在本地windows开发环境,安装过程遇到好多问题,在此与大家分享。这里的方法时候php5到php7
1. 下载 ImageMagick
优先下载地址:http://windows.php.net/downloads/pecl/deps/ 这里有低版本的
(注意这里下载的版本不能太高,不然运行不起来,这个版本是我测试正常的):
ImageMagick-6.9.3-7-vc14-x64.zip
备选下载地址:http://imagemagick.org/script/download.php#windows
下载最新版本 :ImageMagick-7.0.7-22-Q16-x64-dll.exe (注意这里的7.07是ImageMagick的版本,不是php对应的版本,)
(注:其实应该先安装php的imagick扩展再安装ImageMagick,根据imagick的版本安装对应版本的ImageMagick,我会在后面再细说。)
2. 安装 ImageMagick
安装 ImageMagick 到 PC 上。安装路径不能出现空格,否则无法使用(有空格发觉ImageMagick也能用)。安装时,一点选中把执行路径添加到 path 上,否则你就得手动去添加 path 路径了。
3. 测试安装
为了验证工作正常,在命令提示符窗口(win+r -> “cmd” -> Enter)输入以下:
magick logo: logo.gif magick identify logo.gif magick logo.gif win:
第一行命令会在当前目录下生成一个logo.gif图片
第二行命令会输出
D:\AppServ\www\test>magick identify logo.gif
logo.gif GIF 640x480 640x480+0+0 8-bit sRGB 256c 28576B 0.000u 0:00.000
第三行命令会打开这个gif文件,漂亮吧
如果有任何其他问题,你可能需要 vcomp120.dll. 为了安装它, 下载 Visual C++ 2013 Redistributable Package.
4. 下载 php扩展 php_imagick.dll
首选下载地址:https://pecl.php.net/package/imagick
下载地址:https://pecl.php.net/package/imagick/3.4.3/windows
备用下载地址 http://www.peewit.fr/imagick/
dyn = dynamic, st = static, q16 = 16 bit, q8= 8 bit.
以上标识,同你下载的ImageMagick下载标识相同,本人用的是q16
5. 把dll文件重命名为php_imagick.dll,并放到php 扩展文件目录 php/ext 中。
6. 在 php.ini 配置文件中添加,extension=php_imagick.dll。
Appserv或XAMPP把CORE_RL_bzlib_.dll等除php_imagick.dll文件之外的文件放到对应的Appserv/Apache24/bin或xampp\apache\bin下,重启apache,如果没问题的话,就ok了。
如果你还没安装ImageMagick的话,安装了imagick扩展成功后显示是下面这样的
如果已经安装了ImageMagick,正常的话显示应该是下面这样的。
7. 重启电脑,只重启apache不管用的情况下,重启下PC。因为扩展底层使用的是imageMagic软件,所以软件重启电脑,重新加载软件,并刷新path路径。
8. 重启后,打开 phpinfo页面,查看,扩展已经安装成功。如果还未安装成功,极有可能imagemagick软件版本过高,请选择更低一级的版本安装。 ...
|--原 python安装以及python采集(2022年4月更新)
Win7能用的最新版本是python3.8.9
安装python
1. 在python的官网下载python对应版本:https://www.python.org/downloads/windows/
64位下载Windows x86-64 executable installer 版本
32位下载Windows x86 executable installer 版本
打开链接如下图,版本会一直更新,选择任意一个适合自己电脑的版本就好
详细的安装教程点这里:Python安装教程(非常详细) python如何安装使用
下载后安装,安装时注意到这步时,选择自己的安装目录,另外Add python to environment variables(添加环境变量)
...
|--原 php解析html类库simple_html_dom(详细介绍)
下载地址:https://github.com/samacs/simple_html_dom
解析器不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。它使用了类似jQuery的元素选择器,通过元素的id,class,tag等等来查找定位;同时还提供添...
下载地址:https://github.com/samacs/simple_html_dom
解析器不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。它使用了类似jQuery的元素选择器,通过元素的id,class,tag等等来查找定位;同时还提供添加、删除、修改文档树的功能。当然,这样一款强大的html Dom解析器也不是尽善尽美;在使用的过程中需要十分小心内存消耗的情况。不过,不要担心;本文中,笔者在最后会为各位介绍如何避免消耗过多的内存。
开始使用
上传类文件以后,有三种方式调用这个类:
从字符串中加载html文档
从文件中加载html文档
代码如下:
<?php
// 新建一个Dom实例
$html = new simple_html_dom();
// 从url中加载
$html->load_file('http://www.jb51.net');
// 从字符串中加载
$html->load('<html><body>从字符串中加载html文档演示</body></html>');
//从文件中加载
$html->load_file('path/file/test.html');
?>
如何避免解析器消耗过多内存
在本文的开篇中,笔者就提到了Simple HTML DOM解析器消耗内存过多的问题。如果php脚本占用内存太多,会导致网站停止响应等一系列严重的问题。解决的方法也很简单,在解析器加载html文档并使用完成后,记得清理掉这个对象就可以了。当然,也不要把问题看得太严重了。如果只是加载了2、3个文档,清理或不清理是没有多大区别的。当你加载了5个10个甚至更多的文档的时候,用完一个就清理一下内存绝对是对自己负责啦^_^,代码如下:...
|--转 php判断两张图片是否相同
原文链接:http://www.webyang.net/Html/web/article_327.html随着上传图片的增多,有的时候需要判断是否是相同的图片,然后进行删除。那么如何实现这个过程呢?方...
原文链接:http://www.webyang.net/Html/web/article_327.html
随着上传图片的增多,有的时候需要判断是否是相同的图片,然后进行删除。那么如何实现这个过程呢?
方法一:
sha1_file() 或者 md5_file()方法。
- $file = "./img/1.jpg";
- $file2 = "./img/2.jpg";
- $gg = sha1_file($file);
- $aa = sha1_file($file2);
- if($aa == $gg) echo 'equation';
这两个方法只能判断两张完全相同的图片,包括文件的大小,尺寸,另外这个方法还可以用来判断文件。
方法二:
- $filename = '1.jpg';
- list($width, $height) = getimagesize($filename);
- $img = imagecreatefromjpeg($filename);
- $new_img = imagecreatetruecolor(8, 8);
- imagecopyresampled($new_img, $img, 0, 0, 0, 0, 8, 8, $width, $height);
- imagefilter($new_img, IMG_FILTER_GRAYSCALE);
- $colors = array();
- $sum = 0;
- for ($i = 0; $i < 8; $i++) {
- for ($j = 0; $j < 8; $j++) {
- $color = imagecolorat($new_img, $i, $j) & 0xff;
- $sum += $color;
- $colors[] = $color;
- }
- }
- $avg = $sum / 64;
- $hash = '';
- $curr = '';
- $count = 0;
- foreach ($colors as $color) {
- if ($color > $avg) {
- $curr .= '1';
- } else {
- $curr .= '0';
- }
- $count++;
- if (!($count % 4)) {
- $hash .= dechex(bindec($curr));
- $curr = '';
- }
- }
- print $hash . "\n";
...
|--转 Apache(四)访问验证方式-WEB技术之后端技术
Require all granted 允许所有请求访问资源Require all denied 拒绝所有请求访问资源Require env env-var [env-var] ... 当指定环境变量设置时允许访问Require method ...
Require all granted
允许所有请求访问资源
Require all denied
拒绝所有请求访问资源
Require env env-var [env-var] ...
当指定环境变量设置时允许访问
Require method http-method [http-method] ...
允许指定的http请求方法访问资源
Require expr expression
当expression返回true时允许访问资源
Require user userid [userid] ...
允许指定的用户id访问资源...
|--转 session多服务器共享的方案梳理 - WEB技术之后端技术
session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢? php中sessio...
session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢?
php中session的原理,以前做了一下总结,可以参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html
以前业界使用session的做法:
默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下:
session.save_handler = files
session.save_path = "N;/path"
第一个配置项是指定使用files(文件形式)存储session数据。
第二个参数指定保存的路径。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)
我的配置项是:session.save_path = "F:/wamp/tmp"。那么就会去这个目录下面看到很多session数据的文件。
当我们使用php的内置函数session_start()的时候,就是去上面指定的磁盘目录把session数据载入,实际上就是拿类似
sess_74dd7807n2mfml49a1i12hkc45的文件。
74dd7807n2mfml49a1i12hkc45就是大家经常说的什么session的id号。
php.ini中还有一个关键配置项,如下:
session.name = PHPSESSID
PHPSESSID就是cookie的名称,其实上面一串"74dd7807n2mfml49a1i12hkc45"会保存在一个名为PHPSESSID的cookie中。
根据http的请求机制,当浏览器请求的时候,头部信息会把浏览器中的cookie一起发给服务器。PHPSESSID这个cookie也
是在其中发给了服务器,php引擎通过读取PHPSESSID的值来确定要载入哪个session文件。
比如值为74dd7807n2mfml49a1i12hkc45,载入的就是"sess_74dd7807n2mfml49a1i12hkc45"。
注:当你调用php的函数session_start(),才表明你需要使用session文件了。不然平白无故就去载入文件,浪费性能。
===========================================
根据如上原理。session的数据默认是保存在磁盘文件中。假设这种情况:多台php服务器进行负载均衡的时候,比如有三台php服务器,为了实现负载均衡,那么三台服务器上面的php代码都是一样(拷贝一份)。
上面的图是nginx+fpm部署图。可以看到多台php服务器进行负载均衡。
生成session数据文件都是在本地了(a,b,c各自的服务器磁盘上)。负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问是同一台服务器,实际上无法确定的。第一秒访问可能是a服务器,第二秒访问的可能是c服务器。
所以同一个登录会员,实际上就会出现:第一秒访问第一台php服务器,第二秒访问的是第二台服务器。登录的信息一般是保存在session中的。这样子登录保存的session数据就需要进行共享了。不然的话会出现,访问第一台服务器生成了一个session数据。第二秒负载请求到第三台服务器,结果获取不到刚才生成的session数据。
我的理解是:只有涉及到多台多台后端服务器(php,java等处理服务器)的时候,才涉及到session读取不到的问题。
在php环境中,只有多台php服务器(php服务器而非web服务器,session文件是php引擎生成的)的情况下,才会涉及到
session共享的问题。单台php服务器,存储都在一台主机上。不涉及到共享问题。因为session直接存储在这台服务器磁盘上是能够被本机读取到的。
如果是:一台php服务器,多台mysql服务器。这种也是负载均衡,这种负载均衡不涉及到共享问题。因为怎么session数据怎么操作都是保存在一台服务器上。
==================================
ps:实际上,session在php,.net,java等只要是后端语言都会用到。session的存储机制,各种语言都大体差不多。我觉得这跟cookie在各个语言中都会用到差不多。.net,java我没去了解过。但是存储原理是差不多的。区别就是,php,java,.net调用的函数,读和取session数据的方式不同。默认都是存储在本地文件中的(不然怎么会涉及到session共享问题呢,存储在数据库本身就可以实现共享的)。
所以,无论是.net还是java都会涉及到session数据共享的问题。
其实我的理解是,session的原理都是一样的。讨论session共享方案设计,是可以抛开具体的语言去讨论session共享方案设计。
目前业界解决session共享的几种思路,我总结如下: ...
|--摘 php thread safe non thread safe到底选择哪个?- WEB技术之后端技术
如果你是在windows下使用IIS+PHP的话,你需要下载VC9的版本。 如果你是在windows下使用Apache+PHP的话,你需要下载VC6的版本。Non Thread Safe是指非线程安...
如果你是在windows下使用IIS+PHP的话,你需要下载VC9的版本。
如果你是在windows下使用Apache+PHP的话,你需要下载VC6的版本。
Non Thread Safe是指非线程安全,Thread Safe则是指线程安全。
如果是使用ISAPI(注:Internet Server Application Programming Interface ,电脑为Microsoft所提供的Internet server的API)的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。这样一来,如何选择您适用的PHP版本就迎刃而解了,去下载适合您系统的PHP吧。...
|--原 关于Linux下用户权限问题-WEB技术之后端技术
自己建立了一个用户,用来管理web目录和composer的,结果运行yum install时提示-bash-4.2$ yum install ImageMagickLoaded plugins: fastestmirrorYou need to be r...
自己建立了一个用户,用来管理web目录和composer的,结果运行yum install时提示
-bash-4.2$ yum install ImageMagick...
|--原 在安装imagick时到安装yum install -y php-pear 报错 - Linux yum安装
[root@izj6c76p~]# yum install -y php-pear Loaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * remi-safe: mirrors.tuna.tsinghua.edu.cn * w...
[root@izj6c76p~]# yum install -y php-pear
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* remi-safe: mirrors.tuna.tsinghua.edu.cn
* webtatic: sp.repo.webtatic.com
Resolving Dependencies
--> Running transaction check
---> Package php-pear.noarch 1:1.9.4-21.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=================================================================================...
|--摘 getimagesize 函数的使用-中文文件名问题-getimagesize 函数不是完全可靠的
在用getimagesize处理中文名图片时报错。failed to open stream: No such file or directory in D:\AppServ\www\img.php on line...
在用getimagesize处理中文名图片时报错。
failed to open stream: No such file or directory in D:\AppServ\www\img.php on line 4网上查也一下没找到是不是getimagesize不支持中文,我是在windows上执行代码的
网上查了下,可以这样,把文件名重命名,然后再用getimgesize函数
$filename='测试001.jpg'; $newFileName='ceshi001.jpg'; rename(iconv('UTF-8','GBK',$filename), iconv('UTF-8','GBK',$newFileName)); $filename=$newFileName; $image=__DIR__.DIRECTORY_SEPARATOR.$filename; $imageInfo=getimagesize($image);
OK了,下面是转载内容,文章名:getimagesize 函数不是完全可靠的
以下是转载https://segmentfault.com/a/1190000003911296
getimagesize
函数并不属于 GD 扩展的部分,标准安装的 PHP 都可以使用这个函数。可以先看看这个函数的文档描述:http://php.net/manual/zh/function.getimagesize.php
如果指定的文件如果不是有效的图像,会返回 false,返回数据中也有表示文档类型的字段。如果不用来获取文件的大小而是使用它来判断上传文件是否是图片文件,看起来似乎是个很不错的方案,当然这需要屏蔽掉可能产生的警告,比如代码这样写:
<?php
$filesize = @getimagesize('/path/to/image.png');
if ($filesize) {
do_upload();
}
# 另外需要注意的是,你不可以像下面这样写:
# if ($filesize[2] == 0)
# 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。
但是如果你仅仅是做了这样的验证,那么很不幸,你成功的在代码里种下了一个 webshell 的隐患。
要分析这个问题,我们先来看一下这个函数的原型:
static void php_getimagesize_from_stream(php_stream *stream, zval **info, INTERNAL_FUNCTION_PARAMETERS)
{
...
itype = php_getimagetype(stream, NULL TSRMLS_CC);
switch( itype) {
...
}
...
}
static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) {
...
php_getimagesize_from_stream(stream, info, INTERNAL_FUNCTION_PARAM_PASSTHRU);
php_stream_close(stream);
}
PHP_FUNCTION(getimagesize)
{
php_getimagesize_from_any(INTERNAL_FUNCTION_PARAM_PASSTHRU, FROM_PATH);
}
限于篇幅上面隐藏了一些细节,现在从上面的代码中我们知道两件事情就够了:
- 最终处理的函数是
php_getimagesize_from_stream
- 负责判断文件类型的函数是
php_getimagetype
接下来看一下 php_getimagetype
的实现:
PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
{
...
if (!memcmp(filetype, php_sig_gif, 3)) {
return IMAGE_FILETYPE_GIF;
} else if (!memcmp(filetype, php_sig_jpg, 3)) {
return IMAGE_FILETYPE_JPEG;
} else if (!memcmp(filetype, php_sig_png, 3)) {
...
}
}
去掉了一些细节,php_sig_gif
php_sig_png
等是在文件头部定义的:
...
|--原 采集时报错cURL error 60: SSL certificate problem
https://github.com/FriendsOfPHP/Goutte之前用下面代码采集时namespace backend\controllers; use Yii; use yii\web\Contro...
https://github.com/FriendsOfPHP/Goutte...
|--转 修改php文件上传的大小限制upload_max_filesize
Question当php脚本上传的文件大小超过php.ini中post_max_size,upload_max_filesize的限制的时候页面不会给出提醒,文件也上传失败。 php.ini 配置对php上传文件大小...
Question
当php脚本上传的文件大小超过php.ini中post_max_size,upload_max_filesize的限制的时候页面不会给出提醒,文件也上传失败。
php.ini 配置对php上传文件大小的影响参数有:
配置项 可能值 功能描述
file_uploads ON 确定服务器上的PHP脚本是否可以接受HTTP文件上传
memory_limit 8M 设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存
upload_max_filesize 2M 限制PHP处理上传文件的最大值,此值必须不大于post_max_size值
post_max_size 8M 限制通过POST方法可以接受的信息最大量
而对应的$_FILES 中error对应得错误提示有:
文件上传时产生的错误
0:表示没有发生任何错误,文件上传成功
1:表示上传文件的大小超出了再PHP配置文件中upload_max_filesize选项限制的值
2:表示上传文件大小超出了HTML表单中MAX_FILE_SIZE选项所指定的值
3:表示文件只被部分上传
4:表示没有上传任何文件
由此看出php只能对upload_max_filesize这个配置项的限制做出判断,而对post_max_size则没有相应的判断,这时的页面其实是一个崩溃的状态,页面不会给出任何提示。...
|--转 MySQL 查看表结构简单命令
一、简单描述表结构,字段类型desc tabl_name;显示表结构,字段类型,主键,是否为空等属性,但不显示外键。例如:desc table_name二、查询表中列的注释信息select * ...
一、简单描述表结构,字段类型
desc tabl_name;
显示表结构,字段类型,主键,是否为空等属性,但不显示外键。
例如:desc table_name
二、查询表中列的注释信息
select * from information_schema.columns
where table_schema = 'db' #表所在数据库
and table_name = 'tablename' ; #你要查的表
例如:
可以自动选择你需要信息
三、只查询列名和注释
select column_name, column_comment from information_schema.columns where table_schema ='db' and table_name = 'tablename' ;
例如:
四、#查看表的注释
select table_name,table_comment from information_schema.tables where table_schema = 'db' and table_name ='tablename'
例如:
五、查看表生成的DDL
show create table table_name;
例如:
这个命令虽然显示起来不是太容易看, 这个不是问题可以用\G来结尾,使得结果容易阅读;该命令把创建表的DDL显示出来,于是表结构、类型,外键,备注全部显示出来了。...
|--原 获取php内置函数源码
http://php.net/downloads.phphttp://php.net/get/php-7.1.14.tar.bz2/from/a/mirro...
http://php.net/downloads.php
...
|--摘 php反射获取自定义类的源码
注意:此方法只能获取自定义的类的源码,一般用IDE开发,都有自动找代码功能,所以此法用处不大。 class test{ private $name; ...
注意:此方法只能获取自定义的类的源码,一般用IDE开发,都有自动找代码功能,所以此法用处不大。
class test{ private $name; function set($value){ $this->name = $value; } function get(){ return $this->name; } } class reflectionUtil{ static function getClassSourse( ReflectionClass $class){ $path = $class->getFileName(); if($path){ $lines = @file($path); $from = $class->getStartLine(); $to = $class->getEndLine(); $len = $to-$from+1; return implode(array_slice($lines, $from-1,$len)); }else{ return 'not get code'; } } } print ReflectionUtil::getClassSourse( new ReflectionClass('test'));
...
|--摘 DKMS介绍
DKMS,是Oikawa等人在1996年提出一种与LKM类似的动态核心模块技术,它以文件的形式存储并能在系统运行过程中动态地加载和卸载。DKMS:主要作用就是当内核发生变化(版本号),内核之外的驱动可以动态重新生成新的模块。因为内核之外的模块是找/lib/modules/内核版本号的当内核升级后,内核版本号发生变化,目录也发生变化,而内核之外的驱动版本号没有发生变化,此时就用不了了。而DKMS就是为了解决这个问题而出现的如:以hello-0.1为例,我们首先需要把代码copy到"/usr/src"下面,这样完整路径将是"/usr/src/hello-0.1"。DKMS要求我们的代码目录必须以"<module>-<module-DKMS,是Oikawa等人在1996年提出一种与LKM类似的动态核心模块技术,它以文件的形式存储并能在系统运行过程中动态地加载和卸载。DKMS:主要作用就是当内核发生变...
|--摘 Centos7用默认的防火墙firewall安装PPTP搭建vpn服务器
现在国内的服务器商已经不提供此服务,安装上了也用不了。1 准备一个CentOS7服务器 2 检查是否支持PPTP modprobe ppp-compress-1...
现在国内的服务器商已经不提供此服务,安装上了也用不了。
1 准备一个CentOS7服务器
2 检查是否支持PPTP
modprobe ppp-compress-18 && echo ok #返回OK zgrep MPPE /proc/config.gz #返回CONFIG_PPP_MPPE=y 或 =m cat /dev/net/tun #返回cat: /dev/net/tun: File descriptor in bad state
以上三条命令满足一条即为支持PPTP
3 安装PPP
yum install -y ppp
4 安装PPTPD
4.1 添加EPEL源:
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
4.2 安装EPEL源:
rpm -ivh epel-release-latest-7.noarch.rpm
4.3 检查是否已添加到源列表中:
yum repolist
4.4 更新源列表:
yum -y update
4.5 安装PPTPD:
yum install -y pptpd
5 编辑/etc/pptpd.conf设置VPN内网IP段
最后IP设置改为:
localip 192.168.0.1 remoteip 192.168.0.214,192.168.0.245
6 编辑/etc/ppp/options.pptpd
6.1 更改DNS项:
ms-dns 8.8.8.8 ms-dns 8.8.4.4
6.2 修改日志记录:
#nologfd logfile /var/log/pptpd.log
7 编辑/etc/ppp/chap-secrets设置VPN账号密码
用户名 pptpd 密码 *//每个字段之间用tab键隔开 *表示用任意IP连接VPN都可以
样例:登录账号为root 密码为123 这样写:
root pptpd 123 *
8 修改内核参数支持内核转发 (Centos7.x)
/usr/lib/sysctl.d/50-default.conf 文件里加入
net.ipv4.ip_forward = 1
输入命令生效:sysctl -p
9 修改防火墙设置: ...
|--原 Linux服务器搭建
|--转 为什么网上Python爬虫教程这么多,但是做爬虫的这么少呢?爬虫发展又该是如何呢?
很多人学习Python进阶可能都写过几个爬虫,但是最终做爬虫的人却比较少呢?是因为真的像别人说的那样,爬虫真的没“技术含量”,还是爬虫随着反爬的不断提升,做爬虫的代价越来越高难以维持成...
很多人学习Python进阶可能都写过几个爬虫,但是最终做爬虫的人却比较少呢?是因为真的像别人说的那样,爬虫真的没“技术含量”,还是爬虫随着反爬的不断提升,做爬虫的代价越来越高难以维持成本?还希望能谈一谈爬虫的发展该是怎样的?可能做到双赢吗?请指教
网上教程多,是因为入门简单,容易获得成就感,容易忽悠小白
爬虫就是因为太有技术含量,所以会的人少,可能看起来做的人就少了
爬虫远比我们想的复杂
大多数人会的,只是造一颗螺丝钉,而整个爬虫系统,就好比造火箭
大多数人,只掌握了入门级的水品,也就是最多能造个螺丝钉,造不出火箭
为什么我说爬虫远比我们想的复杂呢?
爬虫绝不是表面的 用requests、urllib,发个http请求那么简单
就如同 楼上的几位回答者所说,如果只是发个http请求,根本用不着专门来学,随便找个火车头之类的工具,拖几下鼠标就搞定了
实际情况中,你要抓人家的数据, 会有很多门槛:
1.人家检测出你是爬虫,拉黑你IP (人家究竟是通过你的ua、行为特则 还是别的检测出你是爬虫的?你怎么规避?)
2.人家给你返回脏数据,你怎么辨认?
3.对方被你爬死,你怎么设计调度规则?
4.要求你一天爬完10000w数据,你一台机器带宽有限,你如何用分布式的方式来提高效率?
5.数据爬回来,要不要清洗?对方的脏数据会不会把原有的数据弄脏?
6.对方的部分数据没有更新,这些未更新的你也要重新下载吗?怎么识别?怎么优化你的规则?
7.数据太多,一个数据库放不下,要不要分库?
8.对方数据是JavaScript渲染,那你怎么抓?要不要上PhantomJS?
9.对方返回的数据是加密的,你怎么解密?
10.对方有验证码,你怎么破解?
11.对方有个APP,你怎么去得到人家的数据接口?
12.数据爬回来,你怎么展示?怎么可视化?怎么利用?怎么发挥价值? ...
|--转 SecureCRT 8.5.3破解,输入记事本中给的密钥即可,无需破解器或者破解补丁
https://blog.csdn.net/MrDmmm/article/details/89527261ecureCRT 8.5.3破解,输入记事本中给的密钥即可,无需破解器或者破解补丁,本人正在用这个破解版本,安装省...
https://blog.csdn.net/MrDmmm/article/details/89527261
SecureCRT 8.5.3破解,输入记事本中给的密钥即可,无需破解器或者破解补丁,本人正在用这个破解版本,安装省心,简单,不用关闭杀毒软件,防火墙。
直接点开下边的微云链接,直接下载整个文件夹即可。安装前请先看文件夹中的安装步奏记事本,只要步奏正确,应该就没有什么问题,如果有问题在评论区留言。(如果需要别的资源,请在评论区留言。)...
|--转 linux下解决bash: syntax error near unexpected token `(' 的错误
最近在开发过程中,我想删除服务器上的一个jar包,但是这个jar包的名字上带有括号。一开始我是这样子删除的:rm -f HIBIKI_API(1).jar但是我却得到下面的一句话:bash: sy...
最近在开发过程中,我想删除服务器上的一个jar包,但是这个jar包的名字上带有括号。
一开始我是这样子删除的:
rm -f HIBIKI_API(1).jar
但是我却得到下面的一句话:
bash: syntax error near unexpected token `('
然后我谷歌了一下,发现linux5.0之后,是不能带有括号的,这个时候就需要转译了。转译的方法有下面两种:...
|--转 mysqldump: [Warning] Using a password on the command line interface can be i
今天使用/usr/local/server/mysql/bin/mysqldump -h127.0.0.1 -uroot -proot reading > ./reading.sql导出数据库的时候报了这个错,当然数据库也没有导出来。这个问...
今天使用/usr/local/server/mysql/bin/mysqldump -h127.0.0.1 -uroot -proot reading > ./reading.sql导出数据库的时候报了这个错,当然数据库也没有导出来。这个问题应该是在MySQL5.6+版本的时候就有出现,可能是为了确保数据库的安全性采用的保护机制。
第一种方法、 修改数据库配置文件有些在/etc/my.cnf,有些是在/etc/my.conf我们需要在[client]部分添加脚本:host=localhostuser=数据库用户password='数据库密码'123
第二种、 修改命令现在就可以用上面的命令进行导出了,虽然还是有错误提示,但是是不影响导出的。如果介意的话可以使用/usr/local/server/mysql/bin/mysqldump --defaults-extra-file=/etc/my.cnf -h127.0.0.1 -uroot -proot dbname > test.sql1其实就是在上面的命令中加入了–defaults-extra-file=/etc/my.cnf 。这样就可以了,而且没有错误提示。————————————————版权声明:本文为CSDN博主「吃井不忘挖水人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_41399976/article/details/......
|--转 mysqldump: [Warning] Using a password on the command line interface can be i
今天使用/usr/local/server/mysql/bin/mysqldump -h127.0.0.1 -uroot -proot reading > ./reading.sql导出数据库的时候报了这个错,当然数据库也没有导出来。这个问...
今天使用/usr/local/server/mysql/bin/mysqldump -h127.0.0.1 -uroot -proot reading > ./reading.sql导出数据库的时候报了这个错,当然数据库也没有导出来。
这个问题应该是在MySQL5.6+版本的时候就有出现,可能是为了确保数据库的安全性采用的保护机制。
第一种方法、 修改数据库配置文件
有些在/etc/my.cnf,有些是在/etc/my.conf
我们需要在[client]部分添加脚本:
host=localhost
user=数据库用户
password='数据库密码'
1
2
3
第二种、 修改命令
现在就可以用上面的命令进行导出了,虽然还是有错误提示,但是是不影响导出的。...
|--原 阿里云免费申请SSL证书
2020年3月21号记录首先登陆阿里云SSL证书,网址 https://www.aliyun.com/product/cas点击购买证书,选择免费版,然后选择立即购买,费用0,勾选同意服务协议,点支...
2020年3月21号记录
首先登陆阿里云SSL证书,网址 https://www.aliyun.com/product/cas
点击购买证书,选择免费版,然后选择立即购买,费用0,勾选同意服务协议,点支付,再点确认支付。提示支付成功。请登录控制台,申请证书,签发成功后,可安装到网站/APP/邮箱等使用。...
|--原 【采集代码】采集代码实例
这里记录一些采集代码的实例 20200328另外之前python采集的代码放那里了,2014还是2013搞的记不清了,有空重新写下。QueryList采集Curl类采集curl函数采集
这里记录一些采集代码的实例 20200328 ...
|--原 PHP的exec()函数无返回值排查方法(必看)--php调用python脚本实例
php exec()函数执行一个外部程序遇到的问题。 20200328 exec()执行外部命令失败,但没有任何错误信息。 gather.py的代码如下 # coding=utf-8 ...
php exec()函数执行一个外部程序遇到的问题。 20200328
exec()执行外部命令失败,但没有任何错误信息。
gather.php和gather.py同目录下
gather.py的代码如下
# coding=utf-8 #设置页码编码,解决中文乱码 import re import requests #注意这里增加引入了sys库 20200404 import sys #模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6' } url = 'https://wokan.chawen.org/post/' + sys.argv[1] #requests获取网页 respose = requests.get(url, headers=headers) content = respose.text #获取内容 #保存采集的内容到文件 filename = 'test.txt' f = open(filename, 'w', encoding='utf-8') ##ffilename可以是原来的txt文件,也可以没有然后把写入的自动创建成txt文件 f.write(content) f.close()
exec执行某命令在命令行下没有问题,但是在php中就出错。这个问题99.99%与权限有关,但是exec执行的命令不会返回错误。一个技巧就是使用管道命令,gather.php(和gather.py同目录下)的exec代码如下: ...
|--原 修改phpmyadmin中的默认登陆超时时间
在WEB服务器(apache,nginx,iis)的文件根目录下找到phpMyAdmin / libraries / config.default.php 文件,打开修改$cfg['LoginCookieValidity'] = 1440;将1440修改成更大...
在WEB服务器(apache,nginx,iis)的文件根目录下找到phpMyAdmin / libraries / config.default.php 文件,打开修改
$cfg['LoginCookieValidity'] = 1440;
将1440修改成更大的值即可。...
|--转 phpMyAdmin配置文件现在需要一个短语密码的解决方法
在登陆phpMyAdmin后发现最下面有如下信息提示:配置文件现在需要一个短语密码。 如下图:首先,在 phpMyAdmin 文件中找到一个文件“config.sample.inc.php”,这是...
在登陆phpMyAdmin后发现最下面有如下信息提示:配置文件现在需要一个短语密码。
如下图:
首先,在 phpMyAdmin 文件中找到一个文件“config.sample.inc.php”,这是phpMyAdmin配置文件的样本文件,我们需要把该文件复制,然后重命名为“config.inc.php”,config.inc.php是phpMyAdmin的配置文件,上传服务器时必须上传该文件。
然后用编辑器打开 config.inc.php 搜索下面一行代码:
$cfg['blowfish_secret'] = '';
将后面单引号里面随便填入个字符串即可!(注意,要至少32位的字符串)( 其实,’blowfish_secret’用一个任意字符串作为cookie的加密字符串,如果没有加密钥匙,就会出现提示“配置文件现在需要绝密的短语密码(blowfish_secret)”。 )...
|--原 centos7 安装phpmyadmin
如果能的话尽量yum安装
php71w ,Mysql5.7 安装phpMyAdmin,用yum安装失败,下面介绍下载安装包并解压的方法
1.官网https://www.phpmyadmin.net/downloads/下载phpMyAdmin压缩包
wget -c https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.zip
2.解压缩到/var/www/html/
unzip phpMyAdmin-5.0.2-all-languages.zip -d /var/www/html
3.重命名
2 |
|
这一步一般都可以正常通过localhost/phpMyAdmin访问了,但是有时候总会出现些其他问题。
4.进入到phpMyAdmin安装目录下复制phpmyadmin的简单配置文件config.sample.inc.php,作为默认配置文件config.inc.php
复制文件
cp config.sample.inc.php config.inc.php
编辑配置文件
vim config.inc.php
配置文件现在需要一个短语密码,找到
2 3 | $cfg['blowfish_secret'] = ''; //这里随意添加几个字符太短会有错误提示。... 浏览更多内容请先登录。
立即注册 |
|--原 python脚本传递参数
import sys print(sys.argv[0]) print(sys.argv[1]) #表示传入的第一个参数 temp = sys.argv[1] + 'TEST' print(temp)
运行脚本 ...
|--转 Redis 知识点整理
原文链接:https://yuanmomo.net/2019/07/02/redis-interview/#more
2019-07-02 2020-04-091. Redis 数据结构
- 主要的数据类型:
- 扩展数据类型
- Pub/Sub 简单的发布/订阅,当订阅的 key 的值有变化的时候,会通知到订阅的客户端,回调。
- HyperLogLog: 基数统计(B 树,bitmap,概率算法(LC,LLC,HLL)),统计一个大的集合(可能出现重复数据)中不同元素的个数。比如网站的 UV,链接访问的 UV,以及做合并的功能,还有留存。
- Geo 地址位置信息
- Redis Module : Redis 拓展模块
- BloomFilter: 布隆过滤器,快速判断一个元素是否在集合中。
- 就是一个很长的二进制 bit 位的数组,全部初始化为 0.
- K 个 hash 函数,每个 hash 函数会生成一个 hash 值。这个 hash 值对应了二进制 数组的某个点,然后将这个点标记为 1.
- 查询一个数据存在不存在时,需要判断 这 K 个点的位置是否都未为 1.
- 布隆过滤器添加元素
- 将要添加的元素给k个哈希函数
- 得到对应于位数组上的k个位置
- 将这k个位置设为1
- 布隆过滤器查询元素
- 将要查询的元素给k个哈希函数
- 得到对应于位数组上的k个位置
- 如果k个位置有一个为0,则肯定不在集合中
- 如果k个位置全部为1,则可能在集合中
- 优点: 是占用空间小,效率高。
- 缺点: 有误判,不允许删除。如果需要删除,可以CBF,每一位是一个 counter,不再是0和1两种结果。
- RedisSearch
- Redis-ML,
- BloomFilter: 布隆过滤器,快速判断一个元素是否在集合中。
2. Redis 分布式锁
- setnx抢锁,然后设置一个 过期时间。不能先 set 抢锁,再 expire,必须保证原子性。
- spring-data-redis:2.1版本后,使用 setIfAbsent(K key, V value, long timeout, TimeUnit unit) 方法来实现。
3. Redis 查找指定格式的 key
- 如果使用 keys ,但是会卡住 redis,因为 redis 是单线程的。所以可以用 scan,但是会有重复,需要客户端做一次去重复。
4. Redis 做异步队列
- 一般用 list 作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,适当的 sleep 一定的时间再重试,如果不用 sleep。可以用 blpop 命令,如果没有消息,会一直阻塞到消息来为止。
- 通过 pub/sub 订阅者模式 来做一次生产,多次消费,可以实现 1:N 的消息队列。pub/sub 的缺点是,在消费者下线过后,生产的消息会丢失,如果需要保证不丢失,需要使用 MQ.
- redis 实现延时队列,用时间戳做 score,消息内容做 member, 然后通过 ZADD 添加消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询处理。不过不建议,太占用内容。队列还是建议使用 MQ, Kafka
5. key 的过期时间
- 如果有大量的 key 在同一个时间过期,防止 redis 暂时的卡顿,在时间上面加一个随机值,使得过期时间分散一些。
6. Redis 持久化
- http://oldblog.antirez.com/post/redis-persistence-demystified.html
- 持久化方式:
- RDB 指定间隔时间的某个时间点的快照。
- AOF 持久化操作日志。当 redis 重启的时候,需要根据 AOF 的 log 文件来重构数据。AOF 日志文件是redis 的自定义格式。当 AOF文件太大,redis 会重写该日志文件,减少命令数,但是结果一致。比如多次累加一个 key 100次。aof 就会有100条语句,BGREWRITEAOF会精简命令。
- 可以禁用 redis 的持久化,只要我们想让我们的数据只在 redis 运行时存在。
- 可以同时使用 AOF 和 RDB 来持久化 redis 中的数据。需要注意的是,此时,Redis 重启时,AOF 的日志文件会被用来重构 redis 中的数据,以此来保证数据的完整性。
- RDB 做全量持久化,AOF 做增量持久化。RDB 每次消耗的时间长,down 机时,会丢失两次持久化之间的数据。所以,需要配合 AOF 来使用。Redis 重启时,先用 RDB 持久化的文件重构内存,然后使用 AOF 回放最近的操作指令来实现完整恢复重启之前的状态。
- 对于突然断电的结果,取决于 AOF 刷新日志到磁盘的时间间隔 sync。建议是 1s 刷新一次。
- RDB 的原理,就是 fork & COW. fork 过后,子进程和父进程共享数据段,此时,可以看做没有占用额外的内存开销。当父进程的数据有修改时,才会复制一份到子进程保存。所以,只有在极限情况,所有的父进程数据有修改,及其的物理内存使用率才会是 50%。
- RDB 的优点是重启快,缺点是会丢失数据,备份一次的时间长。AOF 的优点是可以做到不丢失数据或者丢失很少的数据,但是重启很慢,因为需要重新根据日志来构建 redis 数据。所以往往是 RDB 和 AOF 搭配使用。
7. Pipline
- Pipline 的好处是可以将多次 IO 减少为 1次。前提是这些之类之间没有因果相关性
8. Redis 的同步机制
- Redis 可以使用主从同步,从从同步。
- 启动时,做第一次同步,主节点做一次 rdb,同时将后续修改操作放入 buffer,待 rdb 完成后。将 rdb 文件全量同步到 从节点,从节点接受完成后讲 rdb 镜像加载到内存。加载完成后,再通知主节点讲期间修改的 缓存 buffer 发送过来。
- 以上是第一次启动时候的同步,当机器都启动完成后,后面通过 AOF 做同步就是近乎实时。
9. Redis 集群
Redis-sentinal 是着眼于高可用性。在 master down 机时,能在 slave 中选举一个新的 master,继续提供服务。Redis-cluster 着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。...
|--转 phpmyadmin 给用户设置指定数据库的权限
|--转 解决Apache+PHP服务器提示HTTP 500问题
https://blog.csdn.net/qq_38388715/article/details/78693463
使用APACHE+PHP时,通过URL浏览网站时可能会提示HTTP 500错误,这使得新手无从下手,因为看不到具体的错误信息。及时查看APACHE的ERROR LOG也只是记录了一条500错误信息而已。
要解决问题首先要知道问题所在,所以必须知道更详细的问题描述才行。其实只需要配置php.ini即可。在php的安装目录中找到php.ini文件并打开,找到display_errors,默认情况下是display_errors = Off,把Off修改为On,保存关闭文件,然后重启apache。...
|--转 解决php版本超过7.2后Call to undefined function mcrypt_get_block_size的办法 安装mcrypt扩展
由于mcrypt扩展在php7.2 弃用,所以需要继续使用这个扩展的话需要自行编译mcrypt扩展。
https://blog.csdn.net/xavi_2010/article/details/107150572
CentOS下php安装mcrypt扩展
安装mcrypt
先确认你的php和pecl版本
[root@lyafei ~]# php -v
PHP 7.2.26 (cli) (built: Dec 31 2019 17:01:19) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
[root@lyafei ~]# pecl version
PEAR Version: 1.10.10
PHP Version: 7.2.26
Zend Engine Version: 3.2.0
确认你的linux有没有安装mcrypt库
[root@lyafei ~]# yum list installed | grep mcrypt
libmcrypt.x86_64 2.5.8-13.el7 @epel
libmcrypt-devel.x86_64 2.5.8-13.el7 @epel
mcrypt.x86_64 2.6.8-11.el7 @epel
以上显示已经安装过,若没有则按以下两种方式安装:
(方法一)yum命令安装
yum install libmcrypt libmcrypt-devel mcrypt mhash
执行后会显示即将安装的相关库,你可以根据你的 linux 限定 x86_64 或者 i386,如 yum install libmcrypt.x86_64(如果 yum 命令无法连接仓库,请检查你的 /etc/yum.repos.d/ 里的文件正确性,以及你的 /etc/host 是不是可达里面的域名)
确定安装,最后显示
Installed:
libmcrypt.x86_64 0:2.5.8-13.el7.centos
libmcrypt-devel.x86_64 0:2.5.8-13.el7.centos
mcrypt.x86_64 0:2.6.8-11.el7
mhash.x86_64 0:0.9.9-1.el7.rf
Complete!
(方法二)源码编译安装
去http://www.sourceforge.net下载 libmcrypt,mhash,mcrypt安装包...
|--转 php 触发脚本不等待返回的方法之curl
public function set_cache_log(){ $host = "https://****.com.cn/index.php?s=/moudle/controller/function/id/12"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $host); cu如果希望php访问一下网址,但不需要返回结果,如:需要执行很长时间的页面,不用等待返回结果,只需要执行了就可以了,办法之一:
使用CURL需要设置CUROPT_TIMEOUT为1(最小为1)。也就是说,客户端至少必须等待1秒钟。