python爬虫学习-day6-IP代理

什么是IP

互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给用户上网使用的网际协议(英语:Internet Protocol, IP)的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类,但是也有其他不常用的小分类。

IP协议

Internet体系结构

一个TCP/IP互联网提供了三组服务。最底层提供无连接的传送服务为其他层的服务提供了基础。第二层一个可靠的传送服务为应用层提供了一个高层平台。最高层是应用层服务。

IP协议三个定义:

  1. IP定义了在TCP/IP互联网上数据传送的基本单元和数据格式。
  2. IP软件完成路由选择功能,选择数据传送的路径。
  3. IP包含了一组不可靠分组传送的规则,指明了分组处理、差错信息发生以及分组的规则。

为什么会出现IP被封

  1. 国内服务器不可访问。
  2. 当与我们共用同一IP的其他网站上出现了违反法律法规的内容或其他不和谐内容时,国家会采取屏蔽海外服务器IP的方式,避免对国内用户造成不良影响。

如何应对IP被封问题

参考:https://blog.csdn.net/qq_31975963/article/details/82882456

  1. 可动态设置user agent
  2. 禁用cookies
  3. 设置延迟下载
  4. 使用Google Cache
  5. 使用IP地址池(代理IP、VPN等)
  6. 使用Crawlera

Task:抓取西刺代理,构建自己的代理池

参考:https://blog.csdn.net/mjp_erhuo/article/details/81332824

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import requests
import re
import random

url = 'http://www.xicidaili.com/nn'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.3'
'6 (KHTML, like Gecko) Ubuntu Chromium/56.0.2924.7'
'6 Chrome/56.0.2924.76 Safari/537.36'}

def get_user_agent(): //动态设置user_agent
user_agents=[
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER"
]
user_agent = random.choice(user_agents)
return user_agent

def get_proxies(): //抓取西刺代理的匿名代理IP
html = requests.get(url=url, headers=headers).text
pattern = '(\d+\.\d+\.\d+\.\d+)</td>\s*<td>(\d+)'
re_list = re.findall(pattern, html)
ip_list = []
for ip in re_list:
ip = ip[0] + ':' + ip[1]
ip_list.append(ip)
return ip_list

def test_proxy(ip):
'''
功能: 利用百度逐个验证IP的有效性
:param ip: 当前被验证的IP
:return:
'''
tar_url = "http://www.tjcu.edu.cn/"
user_agent = get_user_agent()
headers = {
'User-Agent': user_agent
}
proxies = {
"http": ip,
}
try:
res = requests.get(tar_url, proxies=proxies, headers=headers, timeout=5)
if res.status_code == 200:
tmp_proxies.append(ip)
return ip
else:
res.raise_for_status() # 如果响应状态码不是200,主动抛出异常
except requests.RequestException as e:
print("验证代理IP" + ip + "时发生如下错误 :")
print(e)

if __name__ == '__main__':
init_proxies = get_proxies() # 获取原始代理IP
tmp_proxies = []
for i in init_proxies:
tmp_proxy = test_proxy(i) # 逐个验证
print(tmp_proxies)

由于自己真的很少时间学,快要复试了。所以只能学习别人的代码,等之后再重新梳理爬虫的整个流程。很抱歉!抓取结果显示如下,基本都是拒绝,想必我可能被发现了。。。(捂脸
image.png

再试一下,试试代理IP:

失败,等之后再学习其他同学的好了。希望我考研复试顺利,毕设顺利,顺利毕业,顺利当上研究生!!