1. 代理
(1)透明代理
代理服务器将客户端的信息转发至目标访问对象,并没有完全隐藏客户端真实的身份。即服务器知道客户端使用了代理ip,并且知道客户端的真实ip地址
(2)普通匿名代理
代理服务器用自己的IP代替了客户端的真实IP,但是告诉了目标访问对象这是代理访问。
(3)高匿名代理
使用高匿名代理就可以隐藏自己的真实ip
你用别人的电脑,去访问你要的网站
03_代理、模拟登陆、重试/01_代理.py
import requests
"""
(1)透明代理
代理服务器将客户端的信息转发至目标访问对象,并没有完全隐藏客户端真实的身份。即服务器知道客户端使用了代理ip,并且知道客户端的真实ip地址
(2)普通匿名代理
代理服务器用自己的IP代替了客户端的真实IP,但是告诉了目标访问对象这是代理访问。
(3)高匿名代理
使用高匿名代理就可以隐藏自己的真实ip
你用别人的电脑,去访问你要的网站
"""
url = "https://www.baidu.com/"
proxie = {
"http":'117.95.214.75:4245'
}
response = requests.get(url=url,proxies=proxie)
# 解决乱码
response.encoding = response.apparent_encoding
print(response.text)
2. 模拟登陆
requests.session() 会话保持
说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象,求该网站的其他网页都会默认使用该session之前使用的cookie
等参数跨请求
请求不同的网站就是跨请求携带同样的cookie等参数
在什么时候进行使用:
1.需要爬虫保持登陆状态
2.爬虫需要携带一些特定的参数。比如购物网站的无登录状态下的推荐,主要是cookie HTTP API接口:
只需要我们进行请求调用,传递特定的数据后api会返回数据。数据格式大多为 json
注意:
先要进行session的实例化。实例化之后所有的请求都使用实例化的变量进行get/post方法调用。如: session.post()
requests.post()这种方法将不会携带之前的cookie等参数,相当于重新来过
03_代理、模拟登陆、重试/02_模拟登陆.py:
import requests
from requests.utils import dict_from_cookiejar
"""
"http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20201202950"
requests.session() 会话保持
说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象,求该网站的其他网页都会默认使用该session之前使用的cookie
等参数跨请求
请求不同的网站就是跨请求携带同样的cookie等参数
在什么时候进行使用:
1.需要爬虫保持登陆状态
2.爬虫需要携带一些特定的参数。比如购物网站的无登录状态下的推荐,主要是cookie HTTP API接口:
只需要我们进行请求调用,传递特定的数据后api会返回数据。数据格式大多为 json
注意:
先要进行session的实例化。实例化之后所有的请求都使用实例化的变量进行get/post方法调用。如: session.post()
requests.post()这种方法将不会携带之前的cookie等参数,相当于重新来过
"""
"""
思路:
1.准备登录的URL 一个api接口(你传输东西给我,我返回东西给你)
2.发送请求,获取响应
3.验证
"""
# 1.准备登录的URL 一个api接口(你传输东西给我,我返回东西给你)(api接口不返回HTML页面,如果返回的是json数据,则是api接口,反之是页面)
url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20201202950"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
# 2.发送请求,获取响应
data = {
'email':'182730',
'password':'Pj7159',
}
session = requests.session() # 会话维持
response = session.post(url=url,headers=headers,data=data)
print(response.text)
print(dict_from_cookiejar(response.cookies)) # 转成Python的字典
# 3.验证
Homeurl = "http://www.renren.com/"
resp = session.get(url=Homeurl,headers=headers)
print(resp.text)
03_代理、模拟登陆、重试/03_模拟登陆.py:
"""
https://accounts.douban.com/j/mobile/login/basic
c的主页
https://www.douban.com/......
"""
import requests
from requests.utils import dict_from_cookiejar
url = "https://accounts.douban.com/j/mobile/login/basic"
headers = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
"Referer" : "https://accounts.douban.com/passport.....", # 参考的网页
}
# name和password为正确的账号密码
data = {
'ck':'',
'remember':'true',
'name':'18030......',
'password':'a913......',
}
session = requests.session() # 会话维持
response = session.post(url=url,headers=headers,data=data)
print(response.text)
print(dict_from_cookiejar(response.cookies)) # 转成Python的字典
# Homeurl为登录后的个人主页路由
Homeurl = "https://www.douban.com/people......"
resp = session.get(url=Homeurl,headers=headers)
print(resp.text)
3. cookie
cookie:
保持网站的登陆状态,存储网站中某个特定的数据参数
是有有效期的,超过有效期cookie将会清除作废,所以在编写一个cookie爬虫代码的时候,并不是一次编写永久运行,每隔一个时间段就需要更新
cookie。
什么时候用这种方法?
1.当模拟登陆不好编写时(结构复杂,有加密)
2.只有cookie没有账号密码
3.网站根据cookie对用户进行推荐,专门爬取某人的个人推荐时...
在代码中利用cookie常用的两种方法:
1.将cookie写入headers中
2.使用get方法中的cookies参数进行传递注意:参数必须为字典类型
注意:
1,自定义headers中的cookie,后面没有s(非cookies)
2. get方法中的cookies参数cookies后面有s
3. cookie一定是键值对存在的
03_代理、模拟登陆、重试/04_cookie.py:
"""
cookie:
保持网站的登陆状态,存储网站中某个特定的数据参数
是有有效期的,超过有效期cookie将会清除作废,所以在编写一个cookie爬虫代码的时候,并不是一次编写永久运行,每隔一个时间段就需要更新
cookie。
什么时候用这种方法?
1.当模拟登陆不好编写时(结构复杂,有加密)
2.只有cookie没有账号密码
3.网站根据cookie对用户进行推荐,专门爬取某人的个人推荐时...
在代码中利用cookie常用的两种方法:
1.将cookie写入headers中
2.使用get方法中的cookies参数进行传递注意:参数必须为字典类型
注意:
1,自定义headers中的cookie,后面没有s(非cookies)
2. get方法中的cookies参数cookies后面有s
3. cookie一定是键值对存在的
"""
import requests
# # cookie为正确的登录后的个人页面首页cookie
# cookie = 'll="118181"; bid=EqD-tZ3xcK8;
#
# # cookie 字符串转成字典
# cookie_dict = {}
# for i in cookie.split("; "):
# cookie_dict[i.split("=")[0]] = i.split("=")[1]
# print(cookie_dict)
# # outputs:{'ll': '"118181"', 'bid': ......}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/98.0.4758.102 Safari/537.36',
'Referer':'https://www.douban.com/',
'Cookie':'ll="118181"; bid=EqD-tZ3xcK8;'
}
# response = requests.get(url="https://www.douban.com/people",headers=headers,cookies=cookie_dict)
response = requests.get(url="https://www.douban.com/people",headers=headers)
print(response.text)
4. 禁止重定向
03_代理、模拟登陆、重试/05_禁止重定向.py:
import requests
url = "https://h5.pipix.com/s/JFfpN5J/"
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/98.0.4758.102 Safari/537.36',
}
response = requests.get(url=url,headers=headers,allow_redirects=False)
print(response.url)
print(response.text)
# outputs:
# https://h5.pipix.com/s/JFfpN5J/
# {"message":"404 not found"}
"""
重定向之前的URL:
https://h5.pipix.com/s/JFfpN5J/
重定向之后的URL:(找不到页面了)
{"message":"404 not found"}
"""
5. 超时处理
03_代理、模拟登陆、重试/06_超时处理.py:
import requests
url = "https://google.com"
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/98.0.4758.102 Safari/537.36',
}
# 可能存在错误,则报的错误要指明
try:
# response = requests.get(url=url,headers=headers,timeout=2) # 如果5秒没有返回结果,则报错ConnectTimeout
response = requests.get(url=url,headers=headers,timeout=(3,7)) # 请求时间,响应时间,即timeout=10(3+7)
print(response.text)
except requests.exceptions.ConnectionError as e:
print("超时",e)
except NameError as e:
print("名字错误",e)
6. 重试模块
03_代理、模拟登陆、重试/07_retrying模块.py:
from retrying import retry
# @retry # 如出现异常会一直重试,直到不报错为止
# @retry(stop_max_attempt_number=3) # 用来设定最大的尝试次数,超过该次数就停止重试
# @retry(stop_max_delay=3000) # 设置失败重试的最长时间,单位毫秒,超出时间,则停止重试,3秒之后报错
# @retry(wait_fixed=2000) # 设置失败重试的间隔时间
@retry(wait_random_min=1000,wait_random_max=5000,stop_max_attempt_number=3) # 设置失败重试的随机性间隔时间,有时快,有时慢
def demo():
print("--------")
raise # RuntimeError: No active exception to reraise
demo()
03_代理、模拟登陆、重试/08_爬虫重试.py:
import requests
from retrying import retry
class Spider:
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/98.0.4758.102 Safari/537.36',
}
self.count = 1
def demo(self):
print('请求没成功')
# 若没有请求成功,每隔4秒请求一次
@retry
def requestMethod(self,url):
print(url)
print("第",self.count,"次连接")
self.demo()
self.count += 1
response = requests.get(url=url,headers=self.headers,timeout=4)
return response
if __name__ == '__main__':
urllist=["https://www.baidu.com","https://www.google.com"]
run = Spider()
for url in urllist:
print(run.requestMethod(url).url)
文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!
Editor:Lonelyroots