image.png
@前言:
工作闲暇之余自学Python,想找个项目练练手,于是瞄准了我们客户阿里给我们下发任务的网站,往常同事都是手动登录网站,手动复制粘贴Case内容到Excel。Kanshan震惊,都9102年了,怎么还要做这么低效(无脑)的工作,于是自学python尝试自动化获取case内容并且保存到本地,想一想,能有多难???
然鹅:人生第一次认真爬的网页有万万个没想到...
@问题和方法
万万没想到①:不是所有的网站都随便逛的,遇到这种拦路虎怎么办,盘他? AVMS网址
image.png
方法①:先登录网站,拿到cookies,放到headers里面请求网页,发现网页是Ajax渲染的,而且提交方式为post,此路不通。
方法②:selenium模拟登录后获取cookies,保存到本地,每次使用时再调用。先上模拟登录的代码:
@模拟登录
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
def login():
driver.get(url) #加载页面
#定位输入用户名的表单
username = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#exampleInputUser")))
#定位输入密码的表单
password = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#exampleInputPassword")))
#定位登录的按钮
submit = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="login-button"]')))
username.send_keys("XXXX") #引号内为用户和密码
password.send_keys("XXXX")
submit.click() #模拟鼠标点击
driver.refresh() #刷新页面
if __name__ =='__main__':
task_id = input("请输入需要抓取的task_id:")
url = 'http://www.aliavms.cn:7001/tsmanager/index.html#/detail?task_id=' + task_id
pages_string = input("请输入需要抓取得页数:")
pages = int(pages_string)
#options = webdriver.ChromeOptions() #使用chromeless需要的参数
#options.add_argument('headless')
#options.add_argument('disable-gpu')
#driver = webdriver.Chrome(options=options)
driver = webdriver.Firefox()
WAIT = WebDriverWait(driver, 10)
task_name, case_name = login() #为了生成excel名称和sheet表格名称
(下面的获取cookies、保存、读取后来都没有用到)
import os
import json
def get_cookies():
cookies = driver.get_cookies() #webdriver直接获取cookies
def save_cookies(cookies):
with open("cookies.txt", "w") as fp:
json.dump(cookies, fp)
def read_cookie():
if os.path.exists('cookies.text'):
cookies_dict = dict()
with open("cookies.txt", "r") as fp:
cookies = json.load(fp)
for cookie in cookies:
cookies_dict[cookie['name']] = cookie['value']
return cookies_dict
else:
get_cookies()
return read_cookie()
如果是静态网页,那就很简单了
import requests
headers = {
# 假装自己是浏览器
'User-Agent': 'Mozilla/5.0