web学习001
pycharm专业版
PHPstudy环境搭建
官网下载安装phpstudy后主界面
- 网站根目录
开启服务,打开其他选项菜单,网站根目录
本地网站的一切都在这也可以找到安装路径里的WWW文件夹
前些天搭建的DVWA也没怎么做,过几天再说吧
- host配置
- 其他选项菜单打开host配置文件
- 浏览器里可以访问本地页面了也就是WWW文件夹里的东西
- 数据库登录
密码root- PHPadmin页面
PHP基础
1.开始结束标记<? ... ?>
2.定义变量: 变 量 名 例 : 变量名 例: 变量名例:str=“锦清笋”;不需要指明数据类型
3.输出语句:
(1)echo “hello world!”;—echo命令
(2)print();输出语句,是函数,有返回值。输出成功返回1,失败返回0。
(3)printf();格式化输出字符串。例:printf("%d,%f",12,12.3);
(4)sprintf();格式化拼接字符串,不是输出语句,只能将字符串拼接。
(5)print_r();输出数组、对象等复合数据类型
4.数据类型:
(1)简单数据类型:
Boolean
布尔型
string
字符串型
integer
整型
float
浮点型
(2)复合数据类型:
array
数组
object
对象
(3)特殊数据类型:
resource
资源
null
空值
5.数据类型转换:
在变量前加上括号括起来的类型名称即可。
6.检测数据类型:
is_bool 检查变量是否是布尔类型
is_string …
is_float或is_double …
is_integer 或 is_int …
is_null …
is_array …
is_object …
is_numeric 检测变量是否为数组或由数字组成的字符串
7.声明和使用常量:
定义语法:define(‘PRICE’,100);
echo
PRICE;
8.变量作用域:
局部变量:即在函数的内部定义的变量,其作用域是所在的函数
全局变量:即被定义在所有函数以外的变量,其作用域是整个php文件,但是在用户定义的函数内部不可用。想在用户定义的函数内部使用全局变量,要使用global关键词声明。
例:$a=123;
function test()
{
global
$a;
echo
$a;
}
静态变量:能够在函数调用结束后仍保留变量值,当再次回到其作用域时,又可以继续使用原来的值。使用静态变量时,先要用关键字static来声明变量,需要把关键字static放在要定义的变量之前。
9.预定义变量:通过预定义变量可以获取用户会话、用户操作系统的环境和本地操作系统的环境等信息。如:
G L O B A L S , GLOBALS, GLOBALS,_SERVER, G E T , _GET, GET,_POST, R E Q U E S T , _REQUEST, REQUEST,_COOKIE, S E S S I O N , _SESSION, SESSION,_FILES.
10.字符串运算符:句号:“.”;连接字符串
特别是拼写sql语句时:".$变量名."
11.逻辑运算符:逻辑异或:^或xor 当一个为真,一个为假时,结果为真,其他为假。
恒等:===
优先级:||在and之前,or在and之后。
12.@错误屏蔽:@错误屏蔽运算符可以对程序中出现错误的表达式进行操作,进而对错误进行屏蔽,其使用的方法就是在错误的表达式前加“@”即可。它只是对错误信息进行屏蔽,并没有真正解决错误。
13.定义和调用函数:函数名不区分大小写
function test( v a r 1 , var1, var1,var2)
{
函数体
}
test( v a r 1 , var1, var1,var2);
函数的返回值:使用return返回单个值,和使用list()语言结构返回多个值。
传值调用:$变量名
传址调用:&$变量名
14.Form表单:
两种提交方式:get:将表单数据当做url的一部分传过去;url格式:http://地址:端口/目录/文件?var1=value1&…varn=valuen最长1024k
post:相比get而言,更安全,并不会导致因数据过长而引起url的数据丢失
使用超链接传值时必须用get来接收:ADD 接收: u i d = uid= uid=_GET[“uid”];
注意:<?=...?>的格式只有在没有判断语句时才能使用。
对表单传递的变量进行编码和解码:PHP中实现对查询字符串进行URL编码可以通过函数urlencode()实现,该函数的使用格式如下:string urlencode(string str);对URL编码后的查询字符串进行解码,可以通过urldecode()函数实现,该函数的使用格式如下:string urldecode(string str);
15.PHP连接数据库:
步骤: 一、建立连接------mssql_connect(server,uid,pwd);
二、指定database-------mssql_select_db(databasename);
三、执行sql------mssql_query($sql,$link);
四、处理记录集-------资源类型数据,格式:bof---数据---eof
五、以特定格式读取数据-----mssql_fetch_array()....
六、释放相关资源、关闭连接------mssql_free_result($result);mssql_close();
16.数组:php的数组由键值和value值组成
定义:$array = array(“键值”=>“value”,“键值”=>“value”,“键值”=>“value”);如果不给键值赋值,默认从0开始的int值
相关函数:(1)in_array(“值”,数组名); 返回bool型-----查看数组中是否存在某value值
(2)array_key_exists("key值",数组名); 返回bool型-----查看数组中是否存在某键值
(3)array_keys(数组名);---将数组键值返回出来形成一个新数组,此键值作为新数组的value值
(4)array_values(数组名);---将数组value值返回出来形成一个新数组,此值作为新数组的value值
(5)key(数组名);----返回当前指针指向的元素key值
(6)current(数组名);----返回当前指针指向的元素value值
(7)next(数组名);----挪动当前数组指针到下一步
(8)reset(数组名);----恢复数组指针,指向第0个元素
(9)end(数组名);----将指针挪向最后一个元素
(10)prev(数组名);----将指针向前挪动一位
(11)foreach(数组名 as $key=>$value)
{
$key是键值,$value是value值,实现数组遍历
}
(12)each(数组名);----将当前数组元素依次取出(自动挪动指针)并放到一个新的数组中
(13)array_shift(数组名);----返回数组中第一个元素值
(14)array_pop(数组名);----返回数组最后一个元素值
(15)array_push(数组名,value);----向数组中追加元素
(16)array_unshift(数组名,value);----在数组最前面添加元素
(17)array_pad(数组名,数组长度,value);----向数组中追加多个元素,对数组副本操作,不改变原数组,返回一个新数组
(18)count();----返回个数
(19)array_unique(数组名);----去掉数组中重复部分,操作数组副本,不改变原数组,返回新数组
(20)sort(数组名);----从小到大升序排列数组value值,一般针对int型value值,返回bool型,成功返回true
(21)rsort(数组名);----从大到小,逆序排列数组value值
(22)array_combine(数组1,数组2);----将数组1的value值作为key,数组2的value值作为value值,形成一个新数组
(23)array_merge(数组1,数组2,数组3...);----合并多个数组,将多个数组value值依次合并,合为一个数组
(24)array_slice(数组名,int,int);----从目标数组截取元素,形成一个新数组。开始位置为第二个参数,结束位置为第三个参数。若第三个参数不写,则默认是截取到最后。
(25)array_splice();----用法同array_slice();但是其截取部分从原数组中删除
(26)explode("字符依据",目标字符串);----将字符串按照一定的依据拆分成数组
(27)implode("字符依据",目标数组);----将数组元素按照依据组合成一个字符串
(28)range(mixed low,mixed high[number step]);----生成数组,例:range(1,100,8);---即从1到100,每8位取一个数,组成一个数组
(29)shuffle(数组名);----用于将数组进行随机排序
(30)array_sum(数组名);----对数值型数组元素值进行求和
Python爬虫
一、 爬虫前奏
爬虫实际例子:
- 搜索引擎百度谷歌360搜索
- 伯乐在线
- 惠惠购物助手(爬取各大购物商城的商品历史价格)
- 数据分析与研究(数据冰山知乎专栏)
- 抢票软件
什么是网络爬虫:
1.通俗理解:爬虫是一个模拟人类请求网站行为的程序,可以自动请求网页、可以自动请求网页、并数据抓取下来,然后使用一定的规则提取有价值的数据。
2.专业介绍:百度百科。
通用爬虫和聚焦爬虫:
1、通用爬虫:通用爬虫是搜索引擎抓取系统(百度、谷歌、搜狗)的重要组成。主要是将互联网上的网页下载到本地形成一个互联网内容的镜像备份
2、聚焦爬虫:是面向特定需求的一种网络爬虫程序,它与通用爬虫的区别是:聚焦爬虫在实施网页抓取的时候会对内容进行筛选和处理,尽量保证只抓取与需求相关的网页信息
工具:
Python3.6
pycharm 2017 专业版
虚拟环境virtualenv
二、http协议和谷歌抓包工具
一、http超文本传输协议、端口号80.
https:是http协议的加密版本 加了ssl层 端口号443
http请求:get post
输入URL时浏览器发送一个request请求服务器去获取URL的HTML文件 ,返回response文件
network 使用
二、URL的详解(略)
scheme host port(浏览器自动加上端口号) path ?后面的是查询字符串 锚点定位#2.。。。。。 URL编码除英文字母数字和部分字符外全是url编码balabala
三、http请求方式:
get post 的介绍
四、常见响应码:
200 请求正常
301 永久重新定向
302 临时重定向
400 请求的url在服务器上找不到
403 服务器拒绝访问
500 服务器的内部错误
五、常见请求参数:
1、user-agent 浏览器名称
2、referer:
3、cookie:
三、urllib库
1-urllib库之urlopen函数的用法 (获取网页源代码)
encoding:utf-8
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())
readlines() readline() getcode read(size)
2-urlretrieve函数的应用
这个函数可以方便的将网页上的一个文件保存到本地
from urllib import request
reap = request.urlretrieve(‘http://www.baidu.com/’, ‘baidu.html’)
将百度页面保存到本地
可以用来下载图片等等文件
3、urllib库之参数编码和解码函数
urlencode函数:
用浏览器发送请求,如果URL中包含中文或者其他特殊字符,呢么浏览器会自动进行url编码
from urllib import parse
params = {'name': '张三', 'age': 18, 'greet': 'hello world'}
result = parse.urlencode(params)
print(result)
例子:
from urllib import request
from urllib import parse
url = 'http://www.baidu.com/s'
params = {"wd": "刘德华"}
qs = parse.urlencode(params)
print(qs)
url = url + "?" + qs
print(url)
resp = request.urlopen(url)
print(resp.read())
parse_qs解码函数的用法:
params = {'name': '张三', 'age': 18, 'greet': 'hello world'} qs = parse.urlencode(params) print(qs) result = parse.parse_qs(qs) print(result)
4、urllib库之urlparse和urlsplit函数用法:
urlparse
from urllib import parse,request
url = 'http://www.baidu.com/s?wd=python&username=abc#3'
result = parse.urlparse(url)
print(result)
url = 'http://www.baidu.com/s?wd=python&username=abc#3'
result = parse.urlparse(url)
print(result)
print('scheme:', result.scheme)
print('netloc:', result.netloc)
print('path:', result.path)
print('query:',result.query)
url = 'http://www.baidu.com/s?wd=python&username=abc#3'
a = parse.urlsplit(url)
print(a)
urlparse和urlsplit基本是一样的,唯一不一样的地方就是urlparse多了一项params
5、实战用request爬取拉勾网职位信息
request.Request类
6、内涵段子爬虫作业
7、ProxyHander实现代理ip(代理设置)
很多网站会监测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,他会禁止这个IP的访问urllib中通过ProxyHander来设置使用代理服务器,下面代码说明如何使用自定义
handler = request.ProxyHandler(“http://httpbin.org/get”)
opener来使用代理
opener = request.build_opener(handler)
resp = opener.open(“http”)
print(resp.read())
通过代理服务器进行访问实现间接获取
常见代理:
西制免费代理:http://www.xicidaili.com
快代理:http://kuaidaili.com
代理云:http://dailiyun.com/
- httpbin.org的应用:
可以查看当前访问外网的IP地址
代码实现不使用代理
resp = request.urlopen('http://httpbin.org/get')
print(resp.read().decode("utf-8"))
不使用代理可以看到当前的IP是本机IP地址。
代码实现使用代理:
url = 'http://httpbin.org/ip'
handler = request.ProxyHandler({"http": "111.196.138.41:57114"})
opener = request.build_opener(handler)
resp = opener.open(url)
print(resp.read())
url = ‘http://httpbin.org/ip’
- 使用’urllib.request.ProxyHandler’,转入一个代理,这个代理是一个字典,字典的key依赖于服务器能够接收的类型,一般是“http或者https“
handler = request.ProxyHandler({“http”:“182.92.113.148:8118”}) - 使用上一步创建的handler构建一个opener
opener = request.build_opener(handler) - 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())
8、cookie原理和格式详解
Set-Cookie:NAME=VALUE;Expires/Max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
参数含义:
- NAME:cookie的名字
- VALUE:cookie的值
- Expires:cookie的过期时间
- Path:cookie作用的路径
- Domain:cookie作用的路径
- SECURE:是否只在http写一下起作用
9、爬虫使用cookie模拟登陆
人人网为例。要访问个人的主页,必须先登录才能访问,登录说白了就是要有cookie的信息,呢么用代码的方式登录就必须有cookie的信息才能访问。解决的方法有两种:1、先使用浏览器进行访问,然后将cookie信息复制下来,放到header中。代码如下:
# 不使用cookie访问主页
dapeng_url = "http://www.renren.com/880151247/profile"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0"
}
req = request.Request(url=dapeng_url, headers=headers)
resp = request.urlopen(req)
with open('renren.html', 'w') as fp:
fp.write(resp.read().decode('utf-8'))
在没有cookie的情况下发现不是进入的大鹏的页面而是登录页面
dapeng_url = "http://www.renren.com/880151247/profile"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0",
"Cookie":"anonymid=jq0sc577-jnkkr2; depovince=JS; "
"_r01_=1; ick_login=7de6ecec-8f55-4528-90df-5b9271e49a16; "
"jebecookies=b9eec176-d2c9-44d3-a498-fddfb2ff5df9|||||; _"
"de=632B698C8FAFDA942B05F5485F875D6F; p=aa257b76467c304932fd1eb21e5523af0; first_login_flag=1; "
"ln_uact=13160062997; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif;"
" t=4a51d052592237c2b2730ef37af5617f0; "
"societyguester=4a51d052592237c2b2730ef37af5617f0; id=969213220; "
"xnsid=2540ecc6; loginfrom=syshome; "
"jebe_key=32231eef-9625-4cc8-8359-72b557b50055%7Cdc2d6da5813981295d39194456729f27%7C1545563220435%7C1%7C1545563220147; "
"wpsid=15235560196851"
}
req = request.Request(url=dapeng_url, headers=headers)
resp = request.urlopen(req)
with open('renren.html', 'w',encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8'))
使用cookie信息登录
10、爬虫自动登录访问授权页面
http.cookiejar模块:
这模块的主要类有CookieJar、FileCookieJar、MozillaCookieJar
1 CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
2 FileCookieJar:从CookieJar中派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据
3 MozilaCookieJar:从FileCookieJar派生出来,创建与火狐浏览器cookies.txt相兼容的FileCookieJar实例。
4 LWPCookieJar:从FileCookieJar派生而来,创建与libwww-per标准的Set-Cookie3文件格式兼容的FileCookieJar实例
代码:
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
# 1、登录
# 1.1 创建一个cookieJar对象
cookiejar = CookieJar()
# 1.2 使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
# 1.3 使用上一步创建的handler创建一个opener
opener = request.build_opener(handler)
# 1.4 使用opener发送登录请求(人人网的邮箱和密码)
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
" AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3610.2 Safari/537.36"
}
data = {
'email': "",
'password': ""
}
login_url = "http://www.renren.com/PLogin.do"
req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
opener.open(req)
# 访问主页
dapeng_url = "http://www.renren.com/880151247/profile"
# 获取个人主页的页面的时候,不要新建一个opener
req = request.Request(dapeng_url, headers=headers)
resp = opener.open(req)
with open('renren.html', 'w', encoding='utf-8')as fp:
fp.write(resp.read().decode('utf-8'))
11、cookie信息的加载与保存
保存cookie到本地
保存cookie到本地,可以使用cookiejar的save方法,并且需要指定一个文件名:
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar("cookie.txt")
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
req = request.Request('http://httpbin.org/cookies',headers=headers)
resp = opener.open(req)
print(resp.read())
cookiejar.save(ignore_discard=True,ignore_expires=True)
从本地加载cookie信息
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar("cookie.txt")
cookiejar.load(ignore_expires=True,ignore_discard=True)
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
req = request.Request('http://httpbin.org/cookies',headers=headers)
resp = opener.open(req)
print(resp.read())
四、requests库
1、安装requests和中文文档
中文文档:http://docs.python-requests.org/zh_CN/latest/index.html
github地址:https://github.com/requests/requests
2、发送GET请求:
最简单的发送get请求就是通过requests.get来调用:
response = requests.get("http://www.baidu.com/")
print(response.content.decode('utf-8'))
print(response.url)
print(response.encoding)
3、response.text和response.content的区别
- response.content:是直接从网络上抓取的数据,没有经过任何解码。所也是一个bytes类型,其实在键盘上和网络上传输的字符都是bytes类型。
- response.text:这个是str的数据类型,是将response.content进行解码的字符串。解码需要指定一个编码方式。所以有的时候可能会猜测错误,就会导致解码产生乱码,这时候就应该使用
response.content.decode('utf-8')
进行手动编码。
5、request发送post请求
- 最基本的post请求可以使用post方法:
https://www.json.cn/ 解码网站
import requests
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Referer':'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
}
data = {
'first':'true',
'kd':'python',
'pn':1
}
request = requests.post('https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
, data=data, headers=header)
print(request.text)~