Selenium

基本使用

# 导入 webdriver
from selenium import webdriver
# 调用键盘按键操作时需要引入的Keys包
from selenium.webdriver.common.keys import Keys
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.PhantomJS()
# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.PhantomJS(executable_path="./phantomjs"))
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
# 获取页面名为 wrapper的id标签的文本内容
data = driver.find_element_by_id("wrapper").text
# 打印数据内容
print data
# 打印页面标题 "百度一下,你就知道"
print driver.title
# 生成当前页面快照并保存
driver.save_screenshot("baidu.png")
# id="kw"是百度搜索输入框,输入字符串"长城"
driver.find_element_by_id("kw").send_keys(u"长城")
# id="su"是百度搜索按钮,click() 是模拟点击
driver.find_element_by_id("su").click()
# 获取新的页面快照
driver.save_screenshot("长城.png")
# 打印网页渲染后的源代码
print driver.page_source
# 获取当前页面Cookie
print driver.get_cookies()
# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("itcast")
# 模拟Enter回车键
driver.find_element_by_id("su").send_keys(Keys.RETURN)
# 清除输入框内容
driver.find_element_by_id("kw").clear()
# 生成新的页面快照
driver.save_screenshot("itcast.png")
# 获取当前url
print driver.current_url
# 关闭当前页面,如果只有一个页面,会关闭浏览器
# driver.close()
# 关闭浏览器
driver.quit()
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

定位元素

'''
find_element_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
'''
# <div id="coolestWidgetEvah">...</div>
element = driver.find_element_by_id("coolestWidgetEvah")
# <div class="cheese"><span>Cheddar</span></div>
cheeses = driver.find_elements_by_class_name("cheese")
# <iframe src="..."></iframe>
frame = driver.find_element_by_tag_name("iframe")
# <input name="cheese" type="text"/>
cheese = driver.find_element_by_name("cheese")
# <a href="http://www.google.com/search?q=cheese">cheese</a> 根据链接的文本查找
cheese = driver.find_element_by_link_text("cheese")
# <div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
# <input type="text" name="example" />
# <input type="text" name="other" />
inputs = driver.find_elements_by_xpath("//input")
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

获取属性值

driver.get('https://www.baidu.com/') submitBtn = driver.find_element_by_id('su') value = submitBtn.get_attribute("value") # 获取属性值

屏幕截图

driver.save_screenshot(‘baidu.png’)

select下拉框处理

'''
<select id="status" class="form-control valid" οnchange="" name="status">
<option value=""></option>
<option value="0">未审核</option>
<option value="1">初审通过</option>
<option value="2">复审通过</option>
<option value="3">审核不通过</option>
</select>
'''
# 导入 Select 类
from selenium.webdriver.support.ui import Select
# 找到 name 的选项卡
select = Select(driver.find_element_by_name('status'))
# 选择选项
# index 索引从 0 开始
# value是option标签的一个属性值,并不是显示在下拉框中的值
# visible_text是在option标签文本的值,是显示在下拉框的值
select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u"未审核")
# 取消全部
select.deselect_all()
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

弹窗处理

alert = driver.switch_to_alert()

页面前进后退

driver.forward() # 前进 driver.back() # 后退

获取cookies

#encoding: utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com/')
# 获取cookies信息
for cookie in driver.get_cookies():
print(cookie)
print(driver.get_cookie("PSTM"))
driver.delete_cookie("PSTM")
# print(driver.get_cookie('PSTM'))
driver.delete_all_cookies()

# for cookie in driver.get_cookies():
# print "%s -> %s" % (cookie['name'], cookie['value'])
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

设置代理

driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
options = webdriver.ChromeOptions()
# 设置代理
options.add_argument("--proxy-server=http://165.123.0.1:4555")
# 使用代理打开浏览器
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get("http://httpbin.org/ip")
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

页面等待

  • 程序不能确定何时某个元素完全加载出来了。
  • 如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。
  • 隐式等待是等待特定的时间,显式等待是指定某一条件直到这个条件成立时继续执行。

隐式等待

  • 直接设置等待时间

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # 等待10秒
driver.get("http://www.xxxxx.com/loading")
myDynamicElement = driver.find_element_by_id("content")
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

显式等待

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://www.xxxxx.com/loading")
try:
# 直到 id="content" 出现
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "content"))
)
finally:
driver.quit()
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

DEMO1

#encoding: utf-8

from selenium import webdriver
from lxml import etree
import re
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class tencentSpider(object):
driver_path = r"D:\software\chromedriver.exe"

def __init__(self):
self.driver = webdriver.Chrome(executable_path=tencentSpider.driver_path) # 驱动
self.url = 'https://tencent.hr/jog' # 起始页
self.positions = [] # 保存数据

# 主逻辑
def run(self):
# 发送起始页请求
self.driver.get(self.url)
while True:
source = self.driver.page_source # ajax动态源码

# 设置延时等待下一页按钮加载
WebDriverWait(driver=self.driver, timeout=10).until(
EC.presence_of_element_located(
(By.XPATH, "//div[@class='pager_container']/span[last()]"))
)

# 解析列表页
self.parse_list_page(source)

# 翻页
try:
# 下一页按钮
next_btn = self.driver.find_element_by_xpath("//div[@class='pager_container']/span[last()]")
# 判断是否是最后一页
if "pager_next_disabled" in next_btn.get_attribute("class"):
break
else:
next_btn.click() # 点击下一页
except:
print(source)

time.sleep(1)

# 解析列表页
def parse_list_page(self, source):
html = etree.HTML(source)
links = html.xpath("//a[@class='position_link']/@href") # 详情页的url列表
# 遍历到每一个详情页
for link in links:
# 打开详情页
self.request_detail_page(link)
time.sleep(1)

# 打开详情页
def request_detail_page(self, url):
# 这里不能使用get(), 需要新打开一个详情页
self.driver.execute_script("window.open('%s')" % url)
self.driver.switch_to.window(self.driver.window_handles[1]) # 选择新详情页

# 等待查找的元素不能是text(), 否则查找失败超时
WebDriverWait(self.driver, timeout=10).until(
EC.presence_of_element_located(
(By.XPATH, "//div[@class='job-name']/span[@class='name']"))
)

source = self.driver.page_source # 获取ajax源码
self.parse_detail_page(source) # 解析详情页

# 关闭当前这个详情页
self.driver.close()
# 继续切换回列表页
self.driver.switch_to.window(self.driver.window_handles[0])

# 解析详情页
def parse_detail_page(self, source):
html = etree.HTML(source)
position_name = html.xpath("//span[@class='name']/text()")[0]
job_request_spans = html.xpath("//dd[@class='job_request']//span")
salary = job_request_spans[0].xpath('.//text()')[0].strip()
city = job_request_spans[1].xpath(".//text()")[0].strip()
city = re.sub(r"[\s/]", "", city)
work_years = job_request_spans[2].xpath(".//text()")[0].strip()
work_years = re.sub(r"[\s/]", "", work_years)
education = job_request_spans[3].xpath(".//text()")[0].strip()
education = re.sub(r"[\s/]", "", education)
desc = "".join(html.xpath("//dd[@class='job_bt']//text()")).strip()
company_name = html.xpath("//h2[@class='fl']/text()")[0].strip()

position = {
'name': position_name,
'company_name': company_name,
'salary': salary,
'city': city,
'work_years': work_years,
'education': education,
'desc': desc
}

self.positions.append(position)

print(position)
print('='*40)

if __name__ == '__main__':
spider = tencentSpider()
spider.run()
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

DEMO2

#encoding: utf-8

from selenium import webdriver
from lxml import etree
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import csv
import pytesseract
from urllib import request
from PIL import Image
import re

class BossSpider(object):
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
def __init__(self):
self.driver = webdriver.Chrome(executable_path=BossSpider.driver_path)
pytesseract.pytesseract.tesseract_cmd = r'D:\ProgramApp\TesseractOCR\tesseract.exe'
self.url = 'https://www.zhipin.com/c100010000/h_101250100/?query=python'
self.domain = "https://www.zhipin.com"
fp = open('boss.csv','a',newline='',encoding='utf-8')
self.writer = csv.DictWriter(fp,['name','company_name','salary','city','work_years','education','desc'])
self.writer.writeheader()

def run(self):
self.driver.get(self.url)
while True:
if len(self.driver.find_elements_by_id("captcha")) > 0:
self.fill_captcha()
time.sleep(2)
continue
source = self.driver.page_source
self.parse_list_page(source)
next_btn = self.driver.find_element_by_xpath("//a[contains(@class,'next')]")
if "disabled" in next_btn.get_attribute('class'):
break
else:
next_btn.click()

def fill_captcha(self):
captchaInput = self.driver.find_element_by_id("captcha")
captchaImg = self.driver.find_element_by_class_name("code")
submitBtn = self.driver.find_element_by_class_name('btn')
src = captchaImg.get_attribute('src')
request.urlretrieve(self.domain + src, 'captcha.png')
image = Image.open('captcha.png')
text = pytesseract.image_to_string(image)
captcha = re.sub(r"[\s/]","",text)
captchaInput.send_keys(captcha)
submitBtn.click()

def parse_list_page(self,source):
html = etree.HTML(source)
links = html.xpath("//div[@class='info-primary']//a[position()=1]/@href")
for link in links:
url = self.domain+link
self.request_detail_page(url)
time.sleep(1)

def request_detail_page(self,url):
self.driver.execute_script("window.open('%s')"%url)
self.driver.switch_to.window(self.driver.window_handles[1])
source = self.driver.page_source
self.parse_detail_page(source)
self.driver.close()
self.driver.switch_to.window(self.driver.window_handles[0])

def parse_detail_page(self,source):
html = etree.HTML(source)
name = html.xpath("//div[@class='name']/text()")[0].strip()
salary = html.xpath("//div[@class='name']/span[@class='badge']/text()")[0].strip()
infos = html.xpath("//div[@class='job-primary']/div[@class='info-primary']/p//text()")
city = infos[0]
work_years = infos[1]
education = infos[2]

company_name = html.xpath("//a[@ka='job-detail-company']/text()")[0]
desc = html.xpath("//div[@class='job-sec']/div[@class='text']//text()")
desc = "\n".join(desc).strip()
position = {
'name': name,
'company_name': company_name,
'salary': salary,
'city': city,
'work_years': work_years,
'education': education,
'desc': desc
}
self.write_position(position)

def write_position(self,position):
self.writer.writerow(position)
print(position)

if __name__ == '__main__':
spider = BossSpider()
spider.run()
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

网站模拟登陆

DEMO1

# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class db():
def __init__(self):
self.url = "https://www.DB.com/"
self.driver = webdriver.PhantomJS()

def log_in(self):
self.driver.get(self.url)
time.sleep(3) # 睡3分钟,等待页面加载
self.driver.save_screenshot("0.jpg")
#输入账号
self.driver.find_element_by_xpath('//*[@id="form_email"]').send_keys("xxxxx@qq.com")
#输入密码
self.driver.find_element_by_xpath('//*[@id="form_password"]').send_keys("xxxx")
#点击登陆
self.driver.find_element_by_class_name("bn-submit").click()
time.sleep(2)
self.driver.save_screenshot("db.jpg")
#输出登陆之后的cookies
print(self.driver.get_cookies())

def __del__(self):
'''调用内建的稀构方法,在程序退出的时候自动调用
类似的还可以在文件打开的时候调用close,数据库链接的断开
'''
self.driver.quit()

if __name__ == "__main__":
db= db() #实例化
db.log_in() #之后调用登陆方法
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

DEMO2

#coding=utf-8
from selenium import webdriver
import json
import time
class dd:
# 发送首页的请求
def __init__(self):
self.driver = webdriver.PhantomJS()
self.driver.get("https://www.dd.com/directory/all") #请求首页

#获取页面内容
def get_content(self):
time.sleep(3) #每次发送完请求等待三秒,等待页面加载完成
li_list = self.driver.find_elements_by_xpath('//ul[@id="live-list-contentbox"]/li')
contents = []
for i in li_list: #遍历房间列表
item = {}
item["img"] = i.find_element_by_xpath("./a//img").get_attribute("src") #获取房间图片
item["title"] = i.find_element_by_xpath("./a").get_attribute("title") #获取房间名字
item["category"] = i.find_element_by_xpath("./a/div[@class='mes']/div/span").text #获取房间分类
item["name"] = i.find_element_by_xpath("./a/div[@class='mes']/p/span[1]").text #获取主播名字
item["watch_num"] = i.find_element_by_xpath("./a/div[@class='mes']/p/span[2]").text #获取观看人数
print(item)
contents.append(item)
return contents

#保存本地
def save_content(self,contents):
f = open("dd.txt","a")
for content in contents:
json.dump(content,f,ensure_ascii=False,indent=2)
f.write("\n")
f.close()

# 主逻辑
def run(self):
#1.发送首页的请求
#2.获取第一页的信息
contents = self.get_content()
#保存内容
self.save_content(contents)
#3.循环 点击下一页按钮,直到下一页对应的class名字不再是"shark-pager-next"
while self.driver.find_element_by_class_name("shark-pager-next"): #判断有没有下一页
# 点击下一页的按钮
self.driver.find_element_by_class_name("shark-pager-next").click()
# 4.继续获取下一页的内容
contents = self.get_content()
# 4.1.保存内容
self.save_content(contents)

if __name__ == "__main__":
dd= dd()
dd.run()
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

执行javascript

打开新的页面

# 打开首页
driver.get('https://www.baidu.com/')
# 执行js, 打开新页面
driver.execute_script("window.open('https://www.db.com/')")
# driver.window_handles 窗口句柄
driver.switch_to_window(driver.window_handles[1]) # 根据index选择窗口

print(driver.current_url) # 当前页面的url
print(driver.page_source) # 当前页面的源码

# 虽然在窗口中切换到了新的页面。但是driver中还没有切换。
# 如果想要在代码中切换到新的页面,并且做一些爬虫。
# 那么应该使用driver.switch_to_window来切换到指定的窗口
# 从driver.window_handlers中取出具体第几个窗口
# driver.window_handlers是一个列表,里面装的都是窗口句柄。
# 他会按照打开页面的顺序来存储窗口的句柄。
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

滚动条滚动到底部

#
from selenium import webdriver
import time

driver = webdriver.PhantomJS()
driver.get("https://movie.db.com/typerank?type_name=剧情&type=11&interval_id=100:90&action=")

# 向下滚动10000像素
js = "document.body.scrollTop=10000"
#js="var q=document.documentElement.scrollTop=10000"
time.sleep(3)
#查看页面快照
driver.save_screenshot("db.png")
# 执行JS语句
driver.execute_script(js)
time.sleep(10)
#查看页面快照
driver.save_screenshot("db.png")
driver.quit()
————————————————
版权声明:本文为CSDN博主「DeltaTime」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bua200720411091/article/details/93378461

动态html,异步加载页面的处理的更多相关文章

  1. 使用Ajax异步加载页面时,怎样调试该页面的Js

    前言-本人不是干前端的,所以有的名词不专业 在前端中,有时候会遇到这样的框架,http://172.17.11.151:8060/frontend/backend.html#1.html (通过解析U ...

  2. python-scrapy框架爬取某瓣电视剧信息--异步加载页面

    前期准备,首先要有python环境+scrapy环境+pycharm环境 一.建立爬虫所需的环境,在命令行输入: scrapy startproject doubantv #命名自定义就好 会生成一个 ...

  3. chrome插件开发.在content_script异步加载页面后, 如何进行JS通信与调用的问题

    使用场景 在开发Chrome插件时, 有一种需求: 要求在WEB页面显示一个浮动窗口(A), 在此窗口中允许用Ajax方式调用另一个服务器上的一个页面(B) B页面上有独立的功能用JS写functio ...

  4. jquery load(URL,FUNCTION(){}) 异步加载页面

    $("#btnSearch").click(function () { var queryUrl = '/Report/LoadInsClassifFileNew'; if ($( ...

  5. JavaScript异步加载的三种方式——async和defer、动态创建script

    一.script标签的位置 传统的做法是:所有script元素都放在head元素中,必须等到全部js代码都被下载.解析.执行完毕后,才能开始呈现网页的内容(浏览器在遇到<body>标签时才 ...

  6. Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页

    欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...

  7. Ace admin 如何实现类似于freamset加载页面

    如上标题所述,ace admin做后台页面的时候,可以实现类似于用freamset的功能,但是ace admin做的比freamset更好,他可以用异步加载的形式展示,而加载的页面的内容可以尽可能的少 ...

  8. 动态加载(异步加载)jquery/MUI类库 页面加载完成后加载js类库

    动态加载Mui类库: // ==UserScript== // @name // @version 1.4.0 // @author zzdhidden@gmail.com // @namespace ...

  9. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

随机推荐

  1. jQuery 源码分析(十九) DOM遍历模块详解

    jQuery的DOM遍历模块对DOM模型的原生属性parentNode.childNodes.firstChild.lastChild.previousSibling.nextSibling进行了封装 ...

  2. [转]探索ASP.NET Core 3.0 系列

    这是该系列的第一篇文章:探索ASP.NET Core 3.0. 第1部分-探索新的项目文件Program.cs和通用主机(本文) 第2部分-比较ASP.NET Core 3.0模板之间的Startup ...

  3. NumPy 学习 第二篇:索引和切片

    数组索引是指使用中括号 [] 来定位数据元素,不仅可以定位到单个元素,也可以定位到多个元素.索引基于0,并接受从数组末尾开始索引的负索引. 举个例子,正向索引从0开始,从数组开始向末尾依次加1递增:负 ...

  4. go-gtk环境配置

    go-gtk环境配置(用于go的图形化界面) 弄了一天,终于把这个环境给搭建好了,差不多就是安装msys2->安装gtk的各个版本->安装mingw(我原来装有但不影响,因为重复了,环境变 ...

  5. 帝国cms提高网站网页打开速度的手段

    1.减少页面HTTP请求数量 2.使用CDN(Content Delivery Network)网络加速 3.添加文件过期或缓存头 4.服务器开启gzip压缩 5.css格式定义放置在文件头部 6.J ...

  6. JQuery操作attr、prop、val()/text()/html()、class属性

    1.1 arr操作   设置单个属性 // 第一个参数:需要设置的属性名 // 第二个参数:对应的属性值 // $obj.attr(name, value); // 用法举例. $('img').at ...

  7. ping、网络抖动与丢包

    基本概念: ping: PING指一个数据包从用户的设备发送到测速点,然后再立即从测速点返回用户设备的来回时间.也就是俗称的“网络延迟”   一般以毫秒(ms)计算   一般PING在0~100ms都 ...

  8. flex弹性布局没有生效

    display: -webkit-flex; /* 新版本语法: Chrome 21+ */ display: -webkit-box; /* 老版本语法: Safari, iOS, Android ...

  9. 使用原生Ajax进行用户名重复的检验

    title: 使用原生Ajax进行用户名重复的检验(一) date: 2019-01-21 17:35:15 tags: [JavaScript,Ajax] --- Ajax的复习 距离刚开始学aja ...

  10. 0基础入门学习Python(第1-2章)

    第一章:就这么愉快的开始吧 1.1获取Python Python3.7 1.2从idle启动 Python 3.7.3 (default, Mar 27 2019, 09:23:39)[Clang 1 ...