安全矩阵

 找回密码
 立即注册
搜索
楼主: Pluto

李佳瑞学习日记

[复制链接]

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-25 00:15:13 | 显示全部楼层
今天看了Event事件,下面是event事件的基础
<!DOCTYPE html>
<html>
        <head>
                <meta charset="utf-8" />
                <title></title>
                <script type="text/javascript">
                        /*
                         *   event :事件 :事件对象,当一个事件发生的时候,和当前的对象以及事件的详细信息都会被系统临时存到一个地方 - event
                         *   event :系统内部存在的,已经定义好的;
                         *   
                         * */
//                        var event;
//                        alert(event);
/*
                        function sub() {
                                alert(event);
                                return 0;
                        }
                       
                        //  事件函数 : 事件对象、事件发生 - 过程(函数)-> event
                        window.onload = function(ev) {
                               
                                alert(ev);
                               
//                                如果一个函数是被事件调用的那么,这个函数定义的第一个参数就是事件对象
                               
                                        // 点击事件
                        var btn = document.getElementById('btn');
                        btn.onclick = function(ev) {  // 事件函数
                               
                                var ev = ev || event;
                               
                               
                                alert("a");
                        //  注意:事件对象、事件一般与函数连用,才有效果
                               // 2、 event : 事件对象 必须在事件调用函数中才有内容;
                        }
                       
                                //  ie/谷歌中 : ev
                                // 其他浏览器中 : event
                               
                               
                               
                        }
                        //  函数的调用;
                        sub();
                       
                */       
               
               
                function fn1(ev) {
                       
                        var ev = ev || event;
                       
                       
                        // 输出 事件对象内容
//                        for(var attr in ev) {
//                               
//                               
//                                console.log(attr + '=' + ev[attr]);
//                        }
//                       
                        alert(ev.clientX);
                       
                }
                // 事件函数
        document.onclick = fn1;
                       
                       
                </script>
        </head>
        <body>
                <input type="button" id="btn" value="按钮" />
        </body>
</html>
下面是event事件的实践
<!DOCTYPE html>
<html>
        <head>
                <meta charset="utf-8" />
                <title></title>
                <script type="text/javascript">
                        window.onload = function() {
                               
                                var odiv = document.getElementById('div1');
                               
                               
//                                onmousemove : 鼠标移动的时候调用的事件
                                document.onmousemove = function(ev) {
                                        var ev = ev || event;
                                       
                                       
                                        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
                                       
                                        odiv.style.left = ev.clientX + 'px';
                                        odiv.style.top = ev.clientY + scrollTop + 'px';
                                       
                       
                                }
                               
                        }
                </script>
        </head>
        <body style="height: 3000px;">
                <div id="div1" style="width: 100px;height: 100px;background: red;position: absolute;">
                       
                </div>
               
        </body>
</html>
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-26 00:39:51 | 显示全部楼层
今天看了一下PHP,看了最基础的内容
PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
PHP 文件的默认文件扩展名是 ".php"

PHP 可以生成动态页面内容
PHP 可以创建、打开、读取、写入、关闭服务器上的文件
PHP 可以收集表单数据
PHP 可以发送和接收 cookies
PHP 可以添加、删除、修改您的数据库中的数据
PHP 可以限制用户访问您的网站上的一些页面
PHP 可以加密数据
通过 PHP,您不再限于输出 HTML。您可以输出图像、PDF 文件,甚至 Flash 电影。您还可以输出任意的文本,比如 XHTML 和 XML。
在看的过程中看到了cookies,觉得它蛮有用的,了解了它的含义以及如何工作的,感觉与网络协议有点联系。
与学习python类似,首先学习它的基本语法,PHP 脚本可以放在文档中的任何位置。
PHP 脚本以 <?php 开始,以 ?> 结束:
<?php
// PHP 代码
?>
PHP 文件的默认文件扩展名是 ".php"。
PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码。
以hello word为例输出
<!DOCTYPE html>
<html>
<body>

<?php
echo "Hello World!";
?>

</body>
</html>
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。
<!DOCTYPE html>
<html>
<body>

<?php
// 这是 PHP 单行注释

/*
这是
PHP 多行
注释
*/
?>

</body>
</html>
变量是用于存储信息的"容器":
<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>
PHP 变量规则:
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP 没有声明变量的命令。
变量在第一次赋值给它的时候被创建:
例如:
<?php $txt="Hello world!"; $x=5; $y=10.5; ?>
在上面的语句执行中,变量 txt 将保存值 Hello world!,且变量 x 将保存值 5。
注释:当赋一个文本值给变量时,要在文本值两侧加上引号。
PHP 是一门弱类型语言
在上面的实例中,我们注意到,不必向 PHP 声明该变量的数据类型。
PHP 会根据变量的值,自动把变量转换为正确的数据类型。
在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。
变量的作用域是脚本中变量可被引用/使用的部分。
PHP 变量作用域
PHP 有四种不同的变量作用域:
local
global
static
parameter
局部和全局作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问:
<?php
$x=5; // 全局变量

function myTest()
{
    $y=10; // 局部变量
    echo "<p>测试函数内变量:<p>";
    echo "变量 x 为: $x";
    echo "<br>";
    echo "变量 y 为: $y";


myTest();

echo "<p>测试函数外变量:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
?>
在以上实例中 myTest() 函数定义了 $x 和 $y 变量。 $x 变量在函数外声明,所以它是全局变量 , $y 变量在函数内声明所以它是局部变量。
当我们调用myTest()函数并输出两个变量的值, 函数将会输出局部变量 $y 的值,但是不能输出 $x 的值,因为 $x 变量在函数外定义,无法在函数内使用,如果要在一个函数中访问一个全局变量,需要使用 global 关键字。
然后我们在myTest()函数外输出两个变量的值,函数将会输出全局变量 $x 的值,但是不能输出 $y 的值,因为 $y 变量在函数中定义,属于局部变量。
PHP global 关键字
global 关键字用于函数内访问全局变量。
在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字:
<?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); echo $y; // 输出 15 ?>

PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
上面的实例可以写成这样:
<?php $x=5; $y=10; function myTest() { $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y']; } myTest(); echo $y; ?>


Static 作用域
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。
要做到这一点,请在您第一次声明变量时使用 static 关键字:
<?php function myTest() { static $x=0; echo $x; $x++; echo PHP_EOL; // 换行符 } myTest(); myTest(); myTest(); ?>


然后,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。
注释:该变量仍然是函数的局部变量。

参数作用域
参数是通过调用代码将值传递给函数的局部变量。
参数是在参数列表中声明的,作为函数声明的一部分:
<?php function myTest($x) { echo $x; } myTest(5); ?>
1、定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。
2、函数内定义的变量就是局部变量,它的作用域为函数定义范围内。
3、函数之间存在作用域互不影响。
4、函数内访问全局变量需要 global 关键字或者使用 $GLOBALS[index] 数组
在 php 中函数是有独立的作用域,所以局部变量会覆盖全局变量,即使局部变量中没有全局变量相同的变量,也会被覆盖。如下:
<?php
$a=5;
$b=3;function t(){
    echo $a-$b; // 输出 0}
t();?>
要想在函数中直接使用全局变量可以通过 global 关键字声明或者通过 php 中自定义的 $GLOBALS 数组获取:
<?php
$a=5;
$b=3;function t1(){  
    global $a,$b;
    echo $a-$b;  // 输出 2}
t1();

echo PHP_EOL;
function t2(){
    echo $GLOBALS['a']-$GLOBALS['b'];  // 输出 2}
t2();?>
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-27 00:32:17 | 显示全部楼层
(EOF的作用明白,但不知道什么时候需要它)
这几天学习PHP都是通过菜鸟课程,因此笔记也都是菜鸟上面的,一边看,一边记。觉得自己再敲一次能加深记忆。总体上来说,感觉学了HTML之后,学习这个没有碰到什么问题。
在 PHP 中有两个基本的输出方式: echo 和 print。
echo 和 print 区别:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1

echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()。
例子:
<?php echo "<h2>PHP 很有趣!</h2>"; echo "Hello world!<br>"; echo "我要学 PHP!<br>"; echo "这是一个", "字符串,", "使用了", "多个", "参数。"; ?>
如何使用 echo 命令输出变量和字符串,例子:
<?php $txt1="学习 PHP"; $txt2="RUNOOB.COM"; $cars=array("Volvo","BMW","Toyota"); echo $txt1; echo "<br>"; echo "在 $txt2 学习 PHP "; echo "<br>"; echo "我车的品牌是 {$cars[0]}"; ?>
PHP print 语句
print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()。
显示字符串
下面的实例演示了如何使用 print 命令输出字符串(字符串可以包含 HTML 标签):
<?php print "<h2>PHP 很有趣!</h2>"; print "Hello world!<br>"; print "我要学习 PHP!"; ?>
显示变量
下面的实例演示了如何使用 print 命令输出变量和字符串:
<?php $txt1="学习 PHP"; $txt2="RUNOOB.COM"; $cars=array("Volvo","BMW","Toyota"); print $txt1; print "<br>"; print "在 $txt2 学习 PHP "; print "<br>"; print "我车的品牌是 {$cars[0]}"; ?>
PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。
使用概述:
1. 必须后接分号,否则编译通不过。
2. EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
4. 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
5. 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
实例
<?php
echo <<<EOF
        <h1>我的第一个标题</h1>
        <p>我的第一个段落。</p>
EOF;
// 结束需要独立一行且前后不能空格
?>
注意:
1.以 <<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。
2.开始标记和结束标记相同,比如常用大写的 EOT、EOD、EOF 来表示,但是不只限于那几个(也可以用:JSON、HTML等),只要保证开始标记和结束标记不在正文中出现即可。
3.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在 heredoc 中,变量不需要用连接符 . 或 , 来拼接,如下:
实例
<?php
$name="runoob";
$a= <<<EOF
        "abc"$name
        "123"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
上面的看懂了怎么使用,看懂了他的语法,但是不清楚他的作用,希望以后可以搞清楚
1.PHP 定界符 EOF 的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
2.在 PHP 定界符 EOF 中的任何特殊字符都不需要转义;
3.PHP 定界符 EOF
数据类型与python基本一样都是String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)。这里就不整理了,简单的看了一下
PHP var_dump() 函数返回变量的数据类型和值
数组的运行结果有点晕,不是很明白


PHP 对象(这个和python面向对象有点像)
对象数据类型也可以用于存储数据。
在 PHP 中,对象必须声明。
首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。
然后我们在类中定义数据类型,然后在实例化的类中使用数据类型:
看是能看懂,没有自己去尝试一些新的例子感觉还是不熟练,明天我会复习一下这两天学的。
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-28 01:07:55 | 显示全部楼层
今天满课,而且作业很多,很晚才开始看的PHP,今天没看新的东西,把PHP语法到数据类型重新看了一遍,发现了很多问题,有很多东西自己不会,之前却没有注意
第一个是null可以清空变量数据
<!DOCTYPE html>
<html>
<body>

<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>

</body>
</html>
之前没有注意到,今天运行了一下发现结果是null,仔细想了一下才明白他的作用,昨天直接以为null的数据类型是null没有细看,忽略了上面的$x=“hello word”
第二个是PHP对象的,昨天我也以为他和python中的面向对象很像,今天自己看了才发现,很不一样,而且有些地方看不懂
这是源代码:
<!DOCTYPE html>
<html>
<body>

<?php
class Car
{
    var $color;
    function __construct($color="green") {
      $this->color = $color;
    }
    function what_color() {
      return $this->color;
    }
}

function print_vars($obj) {
   foreach (get_object_vars($obj) as $prop => $val) {
     echo "\t$prop = $val\n";
   }
}

// 实例一个对象
$herbie = new Car("white");

// 显示 herbie 属性
echo "\therbie: Properties\n";
print_vars($herbie);

?>  

</body>
</html>
这是结果:
herbie: Properties color = white
第一个是
function __construct($color="green") {
      $this->color = $color;
    }
通过百度了解到 这是通过类命名构造函数
__construct() 函数创建一个新的 SimpleXMLElement 对象。
如果成功,则该函数返回一个对象。如果失败,则返回 false。
<?php
class Car
{
var $color; //定义一个颜色变量
function Car($color="green") { //定一个方法,默认为绿色
$this -> color = $color; //将传入的值赋予给上面定义的变量
}
function what_clolr() {
return $this -> color; //返回被赋予后的值,上面的方法不调用,下面的颜色也为空。
}
}
var $color;//声明汽车的颜色属性
function Car($color = "green") {//汽车类的构造函数(new时调用),默认颜色参数值为绿色
$this->color = $color;//将汽车的颜色属性值设置为传入的颜色
}
function what_color() {//获取汽车颜色的方法
return $this->color;//返回汽车的颜色属性值
}
这是通过百度查的,把每行代码分析了一下。再查资料的时候发现
查阅资料,发现php7.0之后将不再支持与类名相同的构造方法,构造方法统一使用 __construct()。
我就好好看了一下__construct()函数
语法
__construct(data,options,is_url,ns,is_prefix)

参数        描述
data        必需。形式良好的 XML 字符串或 XML 文档的路径或 URL。
options        可选。规定附加的 Libxml 参数。
is_url        可选。规定 data 参数是否是 URL。默认是 false。
ns        可选。
is_prefix        可选。
基础太差,没怎么看懂data,options,is_url,ns,is_prefix
今天有点晚了,不能熬夜太晚,明天起来好好理解一下。
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-28 23:08:32 | 显示全部楼层
老师的任务是通过python采集qq或者微信朋友圈的信息,我查了想一下资料,内容比较复,不仅需要学习爬虫,还要获取朋友圈的数据入口,网上的代码比较复杂,所以今天简单的看了一下爬虫的基础。
先了解了一下什么是爬虫,下面是通过学习整理的笔记
爬虫是模拟浏览器发送网络请求,接收响应,按照一定的规则,自动抓取网络信息的程序

大数据时代需要大量的数据,这些数据从何而来
1 第三方公司购买
2 去免费的数据网站下载
3 人工收集(地铁站扫码送礼品)
4 爬虫

用途:
抢票软件
投票
、、、

爬虫的分类(被爬网站数量的不同进行的分类)
1 通用爬虫: 搜索引擎的爬虫(baidu)
2 聚焦抛出: 针对特定网站的爬虫

流程  
1找到目标url==>2发送请求==》3得到响应==》4提取你想要的信息==》5保存到数据库

Robots 协议君子协议
网站通过robost协议告诉搜索引擎那些页面可以抓取,那些不能抓取,它只是互联网中的一般约定。


Http和 https
为什么回顾: 在发送请求的时候实际上就是发送的http或者https请求,得到响应同理

什么是http和https
http: 超文本传输协议
  默认端口80
https: 超文本传输协议 + SSl(安全套)   带有安全套的超文本传输协议
  默认端口443

浏览器发送http请求的过程:




(复习)http和 https
原因:由于我们发送请求或者是获取响应在这个过程中 就是发送http或者https的请求,获取http或者https的响应http
http:  超文本传输协议
https: http + ssl(安全套接字层) 带安全套的超文本传输协议
https 安全性能好,性能低


浏览器发送请求的过程

http请求的过程
1  浏览器向地址栏中的url发送请求,并的到响应
2  在返回的响应中,会有css,js图片等还有ajax代码, 浏览器按照响应内容的顺序依次发送请求,并得到响应。
3  浏览器每次得到响应就将结果展示出来
4  从获取第一个响应到最后一个并且每次得到结果都在浏览器展示这个过程叫做浏览器的渲染


注意点 爬虫只会请求url, 对应的拿到url地址对应的(响应),大多时候和浏览器看到的不一样。
所以 在爬虫中需要以url地址对应的响应为准进行数据的提取

请求的形式






字符串相关的操作(python3中的)
1 str :unicode形式呈现
2 bytes: 字节型


str转bytes 使用encode()
str1 = 'sdf'
# print(type(str1))
# <class 'str' >
# print(type(str1.encode()))
# <class 'bytes' >

bytes转str 使用decode()
bytes1 = b'asf'
# print(type(bytes1))
# <class 'bytes' >
print(type(bytes1.decode()))
<class 'str'>

注意点我们使用什么方式编码使用什么方式解码


扩展:
字符集编码类型:
字符:各种文字和符号的总称(全球的)
字符集:有字符构成,十多个字符的集合。 其中有ASCII、 GB312 、GB18030、Unicode等字符集


回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-29 23:45:27 | 显示全部楼层
今天看的是PHP和爬虫,都看了一些,PHP内容主要根据菜鸟教程学习,因此笔记我就不复制了,只是把有问题的写进来,爬虫是找的一些视频学习的,我会把笔记写进来
爬虫的:
中文文档 : https://cn.python-requests.org/zh_CN/latest/

为什么学习requests模块
1 底层就是urllib
2 py2 和py3 通用
3 简单
4 能自动帮我们解压响应的内容(gzip)


# response 常用的一些属性
# print(response.text) # 响应体str类型
# print(response.content) # 响应体 bytes类型
# print(response.content.decode())  # 响应体 bytes类型使用decode()得到str类型
# print(response.status_code) # 响应的状态码
# print(response.request.headers) # 响应对应的请求头(目标服务器看到我们的请求头部的信息)
# 浏览器的:user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
# 代码的: 'User-Agent': 'python-requests/2.22.0',
# print(response.headers) 响应头的信息
# print(response.cookies) 响应的cookies
# print(response.request.cookies) 请求的cookies


通过下面的三种方法能100%解决网页编码问题
response.text # 自动根据http头部的编码做出有根据的退出,退出文本的编码
response.content.decode('GBK')
response.content.decode()









为什么请求要携带header
模拟浏览器,欺骗服务器,获取更多的内容

Headers的用法
Requests.fet(url, headers=headers)

Heades的形式
字典的形式存在
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"}


请求参数
https://www.baidu.com/s?wd=pytho ... =8037&rsv_sug=1

https://www.baidu.com/s?wd=python
我们从1和2得到的结果是一样的所以我们确定在url中有些参数是没有用的

什么是请求参数
在url中?后面的使用&连接的 就是请求参数

请求参数的形式: 字典
user_params = {
            "wd": self.user_params
        }


用法:
1 直接放在url中
2 使用 params进行传参
3 多个请求参数 requests 接收的params参数为多个键值对的字典


例子: 获取搜狐/新浪首页查看携带headers和不懈怠的区别


获取多页的数据
https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=150   第四页
https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100   第三页
https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50    第二页
https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0     第一页
得到的规律  第几页的内容对应pn在变   pn=(页数-1)*50

可以获取多页的信息也可以获取指定页数的信息还可以获取指定贴吧的信息


总结
1 requests模块的介绍  能够帮我们发送请求获取响应
2基本的使用 requests.get(url)
3 常见的属性
 print(response.text) # 响应体str类型
# print(response.content) # 响应体 bytes类型
# print(response.content.decode())  # 响应体 bytes类型使用decode()得到str类型
# print(response.status_code) # 响应的状态码
# print(response.request.headers) # 响应对应的请求头(目标服务器看到我们的请求头部的信息)
# 浏览器的:user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
# 代码的: 'User-Agent': 'python-requests/2.22.0',
# print(response.headers) 响应头的信息
# print(response.cookies) 响应的cookies
# print(response.request.cookies) 请求的cookies

4了解过response 响应的方法
conten属于bytest类型
response.text # 自动根据http头部的编码做出有根据的退出,退出文本的编码
response.content.decode('GBK')
response.content.decode()
5 可以伪装浏览器发送请求 headers
Requests.get(url, headers=headers)

6请求参数
Requests.get(url, headers=headers, params={})

Headers,params 都是以字典的形式存在
源码**kwargs


PHP:
使用常量时,不能在常量名前添加$ 符号,不然会将常量转换成新的未定义变量使用,会导致报错。
<?php
define('LOG','OPEN');//定义常量,常量使用不能添加$
echo $LOG;?>
运行结果:
Notice: Undefined variable: LOG in D:\Program Files\apache-tomcat-7.0.75\webapps\myweb\test.php on line 3
PHP 并置运算符
在 PHP 中,只有一个字符串运算符。
并置运算符 (.) 用于把两个字符串值连接起来。
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
结果是Hello world! What a nice day!
<?php
echo strlen("中文字符");   // 输出 12?>
输出结果为 12,因为一个中文占 3 个字符数。
可以使用 mb_strlen 设置指定编码输出中文字符个数:
<?php echo mb_strlen("中文字符",'utf-8'); // 输出 4 ?>
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-30 21:52:05 | 显示全部楼层
今天是对爬虫的基础练习
# 使用requests模块进行爬虫的学习(初次使用)
import requests

# 准备目标的url
baidu_url = 'https://www.baidu.com'

# 想指定url发送请求
response = requests.get(url=baidu_url)

# 打印结果(响应的内容)
print(response.text)




# 如何查看一些请求或者响应的信息(深入使用)
import requests


# 准备目标的url
baidu_url = 'https://www.baidu.com'

# 想指定url发送请求
response = requests.get(url=baidu_url)

# 打印结果(响应的内容)
# response 常用的一些属性
# print(response.text) # 响应体str类型
# print(response.content) # 响应体 bytes类型
# print(response.content.decode())  # 响应体 bytes类型使用decode()得到str类型
# print(response.status_code) # 响应的状态码
# print(response.request.headers) # 响应对应的请求头(目标服务器看到我们的请求头部的信息)
# 浏览器的:user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
# 代码的: 'User-Agent': 'python-requests/2.22.0',
# print(response.headers) 响应头的信息
# print(response.cookies) 响应的cookies
# print(response.request.cookies) 请求的cookies
下载百度图片
import requests


    def load_baidu_image():
        # 准备url
        url = 'https://www.baidu.com/img/bd_logo1.png'

        # 发送请求 content得到的是bytes类型的
        response = requests.get(url).content

        # 写入本地文件
        with open('baidu_image.png', 'wb') as f:
            f.write(response)


    if __name__ == '__main__':
        load_baidu_image()
requests携带headers
import requests


# 不带headers
class BaiduUrlData(object):

    def __init__(self):
        self.baidu_url = 'https://www.baidu.com'
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"}

    def send_request(self):
        """发送请求"""
        #  携带user-agent 以后的代码必须携带, 将我们的代码伪装成浏览器。
        #  而且伪装的相似度越高越好
        res = requests.get(url=self.baidu_url, headers=self.headers)
        response = res.content.decode()
        return response

    def save_file(self, data):
        """将响应的内容写入文件"""
        with open('baidu_url2.html', 'w', encoding='utf-8') as f:
            f.write(data)

    def main(self):
        """调度方法"""
        self.save_file(self.send_request())


if __name__ == '__main__':
    BaiduUrlData().main()

明天看完基础之后会进行实例操作
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-3-31 23:58:06 | 显示全部楼层
今天主要是练习,将之前的理论转化为实践,通过查阅资料,找到了一个例题,就是获取某贴吧某页信息,代码如下
import requests


class TiebaSpider(object):
    """获取指定贴吧的信息
    用户输入什么,我们就去搜索什么的信息
    """

    def __init__(self):
        self.user_params = input('请输入你要搜索的贴吧')
        self.url = 'https://tieba.baidu.com/f'
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"}

    def send_request(self, params):
        """发送请求"""
        data = requests.get(url=self.url, headers=self.headers,
                            params=params).content.decode()
        return data

    def save_file(self, data):
        """写入当前的文件"""
        with open('tieba2.html', 'w', encoding='utf-8') as f:
            f.write(data)

    def main(self):
        """调度方法"""
        # 构造请求参数
        user_params = {
            'kw': self.user_params,
            'pn': 50
        }
        self.save_file(self.send_request(user_params))


if __name__ == '__main__':
    TiebaSpider().main()
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-2 00:00:31 | 显示全部楼层


Json 在线解析工具
www.json.cn

X-Requested-With: XMLHttpRequest  ajax请求


post请求(为什么)
1一些关键的数据必须登录
2 传输大文本的内容(POST对数据的长度没有限制)
用法:
Requests.post(url, headers=headers, data=data)
data字典的形式

爬虫使用cookie的作用
可以发送get请求直接登录,不用账号和密码
开实现部分的反反爬

使用方法
1 在headers中携带
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
               "Cookie": "anonymid=juzm79va-x03gqk; _r01_=1; __utma=151146938.1980998033.1562678160.1562678160.1562684150.2; __utmz=151146938.1562684150.2.2.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/SysHome.do; depovince=GW; JSESSIONID=abc_4rwb6Izg1dwTzTl6w; ick_login=94bc72db-8ea9-4062-bf95-11be7ef69687; first_login_flag=1; ln_uact=13522544918; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20190115/1510/main_rzqN_0a8e00002018195a.jpg; jebe_key=159a7cf3-f312-4a23-9171-7dbe7f8e2f41%7C021eab1936db44c0143f9c5e982dd6c2%7C1574302019911%7C1%7C1574302024449; _de=CB7DEF5A50C453AA3982328FA1810782; jebecookies=62057c21-0bfb-492b-a98e-185b25367803|||||; p=dec2e7171e29076ed2ea0984a74421f22; t=0f266f825f84da3f9be1b3d9da1ac7fb2; societyguester=0f266f825f84da3f9be1b3d9da1ac7fb2; id=499121422; xnsid=734fab61; ver=7.0; loginfrom=null; wp_fold=0"
    }

    # 发送请求
    res = requests.get(url, headers=headers).content.decode()

2 把cookie以字典的形式 传给请求方法的cookie  
cookies = 'anonymid=juzm79va-x03gqk; _r01_=1; __utma=151146938.1980998033.1562678160.1562678160.1562684150.2; __utmz=151146938.1562684150.2.2.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/SysHome.do; depovince=GW; JSESSIONID=abc_4rwb6Izg1dwTzTl6w; ick_login=94bc72db-8ea9-4062-bf95-11be7ef69687; first_login_flag=1; ln_uact=13522544918; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20190115/1510/main_rzqN_0a8e00002018195a.jpg; jebe_key=159a7cf3-f312-4a23-9171-7dbe7f8e2f41%7C021eab1936db44c0143f9c5e982dd6c2%7C1574302019911%7C1%7C1574302024449; _de=CB7DEF5A50C453AA3982328FA1810782; jebecookies=62057c21-0bfb-492b-a98e-185b25367803|||||; p=dec2e7171e29076ed2ea0984a74421f22; t=0f266f825f84da3f9be1b3d9da1ac7fb2; societyguester=0f266f825f84da3f9be1b3d9da1ac7fb2; id=499121422; xnsid=734fab61; ver=7.0; loginfrom=null; wp_fold=0'
    
    # 构造请求参数 将我们复制的cookie 转换为字典
    cookies_dict = {cook.split('=')[0]: cook.split('=')[1]
                    for cook in cookies.split('; ')}

    # 发送请求, 将转换喊的cookie 传递给cookie
    res = requests.get(url, headers=headers, cookies=cookies_dict).content.decode()

3 使用requests.session 处理cookie
session实际上是我们requests里面的一个类
功能:
1 保存cookie 将我们上一次请求的cookie保存并且在下一次请求自动携带
2 实现和服务器的长连接,加快请求。

url = 'http://www.renren.com/880151247/profile'
    login_url = 'http://www.renren.com/PLogin.do'

    # requests中的session会帮我们得到cookies的值
    session = requests.session()

    # 用户名和密码
    form_data = {
        'email': '自己的账号密码',
        "password": "自己的账号密码"
    }

    # 发送登录的请求数据
    session.post(url=login_url, headers=headers, data=form_data)

    # 发送请求, 将转换喊的cookie 传递给cookie
    res = session.get(url, headers=headers).content.decode()

如何得到请求地址和请求参数
http://www.renren.com/PLogin.do
    form_data = {
        'email': '13522544918',
        "password": "abc13522544918"
    }

1 一般请求数据是放在form表单中的

2 如果没有 ajax  action=’’
故意输入错误的密码出查看请求信息

3在network抓包的时候将我们的preserver_log勾选 可以看到前面的操作记录


我们有时候需要对得到的cookie中的velue进行修改获得查看
使用我们级需要将得到的cookie进行解析
response = requests.get('http://www.baidu.com')
#得到的是一个 <RequestsCookieJar[ < Cookie BDORZ = 27315 for .baidu.com/>] > 对象
cookie = response.cookies
# 将cookiejar转换为dict
dict_cookie = requests.utils.dict_from_cookiejar(cookie)

总结: post请求
需要携带参数 字典的形式传递给data变量

Cookie :
1放到请求头headers中
2字典的形式传递给cookies变量
3 使用session自动发送cookies

Cookiejar 如何转换为字典
原因1 查看
2 修改
方法 上面有

回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-3 00:06:37 | 显示全部楼层
本来今天打算写一下例子,但是在写的过程中发现自己有很多问题
首先是python中的面向对象,爬虫中有很多都需要这个知识点,我对他只是了解却不熟悉,很多需要写的,我都很迷,而且有些知道写什么却忘记了怎么写,今天复习了一下相关知识,明天打算也花时间返回去看一下,不仅看面向对象,我也会把其他的看一下,不然感觉效果不怎么好
今天主要看了一下cookie的相关内容


在chrome控制台中的resources选项卡中可以看到cookie的信息。
一个域名下面可能存在着很多个cookie对象。
name  字段为一个cookie的名称。
value  字段为一个cookie的值。
domain  字段为可以访问此cookie的域名。
非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成。
顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成。
二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。
顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取。
path  字段为可以访问此cookie的页面路径。 比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。
expires/Max-Age   字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。
Size  字段 此cookie大小。
http  字段  cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。
secure   字段 设置是否只能通过https来传递此条cookie
 


 
cookie操作在前端开发过程中经常遇到,当然如果只是用来存储一些简单用户数据,还是比较简单的,我们要做的可能只是设置cookie名,值,过期时间等,读取也只要根据cookie的名读取相应的cookie值就可以了。在复杂的应用中,光这些肯定就不够了。
cookie的属性
除了name(名)和value(值),cookie还有以下一些可选属性,用来控制cookie的有效期,作用域,安全性等:
expires属性
  指定了cookie的生存期,默认情况下cookie是暂时存在的,他们存储的值只在浏览器会话期间存在,当用户退出浏览器后这些值也会丢失,如果想让cookie存在一段时间,就要为expires属性设置为未来的一个用毫秒数表示的过期日期或时间点,expires默认为设置的expires的当前时间。现在已经被max-age属性所取代,max-age用秒来设置cookie的生存期。
如果max-age属性为正数,则表示该cookie会在max-age秒之后自动失效。浏览器会将max-age为正数的cookie持久化,即写到对应的cookie文件中。无论客户关闭了浏览器还是电脑,只要还在max-age秒之前,登录网站时该cookie仍然有效。
如果max-age为负数,则表示该cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该cookie即失效。max-age为负数的Cookie,为临时性cookie,不会被持久化,不会被写到cookie文件中。cookie信息保存在浏览器内存中,因此关闭浏览器该cookie就消失了。cookie默认的max-age值为-1。
‍如果max-age为0,则表示删除该cookie。cookie机制没有提供删除cookie的方法,因此通过设置该cookie即时失效实现删除cookie的效果。失效的Cookie会被浏览器从cookie文件或者内存中删除。
如果不设置expires或者max-age这个cookie默认是Session的,也就是关闭浏览器该cookie就消失了。
这里要说明一下:Session的cookie在ie6下,如果用户实在网页上跳转打开页面或新开窗口(包括target="_blank",鼠标右键新开窗口),都是在同一个Session内。如果用户新开浏览器程序或者说是进程再打开当前的页面就不是同一个Session。其他浏览器只要你Session存在,还是同一个Session,cookie还能共享。在前段时间的项目中ie6下吃了很大一个亏。
domain属性
  domain属性可以使多个web服务器共享cookie。domain属性的默认值是创建cookie的网页所在服务器的主机名。不能将一个cookie的域设置成服务器所在的域之外的域。
  例如让位于a.sodao.com的服务器能够读取b.sodao.com设置的cookie值。如果b.sodao.com的页面创建的cookie把它的path属性设置为"/",把domain属性设置成".sodao.com",那么所有位于b.sodao.com的网页和所有位于a.sodao.com的网页,以及位于sodao.com域的其他服务器上的网页都可以访问这个cookie。
path属性
  它指定与cookie关联在一起的网页。在默认的情况下cookie会与创建它的网页,该网页处于同一目录下的网页以及与这个网页所在目录下的子目录下的网页关联
secure属性
  它是一个布尔值,指定在网络上如何传输cookie,默认是不安全的,通过一个普通的http连接传输;
HttpOnly属性
  HttpOnly 属性限制了 cookie 对 HTTP 请求的作用范围。特别的,该属性指示用户代理忽略那些通过"非 HTTP" 方式对 cookie 的访问(比如浏览器暴露给js的接口)。注意 HttpOnly 属性和 Secure 属性相互独立:一个 cookie 既可以是 HttpOnly 的也可以有 Secure 属性。
  在前段时间的项目中我就用js去读取一个cookie,结果怎么都取不到这个值,最后查证这个cookie是httpOnly的,花了近2个小时,悲剧了。
cookie的传输
浏览器将cookie信息以name-value对的形式存储于本地,每当请求新文档时,浏览器将发送Cookie,目的是让Server可以通过HTTP请求追踪客户。所以从WEB性能的角度来说我们要尽量的减小cookie,以达到传输性能的最大化。
cookie的编码和解码
由于cookie的名/值中的值不允许包含分号,逗号和空格符,为了最大化用户代理和服务器的兼容性,任何被存储为 cookie 值的数据都应该被编码,例如用我们前端熟知的js全局函数encodeURIComponent编码和decodeURIComponent解码。
cookie作为客户端存储
前面说了每当请求新文档时,浏览器将发送Cookie到服务器,导致WEB性能下降。所以不建议将cookie作为客户端存储一种实现方案,替代方案参见:JavaScript本地存储实践(html5的localStorage和ie的userData)等。
同名的 cookie
同名的 cookie,不同的 domain 或不同的 path,属不同的 cookie;同名的 cookie,相同的 domain 且相同的 path,不同的 expires,属同一个 cookie。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:51 , Processed in 0.018103 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表