Task 3:
3.1 安装selenium并学习
1、安装selenium并学习。
2、使用selenium模拟登陆163邮箱。
-
安装Selenium
Selenium是个自动化测试工具,也课用来解决动态网页的加载和渲染问题。Selenium可以驱动浏览器模拟人的操作,支持各种浏览器,包括Chrome、Safari、firefox等主流界面式浏览器。
Selenium库不是Python标准库,使用前需要安装,可以使用pip来安装,具体安装方式为
pip install selenium
这样Selenium就安装完成了。Selenium需要配合Chrome浏览器使用,并且需要驱动浏览器的Chromedriver驱动程序。
-
Chromedriver的安装和环境变量的设置
下载的Chromedriver的版本需要和操作系统对应,而且还要与使用的Chrome浏览器版本对应(若还没有安装浏览器,请先自己下载浏览器),有关Chromedriver版本与chrome浏览器版本对应的问题以及Chromedriver驱动的下载地址,可以参考以下链接:https://www.cnblogs.com/qingqing-919/p/9055285.html
如何查看自己的Chrome浏览器版本
打开浏览器,点击网页右上角三个点,然后点帮助,关于Google Chrome,之后就会出现浏览器的版本。
Chromedriver如何配置环境变量
下载完Chromedriver,若直接调用,程序会报错。在调用之前要进行环境变量配置。
1、首先下载完的Chromedriver是一个压缩包,解压得到Chromedriver.exe。将这个文件放到Python里面的Script文件中,复制文件地址。
2、计算机>属性>高级系统设置>环境变量>在系统变量里新建一个变量:变量名为path,变量值为第一步所复制的地址。
通过以上步骤就配置好了Chromedriver的环境配置。
-
模拟登陆163.邮箱
用以下代码实现:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Chrome()
browser.get('https://mail.163.com/ ')
time.sleep(10) #防止响应过慢,xpath抓取不到内容;事件之间通常要加
browser.switch_to.frame(0) #找到邮箱账号登录框对应的iframe,由于网页中iframe的id是动态的,所以不能用id寻找
email = browser.find_element_by_name('email')
email.clear()
email.send_keys('*****') #输入邮箱账号
password = browser.find_element_by_name('password')
password.clear()
password.send_keys('******') #输入邮箱密码
login_em = browser.find_element_by_id('dologin') #找到登陆按钮
login_em.click() #点击登陆按钮
time.sleep(10)
3.2 学习IP相关知识
1、学习什么是IP,为什么会出现IP被封,如何应对IP被封的问题。
2、抓取西刺代理,并构建自己的代理池。
3、西刺直通点:https://www.xicidaili.com/ 。
-
什么是IP
互联网协议地址(Internet Protocol Address,又译为网际协议地址),是分配给用户上网使用的网际协议的设备的数字标签。
-
IP被封
网站自身设有反爬虫机制,对于同一个IP地址的大量同类型访问,会封锁IP。
-
如何应对IP被封
采用代理IP
-
构建自己的代理池
import requests
import pandas as pd
from tqdm import tqdm
class Proxies(object):
def __init__(self, ):
url = 'https://www.xicidaili.com/nn/'
r = requests.get(url, headers={'user-agent': 'Mozilla/5.0'})
self.ips = pd.read_html(r.text, header=0)[0][['IP地址', '端口']].values
@property
def pool(self):
proxies = []
for i in tqdm(self.ips):
proxy = self._get_valid_proxies(i)
if proxy:
proxies.append(proxy)
return proxies
def _get_valid_proxies(self, ip):
try:
requests.adapters.DEFAULT_RETRIES = 3
host, port = ip # random.choice(ips)
proxies = {"http": "http://%s:%s" % (host, port)}
r = requests.get("http://icanhazip.com/", timeout=8, proxies=proxies)
if host == r.text.strip():
# print('代理有效:%s' % proxies)
return proxies
else:
print("pass") # 代理无效
except:
print("pass")
if __name__ == '__main__':
pool = Proxies().pool
print(pool)