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
版权声明:本文标题:Spider 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1725676730a564044.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论