摘要
各位大家好今天要介绍的是Selenium自动化测试模块以及什么是代理池,首先简单的说一下Selenium,在我的理解中Selenium可以模拟使用者的动作去开启网页进行账号登陆的动作目前我的应用场景有自动论坛发文,自动登录特定网站,selenium刚开始是为了作测试而生的,但是后来被用来模拟浏览器登录以及高级爬虫例如爬取动态加载的内容,详细可以参考官方文档,再来我们说说什么是代理池,先说说我应用代理池的场景吧!在某个项目里面我需要去使用requests下载指定的pdf,但是如果同一个IP请求过多次就会出现IP被封的情况,在这种情况下我们就可以通过代理池来完成获取代理并且每次都用不同的代理IP 去完成下载的动作,根据这各网站的介绍我们可以看到使用代理的原因以及各种代理的差异如下
随着互联网的迅猛发展,爬虫工作日益重要,而爬虫工作者一般都绕不过代理IP这个问题,为什么呢,这是因为在网络爬虫抓取信息的过程中,抓取频率高过了目标网站的设置阀值,将会被禁止访问。那么这个问题如何解决呢,其实也很简单,那就是使用代理IP。那么代理IP哪里来呢?一般获取代理IP的方式有以下三种,让我们一起来看看。
第一种:自己搭建服务器,这种代理IP优点是效果最稳定,时效和地区可控,完全可以按照自己的要求来搞,完美匹配。然而缺点也最明显,那就是需要爬虫爱好者有一定能力维护代理服务器,需要花费大量维护时间,并且成本投入非常高。
第二种:使用免费代理IP,这种代理IP可谓到处都是,最大的优点是免费,不用花钱。缺点就多了,IP不稳定,速度慢,经常掉线,IP通过率也不高,总之你需要大量时间去挨个试,看似免费,其实昂贵,因为需要浪费大量时间成本,效率十分低下,不适合爬取数据量大的企业级用户。
第三种使用收费代理IP,这种代理IP需要一定的花费,成本没有第一种方案贵,要便宜很多,也不用自己去维护代理服务器;IP比较稳定,速度比较快,有效率比较高,但也比不上第一种方案的完美匹配,十分适合企业级用户。缺点则是代理IP商太多,花钱了不一定能选到好的代理IP服务商。
好接下来进入实作的部份
实作
需求如下:
1.使用selenium模拟登陆163邮箱。
2.抓取西刺代理,并构建自己的代理池。
代码如下
第一个函数是完成需求1
第二个函数是获取代理池
第三个函数是使用代理的范例
import time
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import random
class Selenium_test:
def __init__(self):
pass
def selenium_get163(self, id, pwd):
# option = webdriver.ChromeOptions()#不显示chrome 执行的的画面
# option.add_argument('headless')#
drive = webdriver.Chrome() # chrome_options=option ) # chrome_options=option
tag = drive.get("https://mail.163.com/")
drive.switch_to.frame(0)
user_ID = drive.find_element_by_name('email')
user_PWD = drive.find_element_by_name('password')
user_ID.send_keys(id)
print('put id')
user_PWD.send_keys(pwd)
print('put pwd')
time.sleep(3)
print('sleep 3 s')
login = drive.find_element_by_id('dologin')
login.click()
time.sleep(10)
print('finish selenium and sleep 10s ')
def get_proxy(self):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
}
req = requests.get('https://www.xicidaili.com/nt', headers=headers)
soup = BeautifulSoup(req.text, 'lxml')
tags = soup.find_all('tr', attrs={'class': 'odd'})
proxy_list = []
for t in tags:
ip_info = t.text.split()
proxy_list.append(ip_info[0] + ':' + ip_info[1])
print('total proxy is %s ' % (len(proxy_list)))
return proxy_list
def use_proxy(self):
proxy = self.get_proxy()
ip = random.choice(proxy)
try:
req = requests.get('https://arxiv.org/pdf/1903.08817', timeout=60, proxies={'https': ip})
print('use ip %s' % ip)
except:
req = requests.get('https://arxiv.org/pdf/1903.08817', timeout=60, proxies={'http': ip})
print('use ip %s' % ip)
print(req.status_code)
selenium_demo = Selenium_test().selenium_get163(id=1234, pwd=456)
proxy_demo = Selenium_test().use_proxy()
selenium 的延伸应用 登陆某游戏的官方论文进行自动推文的动作代码如下
from selenium import webdriver
import time
key = int(input('歡迎使用POE論壇市集小助手 請選擇 1 執行 2結束>>>>> '))
if key ==1:
users_ID = input('輸入帳號>>>>>> ')
users_PWD = input('輸入密碼>>>>> ')
tage_website = input('輸入目標網站>>>>> ')
runtime = int(input('請輸入執行間隔時間(以小時為間隔單位推薦 1~~12)>>> '))
runtime=runtime*60*60 # 將執行時間改為小時
while True:
print('執行開始', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
#設定driver
option = webdriver.ChromeOptions()
option.add_argument('headless')
drive = webdriver.Chrome(chrome_options=option)# 这里是让selenium 在DOS 视窗下执行的设定 详细可以参考官方
# 設定網站參數
link = drive.get('https://auth.garena.com/oauth/login?client_id=200002&redirect_uri=https%3A%2F%2Fweb.poe.garena.tw%2Fl'
'ogin%2Fgarena-oauth&state=tN3cXtNUwLb-8jHmWDz_SBj63IeF7vFf44xNJhp0&scope=&response_type=code&locale=zh-TW')#官方登陸網站
user_ID = drive.find_element_by_xpath('//*[@id="sso_login_form_account"]')
user_PWD = drive.find_element_by_xpath('//*[@id="sso_login_form_password"]')
user_ID.send_keys(users_ID)
user_PWD.send_keys(users_PWD)
print('執行中...')
time.sleep(1)
chick_login = drive.find_element_by_xpath('//*[@id="confirm-btn"]').click()
print('執行中....')
time.sleep(3)
link2 = drive.get(tage_website) # 目標貼文網站
chick_re_btn = drive.find_element_by_css_selector("a.button1.important").click()
re_write = drive.find_element_by_xpath('//*[@id="content"]')
re_write.send_keys('123')
doing = drive.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/div[1]/div[2]/form/div[2]/input[1]').click()
drive.close()
print('執行結束', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
time.sleep(runtime)
else:
print('您選擇了2 程結束')
注意如果你是使用 linux 环境来使用 selenium 请先参考这各网站的教学完成 配置
如果你是WINDOWS 环境 那么只要将chromedriver.exe 放在你项目的同级文件夹下就好