Commit 86b72a81 by “安晓东”

第18次作业

parent 04f6600c
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from threading import Thread
from remote_selenium.jingdong import jingdong
# 用来写业务逻辑
def to_baidu(name, server_adderss):
print(name + "启动")
driver = webdriver.Remote(
command_executor=server_adderss,
desired_capabilities=DesiredCapabilities.CHROME
)
driver.get("https://www.jd.com")
# 如果是Linux,那么启动访问thindpad的逻辑
if name == "linux":
jingdong.thinkpad_start(driver)
# 如果是Windows,启动访问Dell的逻辑
if name == "windows":
jingdong.dell_start(driver)
# 存储所有的远程服务地址
data = {
"linux": "http://192.168.0.106:4444/wd/hub",
"windows": "http://192.168.0.101:4444/wd/hub"
}
threads = []
for name, url in data.items():
t = Thread(target=to_baidu, args=(name, url))
threads.append(t)
for t in threads:
t.start()
import time, os
from selenium.webdriver.common.action_chains import ActionChains
from remote_selenium.jingdong.mycookies import *
from remote_selenium.jingdong.mysql_db import save_info_to_mysql
def login(driver):
driver.get("http://www.jd.com")
# 浏览器最大化
# driver.maximize_window()
# 设置固定的浏览器的大小
# driver.set_window_size(1920,1080)
driver.find_element_by_class_name("link-login").click()
driver.find_element_by_link_text("账户登录").click()
time.sleep(2)
driver.find_element_by_id("loginname").send_keys("an5456")
driver.find_element_by_id("nloginpwd").send_keys("dong19871103")
driver.find_element_by_id("loginsubmit").click()
save_cookies(driver)
def to_goods_page(driver, name):
# 回到首页的页面
driver.get("https://www.jd.com")
# 定位到电脑上
computer_element = driver.find_element_by_link_text("电脑")
# 鼠标悬停在电脑上
ActionChains(driver).move_to_element(computer_element).perform()
# 点击笔记本
time.sleep(2)
driver.find_element_by_link_text("笔记本").click()
time.sleep(2)
# 切换句柄
handles = driver.window_handles
index_handle = driver.current_window_handle
for hendle in handles:
if hendle != index_handle:
driver.switch_to_window(hendle)
if name == 'thinkpad':
# 点击ThinkPad
driver.find_element_by_xpath("//*[@id=\"brand-11518\"]/a").click()
if name == 'dell':
time.sleep(3)
driver.find_element_by_xpath("//*[@id=\"brand-5821\"]/a").click()
# 点击7000以上
driver.find_element_by_xpath("//*[@id=\"J_selectorPrice\"]/div/div[2]/div/ul/li[7]/a").click()
# 点击评论数
driver.find_element_by_xpath("//*[@id=\"J_filter\"]/div[1]/div[1]/a[3]").click()
# 点击第一款电脑
driver.find_element_by_xpath("//*[@id=\"plist\"]/ul/li[1]/div/div[1]/a/img").click()
# 切换句柄
notebook_handler = driver.current_window_handle
# 必须重新获取一下handles,因为这里已经有个3个窗口了
handles = driver.window_handles
for hendle in handles:
if hendle != index_handle and hendle != notebook_handler:
driver.switch_to_window(hendle)
# # 滑动滚轮
js = "window.scrollTo(0,400)"
driver.execute_script(js)
# 点击规格与包装
driver.find_element_by_xpath("//*[@id=\"detail\"]/div[1]/ul/li[2]").click()
# 获取规格与包装的信息
info_elements = driver.find_elements_by_class_name("Ptable-item")
# 解析所有的标签
result_list = []
# 保存这些信息到文件中
for info_element in info_elements:
# 获取到每一行的笔记本的配置信息
info_element_dict = get_info_element_dict(info_element)
result_list.append(info_element_dict)
# 保存这些信息到文件中
save_goods_info(result_list)
# 保存信息到MySQL中
save_info_to_mysql(result_list)
def get_info_element_dict(info_element):
# 拿到第一列的信息,就是计算机的组成信息
computer_part = info_element.find_element_by_tag_name("h3")
# 获取计算机信息中的key值
computer_info_keys = info_element.find_elements_by_tag_name("dt")
# 获取计算机信息中的values值 contains是包含函数
computer_info_value = info_element.find_elements_by_xpath("dl//dd[not(contains(@class,'Ptable-tips'))]")
# 存储计算机信息中的key和value
key_and_value_dict = {}
# 用来存储所有的计算机组成信息的字典
parts_dict = {}
for i in range(len(computer_info_keys)):
key_and_value_dict[computer_info_keys[i].text] = computer_info_value[i].text
parts_dict[computer_part.text] = key_and_value_dict
return parts_dict
def save_goods_info(result_list):
project_path = os.path.dirname(os.getcwd())
file_path = project_path + "/goods_infos/"
if not os.path.exists(file_path):
os.mkdir(file_path)
with open(file_path + "computers.infos", "a", encoding='utf-8') as f:
f.write(str(result_list))
print(result_list)
def to_start(driver, name):
try:
# 用一个循环状态来控制是否登录成功
loop_status = True
while loop_status:
# 检验cookies是否生效
login_status = check_cookies(driver)
if login_status:
loop_status = False
else:
print("cookies没有生效")
login(driver)
to_goods_page(driver, name)
finally:
time.sleep(20)
driver.quit()
def thinkpad_start(driver):
to_start(driver, "thinkpad")
def dell_start(driver):
to_start(driver, "dell")
import os, time, json
# 获取cookies的存储路径
def get_cookies_dir():
project_path = os.path.dirname(os.getcwd())
file_path = project_path + "/cookies/"
if not os.path.exists(file_path):
os.mkdir(file_path)
return file_path
# print(get_cookies_dir())
# 获取并且保存cookies
def save_cookies(driver):
file_path = get_cookies_dir()
# 保存cookies到文件中
cookies = driver.get_cookies()
with open(file_path + 'jd.cookies', 'w') as c:
c.write(json.dumps(cookies))
def check_cookies(driver):
# 设置一个登录状态,初始值是未登录
login_status = False
# 讲cookies信息保存到driver中
driver = save_cookies_to_driver(driver)
# 进行跳转链接的检测
driver.get("https://order.jd.com/center/list.action")
current_url = driver.current_url
if current_url == 'https://order.jd.com/center/list.action':
login_status = True
print("登录成功,cookies验证通过")
return login_status
else:
print("登录失败")
return login_status
# 保存cookies信息到driver中
def save_cookies_to_driver(driver):
cookies_file = get_cookies_file()
jd_cookies_file = open(cookies_file, "r")
jd_cookies_str = jd_cookies_file.readline()
jd_cookies_dict = json.loads(jd_cookies_str)
# 这里必须清除旧的cookies
driver.get("https://www.jd.com")
driver.delete_all_cookies()
for cookie in jd_cookies_dict:
driver.add_cookie(cookie)
return driver
# 获取保存cookies文件
def get_cookies_file():
return get_cookies_dir() + "jd.cookies"
import pymysql
import os
def save_info_to_mysql(info_list):
try:
# 获取链接
db_connection = get_connection()
# 获取游标
cursor = db_connection.cursor()
# 书写sql
for info in info_list:
for key,value in info.items():
sql = "insert into goods(computer_part_name,computer_info) values(\"%s\",\"%s\")"%(key,value)
print(sql)
# 执行sql
cursor.execute(sql)
# 提交sql
db_connection.commit()
# 关闭链接
finally:
close_db(db_connection, cursor)
def get_connection():
db_connection = pymysql.connect(
host="localhost",
user="root",
password="test123456",
database="python_ai_basic",
charset="utf8",
cursorclass=pymysql.cursors.DictCursor
)
return db_connection
def close_db(db_connecting, cursor):
cursor.close()
db_connecting.close()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment