admin管理员组

文章数量:1026227

Spider

 

一:自我介绍???

  使用reqeusts模块,可以帮助我们模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷。

  requests模块的本质:封装了urllib3。

 

  注意:requests库发送请求将网页下载下来之后,并不会执行js代码,这就需要我们自己分析目标站点然后发起新的request请求。

 

  安装:pip3 install requests

 

  requests库下的各种请求方式:

    - 常用的就是requests.get() & requests.post()

>>> import requests
>>> r = requests.get('')
>>> r = requests.post('', data = {'key':'value'})
>>> r = requests.put('', data = {'key':'value'})
>>> r = requests.delete('')
>>> r = requests.head('')
>>> r = requests.options('')

 

二:关于GET请求

1:基本请求

import requests
response=requests.get('')
print(response.text)

 

2:带参数的GET请求->params

#在请求头内将自己伪装成浏览器,否则百度不会正常返回页面内容
import requests
response=requests.get('=python&pn=1',headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
print(response.text)#如果查询关键词是中文或者有其他特殊符号,则不得不进行url编码
from urllib.parse import urlencode
wd='ff'
encode_res=urlencode({'k':wd},encoding='utf-8')
keyword=encode_res.split('=')[1]
print(keyword)
# 然后拼接成url
url='=%s&pn=1' %keywordresponse=requests.get(url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
res1=response.text自己拼接GET参数

3:params参数的使用

#上述操作可以用requests模块的一个params参数搞定,本质还是调用urlencode
from urllib.parse import urlencode
wd='ff'
pn=1response=requests.get('/',params={'wd':wd,'pn':pn},headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
res2=response.text#验证结果,打开a.html与b.html页面内容一样
with open('a.html','w',encoding='utf-8') as f:f.write(res1) 
with open('b.html', 'w', encoding='utf-8') as f:f.write(res2)

4:带参数的GET请求->cookies

#登录github,然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,无需输入用户名密码
#用户名:12321321 邮箱123213213 密码123213import requestsCookies={   'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc',
}response=requests.get('',cookies=Cookies) #github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制print('ugfly@qq' in response.text) #True

 

三:基于POST请求

1:介绍

 

#GET请求
HTTP默认的请求方法就是GET* 没有请求体* 数据必须在1K之内!* GET请求数据会暴露在浏览器的地址栏中GET请求常用的操作:1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求2. 点击页面上的超链接也一定是GET请求3. 提交表单时,表单默认使用GET请求,但可以设置为POST#POST请求
(1). 数据不会出现在地址栏中
(2). 数据的大小没有上限
(3). 有请求体
(4). 请求体中如果存在中文,会使用URL编码!#!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据

 

 

 

2:发送POST请求,模拟浏览器的登录行为

  我的小婊贝们,对于登录这个行为来说。你想一想,如果用户名和密码输对了,浏览器只要跳转了,你还分析个啥?抓得到包吗?能知道人家网站给你的密码加密成啥了吗?有理有据对不对????

  

'''
一 目标站点分析浏览器输入,抓包发现登录行为是post提交到::commit:Sign inutf8:✓authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==login:ffpassword:123二 流程分析先GET::, 带上初始cookie,带上请求体(authenticity_token,用户名,密码等)最后拿到登录cookieps:如果密码时密文形式,则可以先输错账号,输对密码,然后到浏览器中拿到加密后的密码,github的密码是明文
'''import requests
import re#第一次请求
r1=requests.get('')
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'ugfly@qq','password':'iloveyou'
}
r2=requests.post('',data=data,cookies=r1_cookie)login_cookie=r2.cookies.get_dict()#第三次请求:以后的登录,拿着login_cookie就可以,比如访问一些个人配置
r3=requests.get('',cookies=login_cookie)print('ugfly@qq' in r3.text) #True

自动登录github(自己处理cookie信息)

 

requests.session()自动帮我们保存cookie信息

import requests
import resession=requests.session()
#第一次请求
r1=session.get('')
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求
data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'ugfly@qq','password':'doyouloveme'
}
r2=session.post('',data=data,)#第三次请求
r3=session.get('')print('ugfly@qq' in r3.text) #True

requests.session()自动帮我们保存cookie信息

 

3:补充

 

requests.post(url='xxxxxxxx',data={'xxx':'yyy'}) #没有指定请求头,#默认的请求头:application/x-www-form-urlencoed#如果我们自定义请求头是application/json,并且用data传值, 则服务端取不到值
requests.post(url='',data={'':1,},headers={'content-type':'application/json'})requests.post(url='',json={'':1,},) #默认的请求头:application/json

 

四:响应Response


1:response属性

import requests
respone=requests.get('')
# respone属性
print(respone.text)
print(respone.content)print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.cookies.items())print(respone.url)
print(respone.history)print(respone.encoding)#关闭:response.close()
from contextlib import closing
with closing(requests.get('xxx',stream=True)) as response:for line in response.iter_content():pass

 

2:编码问题

#编码问题
import requests
response=requests.get('')
# response.encoding='gbk' #汽车之家网站返回的页面内容为gb2312编码的,而requests的默认编码为ISO-8859-1,如果不设置成gbk则中文乱码
print(response.text)

 

3:获取二进制数据

import requestsresponse=requests.get(';quality=80&size=b9999_10000&sec=1509868306530&di=712e4ef3ab258b36e9f4b48e85a81c9d&imgtype=0&src=http%3A%2F%2Fc.hiphotos.baidu%2Fimage%2Fpic%2Fitem%2F11385343fbf2b211e1fb58a1c08065380dd78e0c.jpg')with open('a.jpg','wb') as f:f.write(response.content)

  获取二进制流

#stream参数:一点一点的取,比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的import requestsresponse=requests.get('.mp4',stream=True)with open('b.mp4','wb') as f:for line in response.iter_content():f.write(line)获取二进制流

 

4:json相关

#解析json
import requests
response=requests.get('')import json
res1=json.loads(response.text) #太麻烦

res2=response.json() #直接获取json数据print(res1 == res2) #True

 

5:History

import requests
import re#第一次请求
r1=requests.get('')
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'test@qq','password':'111'
}#测试一:没有指定allow_redirects=False,则响应头中出现Location就跳转到新页面,r2代表新页面的response
r2=requests.post('',data=data,cookies=r1_cookie)print(r2.status_code) #200
print(r2.url) #看到的是跳转后的页面
print(r2.history) #看到的是跳转前的response
print(r2.history[0].text) #看到的是跳转前的response.text#测试二:指定allow_redirects=False,则响应头中即便出现Location也不会跳转到新页面,r2代表的仍然是老页面的response
r2=requests.post('',data=data,cookies=r1_cookie,allow_redirects=False)print(r2.status_code) #302
print(r2.url) #看到的是跳转前的页面
print(r2.history) #[]

利用github登录后跳转到主页面的例子来验证它

 

五:高级用法

1:SSL Cert Verification

#证书验证(大部分网站都是https)
import requests
respone=requests.get('') #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端#改进1:去掉报错,但是会报警告
import requests
respone=requests.get('',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)#改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('',verify=False)
print(respone.status_code)#改进3:加上证书
#很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
#知乎\百度等都是可带可不带
#有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone=requests.get('',cert=('/path/server.crt','/path/key'))
print(respone.status_code)

 

2:使用代理

#官网链接: :先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
import requests
proxies={'http':'http://ff:123@localhost:9743',#带用户名密码的代理,@符号前是用户名与密码'http':'http://localhost:9743','https':'https://localhost:9743',
}
respone=requests.get('',proxies=proxies)print(respone.status_code)#支持socks代理,安装:pip install requests[socks]
import requests
proxies = {'http': 'socks5://user:pass@host:port','https': 'socks5://user:pass@host:port'
}
respone=requests.get('',proxies=proxies)print(respone.status_code)

 

3:超时设置

#超时设置
#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时  0.2代表接收数据的超时时间import requests
respone=requests.get('',timeout=0.0001)

 

4:认证设置

#官网链接::登陆网站是,弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的
# 但本质原理是拼接成请求头发送
#         r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
# 一般的网站都不用默认的加密方式,都是自己写
# 那么我们就需要按照网站的加密方式,自己写一个类似于_basic_auth_str的方法
# 得到加密字符串后添加到请求头
#         r.headers['Authorization'] =func('.....')#看一看默认的加密方式吧,通常网站都不会用默认的加密设置
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)#HTTPBasicAuth可以简写为如下格式
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)

 

5:异常处理

#异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型try:r=requests.get('',timeout=0.00001)
except ReadTimeout:print('===:')
# except ConnectionError: #网络不通
#     print('-----')
# except Timeout:
#     print('aaaaa')except RequestException:print('Error')

 

6:上传文件

import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('',files=files)
print(respone.status_code)

 

 

 

 

 

 

转载于:.html

Spider

 

一:自我介绍???

  使用reqeusts模块,可以帮助我们模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷。

  requests模块的本质:封装了urllib3。

 

  注意:requests库发送请求将网页下载下来之后,并不会执行js代码,这就需要我们自己分析目标站点然后发起新的request请求。

 

  安装:pip3 install requests

 

  requests库下的各种请求方式:

    - 常用的就是requests.get() & requests.post()

>>> import requests
>>> r = requests.get('')
>>> r = requests.post('', data = {'key':'value'})
>>> r = requests.put('', data = {'key':'value'})
>>> r = requests.delete('')
>>> r = requests.head('')
>>> r = requests.options('')

 

二:关于GET请求

1:基本请求

import requests
response=requests.get('')
print(response.text)

 

2:带参数的GET请求->params

#在请求头内将自己伪装成浏览器,否则百度不会正常返回页面内容
import requests
response=requests.get('=python&pn=1',headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
print(response.text)#如果查询关键词是中文或者有其他特殊符号,则不得不进行url编码
from urllib.parse import urlencode
wd='ff'
encode_res=urlencode({'k':wd},encoding='utf-8')
keyword=encode_res.split('=')[1]
print(keyword)
# 然后拼接成url
url='=%s&pn=1' %keywordresponse=requests.get(url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
res1=response.text自己拼接GET参数

3:params参数的使用

#上述操作可以用requests模块的一个params参数搞定,本质还是调用urlencode
from urllib.parse import urlencode
wd='ff'
pn=1response=requests.get('/',params={'wd':wd,'pn':pn},headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
res2=response.text#验证结果,打开a.html与b.html页面内容一样
with open('a.html','w',encoding='utf-8') as f:f.write(res1) 
with open('b.html', 'w', encoding='utf-8') as f:f.write(res2)

4:带参数的GET请求->cookies

#登录github,然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,无需输入用户名密码
#用户名:12321321 邮箱123213213 密码123213import requestsCookies={   'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc',
}response=requests.get('',cookies=Cookies) #github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制print('ugfly@qq' in response.text) #True

 

三:基于POST请求

1:介绍

 

#GET请求
HTTP默认的请求方法就是GET* 没有请求体* 数据必须在1K之内!* GET请求数据会暴露在浏览器的地址栏中GET请求常用的操作:1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求2. 点击页面上的超链接也一定是GET请求3. 提交表单时,表单默认使用GET请求,但可以设置为POST#POST请求
(1). 数据不会出现在地址栏中
(2). 数据的大小没有上限
(3). 有请求体
(4). 请求体中如果存在中文,会使用URL编码!#!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据

 

 

 

2:发送POST请求,模拟浏览器的登录行为

  我的小婊贝们,对于登录这个行为来说。你想一想,如果用户名和密码输对了,浏览器只要跳转了,你还分析个啥?抓得到包吗?能知道人家网站给你的密码加密成啥了吗?有理有据对不对????

  

'''
一 目标站点分析浏览器输入,抓包发现登录行为是post提交到::commit:Sign inutf8:✓authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==login:ffpassword:123二 流程分析先GET::, 带上初始cookie,带上请求体(authenticity_token,用户名,密码等)最后拿到登录cookieps:如果密码时密文形式,则可以先输错账号,输对密码,然后到浏览器中拿到加密后的密码,github的密码是明文
'''import requests
import re#第一次请求
r1=requests.get('')
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'ugfly@qq','password':'iloveyou'
}
r2=requests.post('',data=data,cookies=r1_cookie)login_cookie=r2.cookies.get_dict()#第三次请求:以后的登录,拿着login_cookie就可以,比如访问一些个人配置
r3=requests.get('',cookies=login_cookie)print('ugfly@qq' in r3.text) #True

自动登录github(自己处理cookie信息)

 

requests.session()自动帮我们保存cookie信息

import requests
import resession=requests.session()
#第一次请求
r1=session.get('')
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求
data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'ugfly@qq','password':'doyouloveme'
}
r2=session.post('',data=data,)#第三次请求
r3=session.get('')print('ugfly@qq' in r3.text) #True

requests.session()自动帮我们保存cookie信息

 

3:补充

 

requests.post(url='xxxxxxxx',data={'xxx':'yyy'}) #没有指定请求头,#默认的请求头:application/x-www-form-urlencoed#如果我们自定义请求头是application/json,并且用data传值, 则服务端取不到值
requests.post(url='',data={'':1,},headers={'content-type':'application/json'})requests.post(url='',json={'':1,},) #默认的请求头:application/json

 

四:响应Response


1:response属性

import requests
respone=requests.get('')
# respone属性
print(respone.text)
print(respone.content)print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.cookies.items())print(respone.url)
print(respone.history)print(respone.encoding)#关闭:response.close()
from contextlib import closing
with closing(requests.get('xxx',stream=True)) as response:for line in response.iter_content():pass

 

2:编码问题

#编码问题
import requests
response=requests.get('')
# response.encoding='gbk' #汽车之家网站返回的页面内容为gb2312编码的,而requests的默认编码为ISO-8859-1,如果不设置成gbk则中文乱码
print(response.text)

 

3:获取二进制数据

import requestsresponse=requests.get(';quality=80&size=b9999_10000&sec=1509868306530&di=712e4ef3ab258b36e9f4b48e85a81c9d&imgtype=0&src=http%3A%2F%2Fc.hiphotos.baidu%2Fimage%2Fpic%2Fitem%2F11385343fbf2b211e1fb58a1c08065380dd78e0c.jpg')with open('a.jpg','wb') as f:f.write(response.content)

  获取二进制流

#stream参数:一点一点的取,比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的import requestsresponse=requests.get('.mp4',stream=True)with open('b.mp4','wb') as f:for line in response.iter_content():f.write(line)获取二进制流

 

4:json相关

#解析json
import requests
response=requests.get('')import json
res1=json.loads(response.text) #太麻烦

res2=response.json() #直接获取json数据print(res1 == res2) #True

 

5:History

import requests
import re#第一次请求
r1=requests.get('')
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
data={'commit':'Sign in','utf8':'✓','authenticity_token':authenticity_token,'login':'test@qq','password':'111'
}#测试一:没有指定allow_redirects=False,则响应头中出现Location就跳转到新页面,r2代表新页面的response
r2=requests.post('',data=data,cookies=r1_cookie)print(r2.status_code) #200
print(r2.url) #看到的是跳转后的页面
print(r2.history) #看到的是跳转前的response
print(r2.history[0].text) #看到的是跳转前的response.text#测试二:指定allow_redirects=False,则响应头中即便出现Location也不会跳转到新页面,r2代表的仍然是老页面的response
r2=requests.post('',data=data,cookies=r1_cookie,allow_redirects=False)print(r2.status_code) #302
print(r2.url) #看到的是跳转前的页面
print(r2.history) #[]

利用github登录后跳转到主页面的例子来验证它

 

五:高级用法

1:SSL Cert Verification

#证书验证(大部分网站都是https)
import requests
respone=requests.get('') #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端#改进1:去掉报错,但是会报警告
import requests
respone=requests.get('',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)#改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('',verify=False)
print(respone.status_code)#改进3:加上证书
#很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
#知乎\百度等都是可带可不带
#有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone=requests.get('',cert=('/path/server.crt','/path/key'))
print(respone.status_code)

 

2:使用代理

#官网链接: :先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
import requests
proxies={'http':'http://ff:123@localhost:9743',#带用户名密码的代理,@符号前是用户名与密码'http':'http://localhost:9743','https':'https://localhost:9743',
}
respone=requests.get('',proxies=proxies)print(respone.status_code)#支持socks代理,安装:pip install requests[socks]
import requests
proxies = {'http': 'socks5://user:pass@host:port','https': 'socks5://user:pass@host:port'
}
respone=requests.get('',proxies=proxies)print(respone.status_code)

 

3:超时设置

#超时设置
#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时  0.2代表接收数据的超时时间import requests
respone=requests.get('',timeout=0.0001)

 

4:认证设置

#官网链接::登陆网站是,弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的
# 但本质原理是拼接成请求头发送
#         r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
# 一般的网站都不用默认的加密方式,都是自己写
# 那么我们就需要按照网站的加密方式,自己写一个类似于_basic_auth_str的方法
# 得到加密字符串后添加到请求头
#         r.headers['Authorization'] =func('.....')#看一看默认的加密方式吧,通常网站都不会用默认的加密设置
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)#HTTPBasicAuth可以简写为如下格式
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)

 

5:异常处理

#异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型try:r=requests.get('',timeout=0.00001)
except ReadTimeout:print('===:')
# except ConnectionError: #网络不通
#     print('-----')
# except Timeout:
#     print('aaaaa')except RequestException:print('Error')

 

6:上传文件

import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('',files=files)
print(respone.status_code)

 

 

 

 

 

 

转载于:.html

本文标签: Spider