学习目标:
3.1 安装selenium并学习
-
安装selenium并学习。
-
使用selenium模拟登陆163邮箱。
-
163邮箱直通点:163网易免费邮-你的专业电子邮局 。
3.2 学习IP相关知识
-
学习什么是IP,为什么会出现IP被封,如何应对IP被封的问题。
-
抓取西刺代理,并构建自己的代理池。
-
西刺直通点:https://www.xicidaili.com/ 。
-
参考资料:
安装selenium
1、pip install selenium
2、cmd窗口下进入python,导入import selenium不报错说明安装成功
'''使用selenium模拟登陆163邮箱'''
from selenium import webdriver
import time
url = 'https://mail.163.com/'
driver = webdriver.Chrome()
driver.get(url=url)
time.sleep(10)
driver.switch_to.frame(0)#登陆框在第一个ifram,先切进去在执行其他事件
email = driver.find_element_by_name('email')
email.send_keys('xxxxxx')
password = driver.find_element_by_name('password')
password.send_keys('xxxxxxx')
time.sleep(2)
driver.find_element_by_id('dologin').click()
time.sleep(5)
IP为什么被封
网站为了防止被爬取,会有反爬机制,对于同一个IP地址的大量同类型的访问,会封锁IP,过一段时间后,才能继续访问
如何应对IP被封的问题
- 修改请求头,模拟浏览器(而不是代码去直接访问)去访问
- 采用代理IP并轮换
- 设置访问时间间隔
获取代理IP地址
import requests
from bs4 import BeautifulSoup
from collections import OrderedDict
from threading import Thread
from datetime import datetime
start_time = datetime.now()
def get_xici_proxy(url,headers):
response = requests.get(url, headers=headers).content
res = response.decode('utf-8')
soup = BeautifulSoup(res, 'lxml')
tag_tr_all = soup.find_all('tr')
# ['国家', 'IP地址', '端口', '服务器地址', '是否匿名', '类型', '速度', '连接时间', '存活时间', '验证时间']
info_names = tag_tr_all[0].get_text().strip().split('\n')
# global proxy_list
t_list = []
for tag_tr in tag_tr_all[1:]: #从第1行开始遍历,应该遍历100次。
tag_td = tag_tr.find_all('td')#
try:
country = tag_td[0].img['alt'] #td字标签img里的属性值,为国家缩写,但有的没有需处理异常
except TypeError:#
country = 'None'
try:
ip_info_list = [td.get_text(strip=True) for td in tag_td[1:]] #遍历1条代理的其它信息
ip_info_list.insert(0,country)
ip_info_dict = OrderedDict(zip(info_names,ip_info_list))
t = Thread(target =check_proxy,args=(ip_info_dict,))
t_list.append(t)
except Exception as e:
print("西陆站点登录错误:",e)
for i in range(len(tag_tr_all[1:])):
t_list[i].start()
for i in range(len(tag_tr_all[1:])):
t_list[i].join()
def check_proxy(info):
# 居然要小写才行?今后抽空查资料看看是否这么一回事儿。
proxy = {info['类型'].lower():r"{}://{}:{}".format(info['类型'].lower(),info['IP地址'],info['端口']),}
try:
response1 = requests.get(r"http://httpbin.org/get",proxies=proxy,timeout=10)
print(response1.status_code)
if response1.status_code==200:
info['proxy'] = proxy
proxy_list.append(info)
except Exception as e:
pass#
if __name__ == "__main__":
url = r"https://www.xicidaili.com/nn"
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
proxy_list = [] #所有有效代理都存到一个list中
get_xici_proxy(url,headers)
print("有效代理数量:",len(proxy_list))
print("第二个代理地址:",proxy_list[1].get('proxy'))
print("第二个代理地址是否匿名:",proxy_list[1].get('是否匿名'))
print("第二个代理地址类型:",proxy_list[1].get('类型'))
print("检测的第二个代理地址存活时间:",proxy_list[1].get('存活时间'))
print("_"*20)
use_time = datetime.now()- start_time
print("程序运行共计耗时:{}秒".format(use_time.seconds))