# 导入selenium模块中的web引擎
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from pyquery import PyQuery as pq
# 时间 下载工具包
import time, wget, os
class Network(object):
def __init__(self, url, seconds=10):
# 这个是一个用来控制chrome以无界面模式打开的浏览器
# 创建一个参数对象,用来控制chrome以无界面的方式打开
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_argument('--headless') # 设置Chrome为无头模式
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('blink-settings=imagesEnabled=false')
options.add_argument('--disable-gpu')
# 建立浏览器对象 ,通过Phantomjs
self.browser = webdriver.Chrome(options=options)
self.url = url
# 发起请求
self.browser.get(url)
time.sleep(3) # 等待3s
# 等待一定时间,让js脚本加载完毕
self.browser.implicitly_wait(seconds) # seconds 隐式等待
# 静态文件,图片地址
cur_dir = os.path.split(os.path.realpath(__file__))[0]
self.static_src = os.path.abspath(cur_dir + '/./../static/')
# 常用变量 页面源码,挂载在jq上
self.JQuery = pq(self.browser.page_source)
# 浏览器器对象
def bom(self):
return self.browser
# 关闭浏览器
def close_browser(self):
self.browser.quit()
# 模拟浏览器抓取数据主业务 重构 返回浏览器对象
def main(self, url='', seconds=20):
# 访问url
if url == '':
url = self.url
self.browser.get(url)
time.sleep(3) # 等待3s
# 等待一定时间,让js脚本加载完毕
self.browser.implicitly_wait(seconds) # seconds 隐式等待
#页面源码 页面源码,挂载在jq上
self.JQuery = pq(self.browser.page_source)
return self.browser
# 如果列表的长度为1强制转换为字典
def list_or_dict(self, arr):
if len(arr) == 1:
return arr[0]
else:
return arr
# 通过tagName获取对象
def tag_name(self, tag_name):
return self.list_or_dict(self.browser.find_elements_by_tag_name(tag_name))
# 通过id获取对象
def id(self, id):
return self.browser.find_element_by_id(id)
# 通过className 获取对象
def class_name(self, class_name):
return self.list_or_dict(self.browser.find_elements_by_class_name(class_name))
# 通过a标签href属性获取对象 用链接文本定位超链接
def href_name(self, href_name):
return self.list_or_dict(self.browser.find_elements_by_partial_link_text(href_name))
# css选择器定位
def css_selector(self, css_selector):
return self.list_or_dict(self.browser.find_elements_by_css_selector(css_selector))
# find 定位选择
def find(self, element, name):
if element.find_elements_by_css_selector(name):
return element.find_elements_by_css_selector(name)
# 获取元素的属性
def attr(self, element, attr_name):
if isinstance(element, list):
arr = []
for e in element:
arr.append(e.get_attribute(attr_name))
return arr
else:
return element.get_attribute(attr_name)
# 获取元素的文本
def text(self, element):
if isinstance(element, list):
arr = []
for e in element:
arr.append(e.text)
return arr
else:
return element.text
# 获取页面body数据
def get_body(self):
# 返回body对象
return self.tag_name('body')[0]
# 下载文件,图片等
def download(self, urls, dir=''):
# 判断url的数据属性
if isinstance(urls, list):
for url in urls:
# 下载文件参数 文件url 保存的地址
f_name = url.split('/')[-1]
if dir != '':
wget.download(url, os.path.abspath(dir + '/' + f_name))
else:
wget.download(url, os.path.abspath(self.static_src + '/' + f_name))
else:
# 下载文件参数 文件url 保存的地址
f_name = urls.split('/')[-1]
if dir != '':
wget.download(urls, os.path.abspath(dir + '/' + f_name))
else:
wget.download(urls, os.path.abspath(self.static_src + '/' + f_name))
return True
# 调用
# 设置访问的url url = "https://www.runoob.com/python3/python3-namespace-scope.html" # 初始化实例 net = Network(url) ths=net.JQuery.find('.table_wrapper-table thead th').items() trs=net.JQuery.find('.table_wrapper-table tbody tr') trs_len=trs.length # 临时变量 存储 key名称