1.任务
- 安装selenium并学习;
- 使用selenium模拟登陆163邮箱;
- 学习什么是IP,为什么会出现IP被封,如何应对IP被封的问题。
- 抓取西刺代理,并构建自己的代理池
2.selenium
2.1 Selenium安装与学习
安装Selenium:
1. pip install selenium或IDE辅助安装第三方库
2. 安装对应的浏览器驱动,如chrome,firefox,IE等
3. 将驱动文件放到浏览器文件夹下并添加到系统path中
Selenium模拟登陆步骤:
1. 利用浏览器驱动创建浏览器对象
browser=webdriver.Chrome()
2. get方法打开网页url
browser.get(url)
3.利用frame标签选择需要的frame
brows.switch_to.frame()
4.利用节点属性查找节点
find-element-by-id()
find-element-by-name()
find-element-by-xpath()
find-element-by-css-selector()
find-element-by-link-text()
find-element-by-partial-link-text()
find-element-by-tag-name()
find-element-by-class-name()
5.发送参数
send_keys()
2.2 Selenium模拟登陆
# coding = utf-8
from selenium import webdriver
import time
path = r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
driver = webdriver.Chrome(executable_path=path)
#设置浏览器驱动系统环境
url="https://mail.163.com"
driver.get(url)
time.sleep(3)
driver.switch_to.frame(0)
#找到邮箱账号登录框对应的iframe,0表示Index索引中第一个框架
name = driver.find_element_by_name("email")
#邮箱账号输入框
name.send_keys("163邮箱账号")
#将邮箱地址输入到邮箱账号框中
time.sleep(2)
name = driver.find_element_by_name('password')
#密码输入框
name.send_keys('163邮箱密码')
#输入邮箱密码
login = driver.find_element_by_id('dologin')
#登陆按钮
login.click()
#点击登陆按钮
3. IP和代理池
3.1 IP和封IP
IP
互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给用户上网使用的网际协议(英语:Internet Protocol, IP)的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类,但是也有其他不常用的小分类。
IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。
A、B、C三类IP地址的特征:当将IP地址写成二进制形式时,A类地址的第一位总是0,B类地址的前两位总是10,C类地址的前三位总是110。
封IP
网站可以对指定IP地址进行封禁,拒绝来自此IP地址的访问。
可能会引起封IP的行为有:
计算机或系统受到外部攻击,如DDOS
违反网站的安全策略,如爬虫访问频率过高
其他原因
代理池(proxy pool)
对于IP封禁的应对策略之一,构建与维护IP代理池,通过代理的IP地址来访问网站,可以采用下面链接里的IP
免费IP代理
3.2 代理池构建
爬取并验证网络代理的IP,存入自己的IP池
import requests, time
from bs4 import BeautifulSoup
def verify_IP(ip):
proxies = {"http": ip}
url = "http://www.baidu.com/"
try:
req = requests.get(url, headers=headers, proxies=proxies, timeout=3)
if req.status_code == 200:
return True
else:
return False
except requests.RequestException as e:
print("验证代理IP" + ip + "时发生如下错误 :")
print(e)
return False
headers = {
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8"
};
url = 'http://www.xicidaili.com/nn'
proxies={"HTTP":"121.61.1.67:9999"}
req = requests.get(url, headers=headers,proxies=proxies, timeout=3)
html = req.text
soup = BeautifulSoup(html, 'lxml')
ip_list = soup.find(id='ip_list').find_all('tr')
for i in range(1, len(ip_list)):
ip_info = ip_list[i]
tds = ip_info.find_all('td')
ip = tds[1].text + ':' + tds[2].text
# 验证ip是否可用
if tds[5].text=="HTTP":
if verify_IP(ip):
# 可用ip写入文件
print(ip)
proxyfile = open("ip_records.txt", 'a', encoding="utf-8")
proxyfile.write(ip + "\n")
proxyfile.close()
time.sleep(5)